AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

Unity2Dの練習

UIも2Dモードでやってましたが、現在は2Dモードの勉強中です。

unitychan2Dモデルに、スーパーマリオみたいなサンプルゲームが付属してるのでコードを読んだりして勉強してました。

f:id:yasu9780:20150529235929p:plain


ウニにぶつかるとユニティちゃんが飛ばされてダメージを受け、次に点滅した無敵モードに移りますが、コード的にはこんな感じで

public Vector2 backwardForce = new Vector2(-4.5f, 5.4f);
m_rigidbody2D.velocity = new Vector2(transform.right.x * backwardForce.x, transform.up.y * backwardForce.y);

 unitychanの向きに合わせて、right側の単位ベクトル(距離1)にマイナスの座標を掛けることで、逆向きに力を加えることで、吹っ飛んでいる。


 全体的には、壊せるブロックの衝突には、colliderの下の部分との衝突を見ていたり、(地面設置も、上と下で分けて考える必要がある)
 このへんは、ブロックに対して、colliderを上下で2つ設定するのがわかりやすいと思います。

 ブロックに関しては、下でジャンプすると壊れますが、コード的には、壊れるタイミングで、壊れるブロックを、prefabから生成してました。
 しかも、そのブロックは4つに分割して子供に登録されていて、壊れる時に、addForceして四方に飛ぶような処理が入ってました。

private Rigidbody2D[] rigidbody2Ds;
rigidbody2Ds = GetComponentsInChildren<Rigidbody2D>();

 ブロックが別れた4つの子供をまとめて配列に読み込む処理。こういう書き方もできるんですね。


 コインはcollider衝突で消えるだけです(gold追加とチャリンと音が出る)


 あと、スタート、ロード、ゲームの面を別のsceneにしてますが、sceneが別れると情報共有はどうするのかって問題があります。スコアとかタイムとか。
(このサンプルは面が1つなので、情報共有してない)

 基本的に、次のような選択肢があるようですが、
①static宣言された変数は、アプリが終了まで生存する
②DontDestroyOnLoad(obj);
 を実行すると、objというGameObjectはsceneを切り替えても生存する
③PlayerPrefs.SetIntを使う

 そもそもsceneを分けないという選択肢もありますよね。
 どこかのゲーム会社のスライドにも、モバイル環境の負荷を考えるとsceneを分けるのは得策じゃないって書いてありました(オーバーヘッドが凄いらしい)
 同様に、prefabも、destroyはせずに、使いまわすほうがいいと。
 メモリ断片化するとGCも起きるでしょうし、いらなくなったらdestroyはわかりやすいですが、できるだけ再利用するべきかと。
 特にモバイル


上記の①は、下記のようにシングルトンになるように管理者を用意すれば
複数シーン間で永続する

public class GameManager : MonoBehaviour {
  public static GameObject instance=null;
  void Awake()
  {
    if(instance == null)
      instance = this;
    else if(instance!=this)
      Destroy(gameObject);
    DontDestroyOnLoad(gameObject);
  }
}

これで初回生成されたGameManagerはinstaceが永続し、GameObjectも永続するが、
二回目以上の生成では、GameObjectがDestroyされて、初回生成のObjectが継続利用される(はず)