Unityで「簡単なモグラ叩きゲーム」を作成する、Part3です。
はじめに
Part1は下記です。
今回やること
Part1はモグラが動くのをアニメーションで作成。Part2はモグラをマウスクリックで叩けるようにしました。Part3の今回はモグラの数を増やして、ランダムにモグラが動くようにします。
作成開始
Part2で作成したモグラのプレハブをコピーして、位置を変更して横に並べます。
また、「CreateEmpty」から空オブジェクトを追加して名前を「GameManager」にします。
GameManagerスクリプトの作成
新規でスクリプトを作成して、名前をGameManagerにします。スクリプトの中は下記に変更します。
using System.Collections.Generic; using UnityEngine; public class GameManager : MonoBehaviour { public static GameManager instance { get; private set; } [SerializeField] private List<mogura> moguras; private List<mogura> ActiveMoguras = new List<mogura>(); private int score = 0; private void Awake() { instance = this; } private void Start() { for (int i = 0; i < moguras.Count; i++) { moguras[i].SetIndex(i); } } private void Update() { if (ActiveMoguras.Count <= (score / 5)) { int index = Random.Range(0, moguras.Count); if (!ActiveMoguras.Contains(moguras[index])) { ActiveMoguras.Add(moguras[index]); moguras[index].Activate(); } } } public void AddScore(int index) { score += 1; ActiveMoguras.Remove(moguras[index]); } }
スクリプトの簡単な説明
GameManagerをインスタンス化して、各モグラにインデックスを割り当てます。
全モグラと、動いているモグラ(アクティブモグラとします)をリスト化しています。スコアに応じて、動くモグラの数を調整。動くモグラをランダムに選んでいます。
スコア追加時に、動いているモグラリストから取り除いています。
moguraスクリプトの変更
moguraスクリプトを下記のように変更します。インデックスを追加、OnMouseDownでスコア追加をします。
using UnityEngine; public class mogura : MonoBehaviour { [SerializeField] private Sprite moguraNormal; [SerializeField] private Sprite moguraDamage; private SpriteRenderer spriteRenderer; private Animator animator; private CircleCollider2D collider; private int index; private void Awake() { spriteRenderer = GetComponent<SpriteRenderer>(); animator = GetComponent<Animator>(); collider = GetComponent<CircleCollider2D>(); } private void OnMouseDown() { spriteRenderer.sprite = moguraDamage; GameManager.instance.AddScore(index); } public void Activate() { animator.SetTrigger("Show"); } public void ColliderOn() { collider.enabled = true; } public void ColliderOff() { collider.enabled = false; } public void spriteReset() { spriteRenderer.sprite = moguraNormal; } public void SetIndex(int index) { this.index = index; } }
実行すると下記のようにランダムに動きます。
スクリプトに追加
叩けなかったモグラを「アクティブモグラリスト」から取り除いていないので、取り除くようにします。
GameManagerスクリプトに下記を追加します。
public class GameManager : MonoBehaviour { public void Nohit(int index) { ActiveMoguras.Remove(moguras[index]); } }
moguraスクリプトに下記を追加します。モグラを叩いたかをhitで判定しています。
public class mogura : MonoBehaviour { private bool ishit = false; private void OnMouseDown() { ishit = true; spriteRenderer.sprite = moguraDamage; GameManager.instance.AddScore(index); } public void Activate() { ishit = false; animator.SetTrigger("Show"); } public void ColliderOff() { collider.enabled = false; if (!ishit) { GameManager.instance.Nohit(index); } } }
モグラが穴に戻った時に、叩けなかったモグラをアクティブモグラリストから除外します。
これで、モグラがランダムに穴から出てくるの実装が完了です。ここまででとりあえずのモグラ叩きの基本的な動作が作成完了です。