頑張ってゲーム作ることにする #4 敵キャラとプレイヤーの死亡
まずは敵キャラの画像を作成します。
プレイヤーの目を白に、体全体を黒塗りにしただけです。
敵キャラを動くようにします。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyController : MonoBehaviour { private Rigidbody2D rbody; public float moveSpeed = 1; public LayerMask blockLayer; // ブロックレイヤー public enum MOVE_DIR { LEFT, RIGHT, } private MOVE_DIR moveDirection = MOVE_DIR.RIGHT; // Start is called before the first frame update void Start() { rbody = GetComponent<Rigidbody2D>(); } // Update is called once per frame void Update() { } private void FixedUpdate() { bool isBlock; // 進行方向にブロックがあるかどうか switch (moveDirection) { case MOVE_DIR.RIGHT: rbody.velocity = new Vector2(moveSpeed, rbody.velocity.y); transform.localScale = new Vector2(1, 1); isBlock = Physics2D.Linecast( new Vector2(transform.position.x, transform.position.y), new Vector2(transform.position.x + 0.65f, transform.position.y), blockLayer); if (isBlock) { Debug.Log("Block!!!"); moveDirection = MOVE_DIR.LEFT; } break; case MOVE_DIR.LEFT: rbody.velocity = new Vector2(moveSpeed*-1, rbody.velocity.y); transform.localScale = new Vector2(-1, 1); isBlock = Physics2D.Linecast( new Vector2(transform.position.x, transform.position.y ), new Vector2(transform.position.x - 0.65f, transform.position.y ), blockLayer); if (isBlock) { moveDirection = MOVE_DIR.RIGHT; } break; } Debug.DrawLine( new Vector3(transform.position.x, transform.position.y, 0), new Vector3(transform.position.x + 0.75f, transform.position.y, 0), Color.red ) ; } }
こちらになります。
列挙型のMOVE_DIRによって現在のオブジェクトの動く方向を決定しています。
例えばmoveDirectionにMOVEDIR.LEFTが入っている状態にあるときには左向きに動きます。逆もまた然りです。
敵キャラは自動で動きます。そのため壁にぶつかったときに壁に進み続けてしまうことになります。
それを解消するためにphysics2D.Linecastというメソッドを使用します。
これは第一引数の座標から第二引数の座標に向かって衝突判定を行う見えない線を発生させます。
そして衝突したLayerが第三引数に指定されているものの場合Trueを返すようになっています。
(厳密には違うかもしれませんがなんとなくのニュアンスはあっていると思います。)
赤線がDebug.DrawLineメソッドによって表示させているLineCastの線になります。GameSceneには表示されていません。
この線にblockLayer(第三引数に設定しているLayer)が接触すると反転して動くようなスクリプトにしています。
おいおい落下しないような挙動をする敵キャラなんかも実装したいと思います
プレイヤーの死亡は次回になります。