Unity で8番出口風ゲームを作る!#6
Unityでゲームを作る
Unity で8番出口風ゲームを作る!
Unity Version 2022.3.16
異変の作成
8番出口の"異変"には大きく2種類が存在する。1つは、通常時と比べテクスチャや大きさ、位置などが変わっているもの。もう1つは、血の海(?)などプレーヤーが逃げないとぶつかった時点でゲームオーバーになってしまうもの。今回は、簡単のためにテクスチャや大きさが変わるタイプの"異変"のみを実装する。
8番出口で異変を起こすオブジェクトには、ポスターや非常口、監視カメラなど色々なものがあるが、異変発生時はテクスチャや大きさ、位置などが通常状態とは"異なる"という点で共通である。そこで、異変を起こすオブジェクトの共通のBase クラスを作成し、そこから派生する形でさまざまな異変オブジェクトクラスを作成する。
IhenBase.cs
異変オブジェクトクラスのベースクラス。異変のあるなしをSetIhen メソッドを通して管理クラスから設定する。実際の異変箇所は各派生クラスによって変わるため DoIhen メソッドをabstract にして、派生クラス側で内容を実装できるようにする。
- abstract public class IhenBase : MonoBehaviour
- {
- protected bool _isIhen;
- public void SetIhen(bool isIhen)
- {
- _isIhen = isIhen;
- if (_isIhen)
- {
- DoIhen();
- }
- }
- virtual public void Init(bool isForward)
- {
- _isIhen = false;
- }
- abstract protected void DoIhen();
- }
IhenBlock.cs
IhenBlock クラスは箱型の異変オブジェクトを表現するクラス。異変あり時は単に色を赤に変えるだけとする(DoIhen メソッド)。配置位置は通路B 内に設定するが、プレーヤーが進んでいる方向によって配置場所を前後左右を反転させる必要がある。これはプレーヤーがどちら向きから通路B に進んでも同様の位置にあるように見せるためで、通路 B自体は反転させない。配置位置は固定なので、予め定数として定義しておく。
- public class IhenBlock : IhenBase
- {
- private readonly Vector3 POSITION_FWD = new Vector3(-2.7f, 1.25f, 20f);
- private readonly Vector3 POSITION_BWD
- = new Vector3(2.7f, 1.25f, LevelControl.PATHB_LENGTH_H - 20f);
- override public void Init(bool isForward)
- {
- base.Init(isForward);
- if (isForward)
- {
- this.gameObject.transform.localPosition = POSITION_FWD;
- }
- else
- {
- this.gameObject.transform.localPosition = POSITION_BWD;
- }
- }
- override protected void DoIhen()
- {
- var renderer = this.gameObject.GetComponent<Renderer>();
- renderer.material.color = Color.red;
- }
- }
IhenPoster.cs
IhenPoster クラスはポスター型異変オブジェクトを表現するクラス。異変あり時はポスターのテクスチャーを変更するだけ。配置位置についはIhenBlock と同様に反転処理を入れる。
- public class IhenPoster : IhenBase
- {
- private readonly Vector3 POSITION_FWD = new Vector3(2.95f, 2f, 10f);
- private readonly Vector3 POSITION_BWD
- = new Vector3(-2.95f, 2f, LevelControl.PATHB_LENGTH_H - 10f);
- private readonly Vector3 SCALE = new Vector3(0.025f, 0.025f, 0.025f);
- private readonly Vector3 ROTATION_FWD = new Vector3(270f, 0f, 90f);
- private readonly Vector3 ROTATION_BWD = new Vector3(270f, 0f, 270f);
- override public void Init(bool isForward)
- {
- base.Init(isForward);
- if (isForward)
- {
- this.gameObject.transform.localPosition = POSITION_FWD;
- this.gameObject.transform.localScale = SCALE;
- this.gameObject.transform.localEulerAngles = ROTATION_FWD;
- }
- else
- {
- this.gameObject.transform.localPosition = POSITION_BWD;
- this.gameObject.transform.localScale = SCALE;
- this.gameObject.transform.localEulerAngles = ROTATION_BWD;
- }
- }
- override protected void DoIhen()
- {
- var renderer = this.gameObject.GetComponent<Renderer>();
- renderer.material.mainTexture = Resources.Load<Texture>("Sprites/PosterIhen");
- }
- }
IhenControl.cs の抜粋
各異変オブジェクトは、IhenControl クラスから生成される。各異変オブジェクトは予めPrefab 化しておき、通路B を生成するタイミングでロード/インスタンス化して、_ihenList メンバに保存しておく。異変ありモードか、なしモードかを CreateObjects メソッドの引数 isIhen で受け取り、異変ありの場合は、ランダムで特定の1つのオブジェクトだけを異変あり状態に設定する(IhenObjectIndex)。後は生成した異変オブジェクトのインスタンスからIhenBase クラスとして各スクリプトコンポーネント取得して、IhenBase.SetIhen メソッドを呼びだして、異変を設定する。
- public void Init()
- {
- LoadPrefabs();
- }
- public void CreateObjects(bool isForward, Transform path, bool isIhen)
- {
- int index = (isIhen) ? IhenObjectIndex() : -1;
- CreateIhenObjects(isForward, path, index);
- CreateRobot(isForward, path);
- }
- public void IhenStart()
- {
- robotControl.StartWalk();
- }
- private void LoadPrefabs()
- {
- foreach (var prefabName in _prefabNames)
- {
- var prefab = Resources.Load<GameObject>(prefabName);
- _prefabList.Add(prefab);
- }
- }
- private int IhenObjectIndex()
- {
- return Random.Range(0, _prefabList.Count);
- }
- private void CreateIhenObjects(bool isForward, Transform path, int index)
- {
- int i = 0;
- foreach (var prefab in _prefabList)
- {
- var obj = Instantiate(prefab, path.position, Quaternion.identity);
- obj.transform.SetParent(path.transform);
- var ihen = obj.GetComponent<IhenBase>();
- ihen.Init(isForward);
- ihen.SetIhen*1;
- _ihenList.Add(ihen);
- i++;
- }
- }
異変オブジェクトを通路に配置した結果がこちら。
次の記事
*1:i == index