UIも2Dモードでやってましたが、現在は2Dモードの勉強中です。
unitychan2Dモデルに、スーパーマリオみたいなサンプルゲームが付属してるのでコードを読んだりして勉強してました。
ウニにぶつかるとユニティちゃんが飛ばされてダメージを受け、次に点滅した無敵モードに移りますが、コード的にはこんな感じで
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が継続利用される(はず)