行ったり来たりする処理
身近で行ったり来たりする処理どうする?的な話題になったので自分なりに考えた処理
サンプルコード
[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;
}
}
まとめ
急いで書いたとはいえ汎用性がなさそうなものができてしまった…