ゲームの実装方法を考える
新しい技術を覚えていくのも大切ですが、自分ができることの中で実装していくことをお勧めします。学びと実装を同時に行うと完成まで時間が掛かり、モチベーションが下がりやすくます。完成までたどりつけない確率も多くなります。
出来ると思っていたことでも完成までには何かしらトラブルは起きるものです。思うように動かないときは調べる必要があり。自分ができると思っていたことでも時間が掛かるものです。なおさら自分のできる範囲で実装方法を考えるべきだと思っています。
スキルを身に着けたいときは別でプロジェクトを立ち上げ、そこで学習した方がいいです。ソースや素材の管理がシンプルになることで学ぶことに集中できます。
さて、今回は果物が走っているシーンを作ろうと思います。実際に走らせることもできますが、私は背景を動かして、果物が走っているとみせかける方法を採ろうと思います。こちらの方が背景を動かすだけなので実装が簡単です。
衝突する紐については、実装するのが難しそうだったので、まるたを吹き飛ばす仕様に変更しようと思います。内容としては2本の丸太を並べて、果物が接触した時に、各丸太がそれぞれ別の方向に飛んでいくことにします。それで、果物が丸太を吹き飛ばすという表現にします。
オブジェクトの配置
私の基本的なHierarchyはこのようになっています。特徴的なのがGameDirectorを作ることです。ここにScriptは集約しています。
またゲームで使用する定数についてはResourcesのなかにScriptableObjectを作成し一括で管理してます。使用するクラスごとに分けることでわかりやすくしています。レベルデザインの際はこの定数を変更することでプレイしながら調整できるようにしています。
クラスの構成
namespace Assets.Myscripts.BaseUtil
{
public abstract class BaseMono : MonoBehaviour, I_BaseMono
{
public abstract void CycleDisp();
public abstract void CycleSt();
public abstract void Init();
}
}
私のクラスはこの独自で作ったBaseMonoをもとにスクリプトを作成しています。ゲームは様々な状態が連携して大きなシステムを作っています。そのために必ず利用するものを基底クラスとしています。
Initは初期化時に一回のみ実行。CycleStは状態を変化させる条件のみを書きます。CycleDispは状態をもとに実行する処理を書いていきます。
public override void Init()
{
fieldCtrl = gameObject.GetComponent<FieldCtrl>();
fieldCtrl.Init();
fruitsButtonCtrl = gameObject.GetComponent<FruitsButtonCtrl>();
fruitsButtonCtrl.Init();
}
public override void CycleSt()
{
fieldCtrl.CycleSt();
fruitsButtonCtrl.CycleSt();
}
public override void CycleDisp()
{
fieldCtrl.CycleDisp();
fruitsButtonCtrl.CycleDisp();
}
これをGameDirectorのクラスが実行することでシステムを構成しています。状態遷移と実行を別にするのを厳守しています。また遷移条件と実行をクラス内でまとめることでクラスの独立性を保っています。