【Unity】事前に決めた座標を行ったり来たりする方法
行ったり来たりする処理
身近で行ったり来たりする処理どうする?的な話題になったので自分なりに考えた処理
サンプルコード
[SerializeField, Header("移動速度")] float speed = 5; [SerializeField, Header("感知できる距離")] float range = 0.5f; [SerializeField,Header("移動したい座標")] Vector3[] movePath = new Vector3[3]; Vector3 direction; int pathValue = 0; //現在どのパスなのか int nextPathValue; //次の移動したいパス enum MoveType { MoveOn, Return } MoveType moveType; private void Start() { //初期位置を記憶しておく(配列の0番目) movePath[0] = transform.position; //次の座標のパス nextPathValue = 1; moveType = MoveType.MoveOn; } private void Update() { Move(); } /// <summary> /// 動くよ /// </summary> void Move() { //移動する向きベクトルを作成 direction = movePath[nextPathValue] - movePath[pathValue]; //方向ベクトルを作成 direction.Normalize(); Debug.Log(pathValue +" "+nextPathValue); //移動 transform.position += direction * Time.deltaTime * speed; //目標地点に近づいたか評価 if (CheckDistance(transform.position, movePath[nextPathValue], range)) { //次のパスに移動先を変更 NextDesignatedLocation(); } } /// <summary> /// 範囲を指定してその範囲ないか調べる関数 /// </summary> /// <param name="_myPos">自身の位置</param> /// <param name="_nextPos">次の移動位置</param> /// <param name="_range">半径</param> /// <returns></returns> bool CheckDistance(Vector3 _myPos, Vector3 _nextPos, float _range) { bool inRange = false; //targetの位置に近づいたらtrue if (Vector3.Distance(_myPos, _nextPos) <= _range) { inRange = true; } return inRange; } /// <summary> /// 次のパスに指定する /// </summary> void NextDesignatedLocation() { switch (moveType) { case MoveType.MoveOn: pathValue = nextPathValue; nextPathValue++; if (nextPathValue == movePath.Length-1) { moveType = MoveType.Return; } break; case MoveType.Return: pathValue = nextPathValue; nextPathValue--; if (nextPathValue == 0) { moveType = MoveType.MoveOn; } break; default: pathValue = nextPathValue; nextPathValue++; if (nextPathValue == movePath.Length - 1) { moveType = MoveType.Return; } break; } }
まとめ
急いで書いたとはいえ汎用性がなさそうなものができてしまった…