週刊SleepNel新聞

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

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に接続して、データ参照・登録などを説明したいとおもいます!

それではまた!!

タスク管理Trelloの一括タスク作成機能を発見!

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

いつもタスク管理に使っているTrelloですが、このほど、一括タスク作成機能を(偶然)発見したのでご紹介します。

Trelloについてはこちらも御覧ください(*´∀`)
sleepnel.hatenablog.com

まずはタスクを箇条書きにして、普通にタスク作成欄に記入します。
(改行されていれば良いみたいです。)
f:id:pouhiroshi:20170116123547p:plain

追加ボタンを押すと、ダイアログが出て「カードをn枚作成する」か「1つで作成するか」の選択肢が出てきます!

これで、n枚の方を選べば・・・・
f:id:pouhiroshi:20170116123530p:plain

はい、タスクが別々に登録されました!!これは便利!!

週初めにこのように、今週のタスクを出しておくと時短にもなっていいですね!!

それでは、良い開発ライフを!!

アーバンナックル・S開発中!!

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

あ、あけましておめでとうございますをちゃんと言ってなかった気がする。

改めまして、

「あけましておめでとうございます」

本年もSleepNel(スリープネル)新聞をどうぞよろしくお願いいたします。

さて、今日はNintendoSwitchのプレゼンテーションが中継されていますので、
それを見ながら書いています。
インディーゲーム界にいいことがあると嬉しいな〜。

さて、私の方はと言いますと、正月休みは1/9まで長めにいただいておりまして、
横浜->大阪->和歌山(白浜)->大阪->三重(伊勢)->大阪->兵庫(芦屋)->大阪->横浜
と言う総距離1000km超えの実家(嫁)帰り&旅行に行っておりました。

あまり渋滞しなかったもので、距離はそこまで苦ではありませんでした。
なかなか行けない白浜や伊勢に行けたのはとてもいい経験になりました。

その間、開発がほとんどできなかったのが一番しんどかったですね・・・・
けどたのしかったです!

さて、今年は目標としては「収益にこだわる」をテーマにしていきたいと思います。

マジで無茶かもしれませんが「月イチでリリースする」を具体目標としてあげたいと思います。



(((((((( ;゚Д゚))))))))ガクガクブルブルガタガタブルブル



まぁ、できなくても何か失うこともないですし、気概として目指していきたいと思います。


さて、その一発目ですが、「アーバンナックル」をもちょっとお手軽に遊んでいただきたいなという思いから、

「アーバンナックル・S」

の開発に着手しました。
Sは「サバイバル」という思いで作ったのですが、今は
「スマッシュ!」みたいな感じがいいかなと思ってます。

こちらが開発5日目のスクリーンショットチラ見せですΣ(゚∀゚ノ)ノキャー
f:id:pouhiroshi:20170113125017p:plain

勘のいい方は、だいたいどういう感じか分かるんじゃないかと思いますw

うまくいけば2月初旬に出せるかなという感じです!

それではまた!!

SourceTreeを使ってUnityプロジェクトをgitで管理してみよう!

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

みなさん、Unityで開発をしていてプロジェクトが壊れてしまった!!
間違ってファイル削除してしまった! この修正やっぱやめたいけど、もうどうやってたか忘れた・・・
などの経験はないでしょうか?

そこでオススメしたいのが「Unityプロジェクトをgitに登録する」ことです!

よくわからないし敷居が高い、、、と思っている方も意外といるのではないかと思い、
ここで簡単な手順を残しておきたいと思います。
ご参考になれば幸いです。

まず下準備として、gitとSourceTreeというgitをGUIで操作できるソフトをインストールしておきましょう。

gitは以下の記事のhomebrewを利用してインストールしておくと良いです。
Gitではじめるバージョン管理 〜Gitをインストール for Mac OS X〜

SourceTreeはこちらから
SourceTree - Windows と Mac 対応 Git & Mercurial 無料クライアント | Atlassian


ここでは、使用PC:Macで、すでにUnityプロジェクトがある状態からの手順を書きたいと思います。
f:id:pouhiroshi:20161218151956p:plain
まず、cd で管理したいUnityプロジェクトの直下に遷移します。
そこでgit init というコマンドを実行します。

そして、SourceTreeで新規リポジトリを選び、既存のローカルリポジトリを選択し、先ほどのgit initしたディレクトリを選択します。
f:id:pouhiroshi:20161218153136p:plain

すると、先ほどのプロジェクトが出てくるようになります^^
f:id:pouhiroshi:20161218153720p:plain

さて、gitで有名なのは先ほどのSourceTreeを作っているAtlassianのBitBucket。
あとはgithubですね。
ここではgithubの例を書いていきますが、初めは無料で始められるBitBucketをお勧めします。

このYour Repositoriesの「New Repository」ボタンを押します
f:id:pouhiroshi:20161218154411p:plain

リポジトリ名を入れて、公開したくないのであれば「Private」にしてCreate RepositoryすればOK
f:id:pouhiroshi:20161218154449p:plain


リポジトリを作成すると固有のURLが発行されます。これをコピーしておきます。
f:id:pouhiroshi:20161218154536p:plain

SourceTreeの設定でURLに先ほどのURLを入力すれば連携完了です。
f:id:pouhiroshi:20161218154618p:plain

連携できるとこんな感じになると思います。
f:id:pouhiroshi:20161218154731p:plain



それではここからは、ソースをコミットする例を順を追って説明します。
まず、この状態ですが?となっていますが、これはまだgitにファイルが登録されていないことを意味しています。
gitはローカルとリモートで2段階保存のようなイメージになっており、わかりやすく言いますと、
まずローカルに保存(コミット)、それをリモートに保存(プッシュ)という感じになっています。
gitについての正しい知識は毒きのこさんのエントリーを是非ご覧ください!
tech.librastudio.co.jp


ファイルの横にあるチェックボックスにチェックすると、Indexにステージされた状態になります。(コミットのさらに1つ前の段階って感じですかね)
すると、下にコミットコメントを入力する欄が出てきますので、何かメモを残すと良いです。
f:id:pouhiroshi:20161218155241p:plain

コミットを直ちにプッシュするチェックをすると、コミットと同時にプッシュまでできます。
f:id:pouhiroshi:20161218155304p:plain
これでgitに保存が完了したことになります!

ところで、Unityプロジェクトをgit管理する時は、以下の内容を.gitignoreというファイル名で
コミットプッシュしておくと、余計なファイルを登録しなくて済むようになります。
このファイルは何を意味しているかというと、gitでこういう名前のファイルは管理しないよ(無視する)という指定をするためのファイルです。
Unityはtmpファイルなどを大量に作るのでそれらまで管理すると、大変になるので無視してしまった方が良いです。
.gitignore

/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/Assets/AssetStoreTools*
/TPS_cache/*

# Autogenerated VS/MD solution and project files
ExportedObj/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj

# Unity3D generated meta files
*.pidb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt
=======
*.svd

# Unity3D generated meta files
*.pidb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt

# Builds
*.apk
*.unitypackage


さて、次は何かプログラムを修正してみます。
f:id:pouhiroshi:20161218155338p:plain

修正した後、SourceTreeを見てみると、黄色いアイコンで修正したプログラムが表示されています。
右には差分がbefore,after表示されていますね!
f:id:pouhiroshi:20161218155352p:plain

さて、この修正。やっぱ、やーめたっていうことがgitで管理しているとできます。
ファイル名の上で右クリックして、メニューを表示し、「リセット」を選びます。
f:id:pouhiroshi:20161218155413p:plain

確認ダイアログが出ますのでOKを押します。
f:id:pouhiroshi:20161218155500p:plain

ほら、もとどおり!
f:id:pouhiroshi:20161218155526p:plain

次は、ファイルを間違えて削除してしまったとしましょう!
削除は-アイコンで表示されます。これもリセットで戻せます。
f:id:pouhiroshi:20161218155604p:plain

またファイル名の上で右クリックして、メニューを表示し、「リセット」を選びます。
f:id:pouhiroshi:20161218155624p:plain

確認ダイアログが出るのでOKを押します。
f:id:pouhiroshi:20161218155640p:plain

これで削除したファイルも元に戻ります!!

今回の例はコミット・プッシュしていないファイルをリセットで戻せるよという例でしたが、
コミット・プッシュしてしまうと、元に戻すのはそれなりの手順が入りますので、またの機会に・・・・w

あまり時間がなくて、雑な説明になっていますので、
落ち着いたらもう少し丁寧&詳細に書いてみたいと思います。

それでは良い開発ライフを!!