週刊SleepNel新聞

SleepNel所属のぽうひろが日々の個人開発で気になったことを綴ります。

TheLongDarkプレイ実況 2日目前半戦 配信しました!

みなさん、こんにちは。ぽうひろです。

TheLongDarkプレイ実況 2日目前半戦をYouTubeにて配信しました!

ぜひ、おヒマな時にでもご覧下さい(*´∀`)

ミスで音声がありません・。。。ナレーションはつけてますが。。。


ロングダーク2日目 ゲーム実況

このゲームは、結構音が大事なので、無念です。

オオカミやクマが近くにいるかを検知したり、カラスの鳴き声は動物や人間の死体の場所の手がかりにもなるし、建物の中で外の風の音を聞いて、嵐かどうかを確認したり。

次はしっかり入るようにしたいと思います。

それではまた!

TheLongDarkプレイ動画配信+進捗のお知らせ

こんにちは、ぽうひろです。

先日からロングダークのプレイスクショをあげていましたが、やはり伝わりにくいなぁ・・・ということで、、、、、

生中継はできなくとも、プレイ動画を撮ってナレーションをつけ、YouTubeにアップするスタイルにチャレンジしていこうと思います!!
f:id:pouhiroshi:20170203102027p:plain:w400


というわけで、最初からスタートしたロングダークプレイをこちらの「ぽうチャンネル」でお楽しみいただけます!
youtu.be

チャンネル登録していただければ、更新通知が届きますので、是非是非登録をお願いします〜!

1日目は湖エリアに放り込まれます。服も足りない、マイナス13度の世界です((((;゚Д゚))))サムー

自分の居場所を確認し、拠点のキャンプオフィスへ向かう動画になっております。
ぜひ、おヒマな時にでもお楽しみを(*´∀`)

                            • -

さて、ここからは開発状況のお知らせです。

アーバンナックル・Sの開発状況ですが、ほぼゲーム要素は出揃いました。

細かい部分を仕上げていく感じなのですが、なかなかプレイ実況に忙しくて進捗が思わしくありません。

自分の尻を叩くためにもリリース日を2/17(金)と表明したいと思います!!

最近、杏z(@AnzNetJp)さんが個人開発者同士のリリースがかぶらないようにということで、とっても素敵なカレンダーを用意してくれました!!
https://anzfactory.github.io/#!/developer/calendar

ん?

f:id:pouhiroshi:20170203101436p:plain


。。。


さて、そういうことで、頑張ってリリースできるように詰めていきますよ!!

それではまた!!!

The Long Dark日誌 3日目

みなさん、こんにちは。ぽうひろです。

 

The Long Dark日誌 3日目です。

昨日はガマを大量にゲットし、変なマスクを手に入れました。 

sleepnel.hatenablog.com

 準備も整ったので、再び湖に出かけます!
湖の周りに点在する小屋を物色しに行きます!

キャンプオフィスを出て右へ行けばすぐ湖です。天気がよろしい^^

f:id:pouhiroshi:20170201211603j:plain

見た感じ、オオカミさんはいないようです!!よかった!

f:id:pouhiroshi:20170201211616j:plain

小屋が見えてきました!

f:id:pouhiroshi:20170201211627j:plain

あれ、あの遠くに見える点はオオカミさんじゃありませんか、もしかして・・!!

f:id:pouhiroshi:20170201211635j:plain

ウーウー唸ってる!!発見された!
フレアで追っ払うぞ!!(ドキドキ

f:id:pouhiroshi:20170201211641j:plain

なんとかやり過ごしましたが、気付いたら周辺に3匹くらいオオカミがいます。。。ちょっと左側から遠回りしていこう・・・・すでにお家に帰りたい;;

f:id:pouhiroshi:20170201211650j:plain

ん?
あの遠目に見えるのは。。。。

f:id:pouhiroshi:20170201211651j:plain

クマさんだ〜〜!!!🐻

調べたところによると、クマさんはフレアで撃退できないらしいので、ここは通れません。。。。。無念ですが、別ルートで引き返すことにしましょう。。。

ちょっと凍傷にかかりそうになったので、屋外で初焚き火です。

f:id:pouhiroshi:20170201211654j:plain

と、ここで思わぬ事件が!!!

マキを足そうと思ったら、なんと焚き火に突っ込んでしまい、まさかの大やけど!!!(左下ステータス

f:id:pouhiroshi:20170201211659j:plain

あああ、もう瀕死です・・・・帰るしかない・・・・!!
ギリギリ残りHP14%でお家に到着!!

f:id:pouhiroshi:20170201211703j:plain

包帯と薬で火傷を治療します。。。。踏んだり蹴ったりだ。。。。;;

f:id:pouhiroshi:20170201211707j:plain

 

とまぁ、今日はオオカミの大群、クマ、さらには焚き火による火傷(自業自得)で、災難な日でした。。。。 けれど、まだ生きてる・・・!!
オオカミ追っ払ったし、クマの姿も見たので良い経験になりました!

また明日、湖にチャレンジしたいと思います!

それではまた!!! ウワァァ-----。゚(゚´Д`゚)゚。-----ン!!!!

The Long Dark日誌 2日目

みなさん、こんにちは。ぽうひろです。

The Long Dark日誌 2日目です。


昨日は拠点のキャンプオフィスにたどり着きました。

sleepnel.hatenablog.com

 

今日は湖を探索しようと思います。

 

夜明けとともに起きて外に出ましたが、朝は超寒い!
気温が上がるまで、本でも読みます。
釣りの本などもあり、暇な時読んでスキルを上げておくとサバイバルが楽になります。

f:id:pouhiroshi:20170131212013j:plain


さて、3時間経ったので出掛けます!

f:id:pouhiroshi:20170131211851j:plain

手に持っているのはフレア(発火筒)です。
まだ武器がないので、襲われたらフレアで追い払うのです!(未経験)

小屋を出て右側の湖へ出発!!

f:id:pouhiroshi:20170131211930j:plain

湖の周辺には「ガマ」という植物が生えています。
この茎は「調理なし」で食べられ、穂は火を起こす時の「火口」になります。とっても貴重なアイテムです。ゲットしまくります。


湖の釣り小屋が点在しています。アイテムあるかな〜 

f:id:pouhiroshi:20170131211937j:plain


手斧ゲット!これでいろいろ壊せます。ナイス!

f:id:pouhiroshi:20170131211951j:plain

 

さらに、変なマスクゲット!
犯罪者に見えるけど、暖かいそうです。人はいないのでかまってられません。

f:id:pouhiroshi:20170131211945j:plain

 
お、第一村人ならぬ第一鹿を発見!
しかし弓矢も銃もないので、指をくわえて見ているしかありません。。。いつか対決せねば・・・

f:id:pouhiroshi:20170131213046j:plain

 

時間がなかったので小屋を回れませんでしたが、燃料いっぱい集めてきました! 

f:id:pouhiroshi:20170131212023j:plain



途中、空腹の音がオオカミかと思って紛らわしい、、(^_^;)

今日は湖に狼はいませんでした。よかったよかった・・・
フレア使う練習しとかなきゃ・・・・


明日はまた湖に行って、釣り小屋以外の建物を探索します!!

 
最後に、今の格好はこんな感じですw

f:id:pouhiroshi:20170131213708j:plain

これはなかなかの犯罪者w

それではまた!!

The Long Dark日誌 1日目

みなさん、こんにちは。ぽうひろです。

 

f:id:pouhiroshi:20170130213209j:plain

いまsteamのゲームではまってる「The Long Dark」のプレイ日誌をつけていきたいと思います。

 

本来なら実況をしたいところなんですが、やっているのがmacbookproなのと、やる時間も場所も限られているので、スクショベースでやっていきたいと思います(^_^;)

 

これをみてやってみよう!と思ってくれる方が出ていたたければうれしいです\(^o^)/
ロングダークはsteamでα版公開中です。どんどんアプデされると思うので、今のうちに練習しましょう!w

store.steampowered.com

 

 では始めていきたいと思います。

燦然と輝く「Made With Unity」!!

f:id:pouhiroshi:20170130213246j:plain

 

ゲームモードはノーマルにあたる「運び屋」です。

f:id:pouhiroshi:20170130213310j:plain

このモードはオオカミとか熊が襲ってくるので怖いんですクマ、、、!!

場所はイージーモードで少し練習した湖近辺にしますよ!

f:id:pouhiroshi:20170130213353j:plain

 

ではゲームスタート!

f:id:pouhiroshi:20170130213407j:plain

 そうです。どれくらい生き延びることができるか。。。これがこのゲームの目的です。

 

f:id:pouhiroshi:20170130213445j:plain

なんか妙なところにスポーンしました。どこだここは、、、

 

イージーモードで少し土地勘はありますが、いきなり放り込まれるとわかりませんね、、、

 

f:id:pouhiroshi:20170130213511j:plain

あ、丸太がいっぱいある。

伐採小屋のあたりのようです、、、!!

 

f:id:pouhiroshi:20170130213534j:plain

トレーラーがありました。

服とかをゲットしていきます。寒くて死にそうだよ、、、

f:id:pouhiroshi:20170130213608j:plain

まだまだ装備が足りません・・・・

 

風防付きランプをゲット!暗闇ではこれがないときついです。

f:id:pouhiroshi:20170130214512j:plain

 

f:id:pouhiroshi:20170130213632j:plain

凍傷にかかっています。(左下)HP%がゼロになる前に拠点を見つけねば、、!!

 

途中で脱線した列車を見つけました。

f:id:pouhiroshi:20170130213650j:plain

 

めぼしいものはなさそうです、、、

 

f:id:pouhiroshi:20170130214329j:plain

 

何とかいつもの拠点にしているキャンプオフィスに到着しました、、!!よかった、、、

f:id:pouhiroshi:20170130213736j:plain

 

物資がそこそこあります。

f:id:pouhiroshi:20170130213752j:plain

水がないので、ストーブに火をつけ、雪を溶かし、さらに煮沸して飲料水を多めに作っておきます。

f:id:pouhiroshi:20170130213944j:plain

 

多めに作ったら、棚においておきましょう。

f:id:pouhiroshi:20170130214020j:plain

今日のサバイバルはここまでです、、!!

凍傷にかかっているので、本でも読んで時間を潰し、今日は寝てから、明日湖の方を探索したいと思います!

 

それではまた!

 

FirebaseをUnityで使ってランキング機能を作ろう![実装編]

みなさん、こんにちは。ぽうひろです。

f:id:pouhiroshi:20170125234924p:plain

前回はFirebaseをUnityで使うための準備について説明しました。
sleepnel.hatenablog.com

今回は、簡単に実装方法を説明していきます。

前回、firebase側でアプリの設定を行いましたので、以下のconsole画面からデータベースなどを見ることができます。
https://console.firebase.google.com/

コンソールから作ったプロジェクトを選びます。
f:id:pouhiroshi:20170126000520p:plain:w400

左側のメニューにDatabaseがあるので選ぶと、データベースが見れます。
f:id:pouhiroshi:20170126000612p:plain:w400

firebaseのDBはこのようにjsonツリーになっていまして、consoleでGUIでデータを編集することができます。
f:id:pouhiroshi:20170126000929p:plain:w400

さて、まずUnityで使う前の準備が少し残っています。
FirebaseのRealtimeDatabaseには認証機能がありまして、基本はそれを使ってDB使用して良いかを判定します。これは別途SNS認証を使うとか、メール認証アドレスにするのかとか選択肢がありますので、またの機会にやろうと思います。
今回は開発モードとして、読み書き権限をOKにしちゃう設定にします。
firebase consoleのルールのタブにjson形式で設定を書きます。
以下のように rulesの.readと.writeをtrueにして「公開」ボタンを押せばOKです!
f:id:pouhiroshi:20170126092515p:plain:w400

あと、データベースのアドレスはここに書いてあるアドレスになります。
Unity側のコードで必要になります。
f:id:pouhiroshi:20170126092836p:plain:w400

ただしこの状態だと注意が必要です。
この状態だと、DB URLが他の人に知られてしまうと、好きなだけ読み書きできてしまうので開発中だけの設定と考えておいてくださいね!(僕ももうwrite権限offしてありますよ(*´∀`))

はい、今度こそ準備完了です。
それでは実装コードの方を説明します。

まずはデータ検索(参照)の方から説明します。
ドキュメントはこちらが参考になります。
Retrieving Data  |  Firebase

データ検索(参照)のやり方

using Firebase;
using Firebase.Database;
using Firebase.Unity.Editor;
public class Ranking : MonoBehaviour {
  //別メソッドのDB操作のためにprivateフィールドにとっておく
  private DatabaseReference timeRankDb;

  // Use this for initialization
  void Start () {
    //データベースURLを設定
    FirebaseApp.DefaultInstance.SetEditorDatabaseUrl("consoleに出てたDBのURL");
    // テーブル名的なノード名を指定して、DB参照をprivateフィールドにとっておく
    timeRankDb = FirebaseDatabase.DefaultInstance.GetReference("timeRanks");
    }
}

ざっくりポイントは、
using Firebase;
using Firebase.Database;
using Firebase.Unity.Editor;
と、データベースURLを指定してノード名(テーブル名的な)指定でDB参照を取る ところですかね。
UnityだとStartメソッドで1度実行しておくと良いと思います。

FirebaseのDBはjsonツリー状の構成となっています。
今回、ボスNoごとのクリアタイムランキングを実装したいと思いますので、構成は以下のように考えています。

root
   ∟ timeRanks
    ∟ ボスNo(1〜15個くらい)
      ∟ 記録ID (ボスIDごとに10個まで(10位まで表示したい))
         ∟  ユーザ名(name)
         ∟  タイム(time)

実際はこんな感じになってます。何となくわかるでしょうか?
f:id:pouhiroshi:20170126094434p:plain:w400

さて、まずはデータの取得をやってみたいと思います。
先ほどStart()で取得しておいたDB参照を利用してデータ参照します。

//bossNoのノードからtimeで昇順ソートして最大10件を取る(非同期)
timeRankDb.Child(boss.bossNo.ToString()).OrderByChild("time").LimitToFirst(10).GetValueAsync().ContinueWith(task =>{
  if(task.IsFaulted){ //取得失敗
    //Handle the Error
  }else if(task.IsCompleted){ //取得成功
    DataSnapshot snapshot = task.Result; //結果取得
    IEnumerator<DataSnapshot> en = snapshot.Children.GetEnumerator(); //結果リストをenumeratorで処理
    int rank = 0;
    while(en.MoveNext()){ //1件ずつ処理
      DataSnapshot data = en.Current; //データ取る
      string name = (string)data.Child("name").GetValue(true); //名前取る
      string time = (string)data.Child("time").GetValue(true); //時間を取る
      //順位のuGUIに値を設定
      GameObject rankItem = rankList.transform.GetChild(rank).gameObject;
      TimeRank timeRank = rankItem.GetComponent<TimeRank>();
      timeRank.SetText(rank+1, name, getTimeStr(time)); //順位1位から
      rank++;
    }
}
});

コメントにも色々書いていますが、ポイントとしては

  • データ検索はDatabaseReferenceを使って.Child("ノード名")、ソートしたかったら.OrderByChild("ソートキーに使う項目名")、取得件数絞りたければ.LimitToFirst(件数) をつなげていき、最後に.GetValueAsync().ContinueWith(task =>{ です。
  • 検索結果は非同期でtaskに返ってきます(コールバック)ので、task.IsCompletedの時、データの処理を行います。task.IsFaultedの時は通信エラーなどが想定されますので、エラーメッセージを出すみたいなハンドリングをしてもいいですね(*´∀`)
  • 検索結果はDataSnapshot snapshot = task.Result; で取れます。複数データの場合はsnapshot.Childrenに複数データが入りますので、GetEnumeratorで繰り返し処理するといいでしょう。
  • 1件のデータはDataSnapshotのChild("項目名").GetValueで取れます。object型になっているので(string)でキャストすると良いでしょう。(データ投入の際、floatとかで登録したかったのですが、どうもエラーが出る模様・・・続報あったら追記します)

結果、このような感じになりました(*´∀`)
f:id:pouhiroshi:20170126121408g:plain:w400

ちゃんと時間が早い順に取れてますね!

さて、次はデータ登録の実装を説明したいと思います。
ドキュメントはこちらが参考になります。
Save Data  |  Firebase

データ登録(insert&update)のやり方

//まずbossNoのノードにレコードを登録(Push)して、生成されたキーを取得(これを1件のノード名に使う)
string key = timeRankDb.Child(bossId.ToString()).Push().Key;
//登録する1件データをDictionaryで定義(nameとtime)
Dictionary<string, object> itemMap = new Dictionary<string, object>();
itemMap.Add("name", name);
itemMap.Add("time", time);
//1件データをさらにDictionaryに入れる。キーはノード(bossNo/さっき生成したキー)
Dictionary<string, object> map = new Dictionary<string, object>();
map.Add(bossId.ToString()+ "/" +key , itemMap);
//データ更新!
timeRankDb.UpdateChildrenAsync(map);

ここでのポイントは

  • データの登録はDbReference.Child("ノード名").Push()でやる。生成されたデータを表す一意キーを使うために.Keyでキーをとっておくと良い。
  • データの更新はDbReference.UpdateChildrenAsync(ノードがキーで値が更新したいデータのDictionary); で行う。

実際はこんな感じで登録されます!イメージ湧くでしょうか。
f:id:pouhiroshi:20170126122733p:plain:w400
この暗号みたいなのが生成されたキーで、データのパスは 1/-KbIyIe621y8MZ9ySB5S ということになります。

駆け足で説明しましたが、いかがでしたでしょうか。

私もまだあまり使いこなしているわけではないし、まだSDKもベータ版なので今後やり方など変わるかもしれませんが、何となく簡単に利用できることがお分かりいただけたんじゃないかと思います。

また何か情報があったら、書きたいと思います(*´∀`)

それではまた!!

FirebaseをUnityで使ってランキング機能を作ろう![導入編]

みなさん、こんばんは。ぽうひろです。
f:id:pouhiroshi:20170125234924p:plain

ただいまアーバンナックル・Sの絶賛開発中なのですが、
sleepnel.hatenablog.com

ランキング機能が欲しいなと思いまして、天下のGoogleさんのmBaas Firebaseを導入してみることにしました!

※実装編も書きました!
sleepnel.hatenablog.com


早速このアドレスからFirebaseを始めましょう!
https://firebase.google.com/?hl=ja

新規プロジェクトを作成ボタンを押します。
f:id:pouhiroshi:20170125230958p:plain:w400

Unityなんだけど、、、、メニューにないので、とりあえずAndroidを持っているのでAndroidアプリにFirebaseを追加を選びます。
f:id:pouhiroshi:20170125231039p:plain:w400

プロジェクト名と国を選びます。難しくないですね。
f:id:pouhiroshi:20170125231054p:plain:w400

パッケージ名とアプリのニックネームを入力します。パッケージ名はUnityのBuild Settingにも設定するBundle Identifierのことですね。
f:id:pouhiroshi:20170125231107p:plain:w400

すると、google-services.jsonなるファイルが勝手にダウンロードされます。これは後で使います。
f:id:pouhiroshi:20170125231133p:plain:w400

AndroidStudioのgradleの説明が出てきますが、Unityでは気にしなくて大丈夫です。
f:id:pouhiroshi:20170125231231p:plain:w400

はい、これで設定は完了です。簡単ですね!!
f:id:pouhiroshi:20170125231245p:plain:w400

では、ここからはUnity側の作業です。Unityは5.5.0を使っています。

FirebaseのUnitySDKはBeta版のようで、日本語ドキュメントがありません。
英語版のドキュメントはここになります。
https://firebase.google.com/docs/unity/setup
f:id:pouhiroshi:20170125232959p:plain:w400

このGet startedの中にUnity用packageが入ったSDKをダウンロードできるボタンがあるので、ダウンロードしましょう。
f:id:pouhiroshi:20170125233227p:plain:w400

中にはいろんなpackageが入っていますが、RealtimeDatabaseだけ使いたいなら、
FirebaseAuth.unitypackage(認証に使う)
FirebaseDatabase.unitypackage(DBをいじるSDK)
があれば良さそうです。
f:id:pouhiroshi:20170125233456p:plain

UnityのAssets > Import Package > Custom Package
で上記の2つのunitypackageをUnityプロジェクトにインポートしましょう。

その後、先ほどダウンロードしたgoogle-services.jsonをAssetsに入れておきます。場所はどこでもいいらしいですが、わかりやすいように先ほどのunitypackageをインポートした結果作成されたAssets/Firebase以下に放り込んでおきます。
f:id:pouhiroshi:20170125233956p:plain

さて、ここら辺で一度Unityを再起動しておくことをお勧めします。
(もしかしたらConsoleにビルドエラーが出ているかもしれません)
google-services.jsonがAndroidSDKと連携して、必要なライブラリをgradleを使ってダウンロードしてくれるみたいです。

導入はこれくらいです。特に難しいことはなく、簡単ですね!!

次回は、実際にRealtimeDatabaseに接続して、データ参照・登録などを説明したいとおもいます!

それではまた!!