FreelyApps

個人によるアプリ開発の日記です。アプリの収入だけで生活できるようになるのが目標です。UnityでAndroid向けのゲームアプリを作成しています。


    ブログを
    https://freelyapps.net/
    に移転する予定です。
    リンク切れがある記事はこちらに移動した可能性もあります。

    カテゴリ:Unity > Script

      このエントリーをはてなブックマークに追加 Clip to Evernote
    List<T>クラスは非常に便利なクラスです。配列のように大きさが決まっていないので、要素が増えたり減ったりするものを扱うのに適しています。
    トランプゲームを作るときにカード一つ一つにint型のIDを割り当てています。一度に複数のカードを出すといったときにList<int>で複数のカードを表すと扱いが簡単です。リストの分だけ処理をforeachで行えば良いからです。

    Listを使うときに失敗したことをメモしておきます。たまに「あれ、どうなってるんだっけ?」となるもので、先日テストコードを書きました。

    1.Listを引数に渡したとき、内部で要素を足したり消したりすると影響が残る
    このスクリプトをUnityで適当なゲームオブジェクトにアタッチしてみた結果は次のようになりました。
    printListTest
    見てもらえば大体わかると思いますが、ListAddやListRemoveに渡したリストの内容が変わります。List<T>はクラスなので、参照型ということですね。参照型を引数に渡したときの挙動は気を付けないと、バグになりやすいです。

    2.リストのループ内でリストを変更してはいけない
    このスクリプトをUnityで適当なゲームオブジェクトにアタッチしてみた結果は次のようになりました。
    printListTest2
    この例は実行するとエラーを起こしますが、コンパイルは通ります。これはforeachループ内でリストに変更をしていることが問題です。(list.Remove(2)のところです。)
    実行すればわかるバグですが、この例よりも複雑なことをする場合には意外と気づきにくいバグになります。
    リストの要素を一つずつ検査していって、ある条件になっているものを除きたいというときに同じループ内で決してしまうということをやってしまうとエラーになります。RemoveAllメソッドを使うか、いったん削除対象を別のリストに入れてからそのリストのループ内で元のリストの要素を消していくことになります。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Unity5.4以前ではAnalyticsのメソッドには以下の
    public static AnalyticsResult CustomEvent(string customEventName, IDictionary<string, object> eventData);
    という形式でカスタムイベントが発生したことを伝えていました。
    この形式しかなかったので、カスタムイベントに付随するパラメータがない場合は、eventDataにnullを渡し
    Analytics.CustomEvent("something" , null);
    というようにしていました。
    見た目からしてもnullを置くのは変な感じですが、これでうまくいっていたのです。 

    Unity5.4.0f3にしたところ、パラメータなしのカスタムイベントでエラーが発生しました。(NullReferenceExceptionが発生するので、とても危険です。Unityはこのエラーが発生しても落ちないのですが、ふつうは落ちます。なぜか処理が一部飛ばされて動き続けるようです。)
    ce_nre


    5.4では、Analyticsクラスに以下の2つのカスタムイベント用のメソッドが追加されています。
    public static AnalyticsResult CustomEvent(string customEventName); 
    public static AnalyticsResult CustomEvent(string customEventName, Vector3 position); 
    パラメータなしのカスタムイベントは上の引数が1つだけのものを呼び出すとエラーがなくなりました。おそらくこの対応で問題ないと思います。
    下の位置を渡すものはヒートマップに使うと思われます。 

      このエントリーをはてなブックマークに追加 Clip to Evernote
    Pokémon GO(ポケモンGO)が配信され、日本中で遊ばれていると思います。このPokémon GOがUnityで作られているらしいので、どのようにして作られているのか考えています。(あくまでそれっぽいものを作るにはどうしたら良いかというものです。)Pokémon GOっぽいものとは、Pokémon GOを作ろうとしてできあがる妥協の産物のことです。

    まずPokémon GOがどんなゲームなのかを特徴を挙げてみる必要があります。
    • 位置情報を利用している
    • 現実の地図を簡易的に表示
    • 地図上にデータを配置
    • ARを利用し、ポケモンを現実の背景に配置
    特徴的なのはこんなところでしょうか?

    位置情報は端末がGPSを利用する機能を持っているAndroidとiOSであれば、LocationServiceを利用すれば取得できます。LocationService.Startにサンプルコードが載っているので、これは実に簡単に利用できます。必要な情報は緯度(latitude)と経度(longitude)です。自分の向いている向きはこれだとわからないので、他の方法が使われている気はします。

    緯度と経度が分かれば現在地点が特定されるので、周辺の地図データを取得しそれを描画するということができます。緯度と経度が変化すれば、データを更新するということです。データはサーバー側に保存するため、クライアント側の実装にはあまり関係がありません。(サーバー側はここが最も大変だと思いますけど……)

    ARについてはおそらく単純です。カメラを有効にしてそれを背景にしているだけだと思います。WebCamTextureを使えばカメラが撮っているものをテクスチャとして取得できるので、それを背景にすれば良いです。端末を移動させるとポケモンが現れるということを行うには、加速度センサー(Input.acceleration)を使ってカメラの向きを変えれば良いです。

    「Pokémon GOを作る」ためにはデータを作ることが最も大変であると思います。全世界の地図上にデータを置いていくというのは気の遠くなるほどのデータ作成になるでしょう。(ユーザーにデータを置かせて運営で判断する方法はとても賢い方法だったと思います。それでも初期のプレイ用データは作る必要がありますが。)

    「Pokémon GOを作る」ことは可能だと思いますが、作っても意味はない気がします。 それは位置情報を利用したゲームは常時起動しっぱなしで移動するため、2つのゲームを起動することはないからです。(メモリ使用の都合上2つ起動すると、おそらくはどちらかがメモリから消されるでしょう。)
    位置情報を利用したゲームを作ると、Pokémon GOに勝てるほどのものでないと遊ばれることはないでしょう。

    「Pokémon GOを作ろう」となったら、「まあ、Pokémon GOでもやって落ち着け」と言いましょう。遊ぶ方が楽しいですから。

    このページのトップヘ