やりたいこと
Unityで移動している方向によって移動アニメーションを切り替えたいので前後左右どちらに移動しているかを取得したいです。
またカメラは常にプレイヤーの前を向くようになっているので
前後左右はワールド座標からみた方向ではなく、プレイヤーが向いている方向を前として判断したいです。
躓いているところ
最初にプレイヤーにRigidbodyが付いている事もあり
Rigidbody.velocityの値によってどちらの方向に移動しているか探ろうと思ったのですが...
このプレイヤーのカメラが常に前を向くようになっている為、前に歩くだけでも
1.北を向き前に進む(南→北) 2.南を向き前に進む(北→南)
1.東を向き前に進む(西→東) 2.西を向き前に進む(東→西) の4通りの状況が出来てしまいます。
Rigidbody.velocityはワールド座標が基準になっているので以下のような条件分岐で分けようとすると...
// 北を向き前に歩くと "前に歩いています" // 南を向き前に歩くと "後ろに歩いています" ← 本当は前に歩いていますと出て欲しい if (rigidbody.velocity.z > 0) Debug.Log("前に歩いています"); else if (rigidbody.velocity.z < 0) Debug.Log("後ろに歩いています");
そこで次はプレイヤーの向いている角度によって判断基準を変更することにしました
Vector3 moveVec = // プレイヤーが1フレームで動いた移動ベクトル float rotY = // プレイヤーの向いている角度 // 殆ど止まってる if (Mathf.Abs(moveVec.magnitude) < Mathf.Epsilon) moveState = MoveState.Standing; else { // 左右か前後かで言うなら前後移動 if (Mathf.Abs(moveVec.z) >= Mathf.Abs(moveVec.x)) { // 絶対座標から見て前に進んでる if (moveVec.z >= 0) { if (rotY >= 45 && rotY < 135) moveState = MoveState.Left; else if (rotY >= 135 && rotY < 215) moveState = MoveState.Back; else if (rotY >= 215 && rotY < 305) moveState = MoveState.Right; else moveState = MoveState.Forward; } else { if (rotY >= 45 && rotY < 135) moveState = MoveState.Right; else if (rotY >= 135 && rotY < 215) moveState = MoveState.Forward; else if (rotY >= 215 && rotY < 305) moveState = MoveState.Left; else moveState = MoveState.Back; } } else { // 絶対座標から見て右に進んでる if (moveVec.x >= 0) { if (rotY >= 45 && rotY < 135) moveState = MoveState.Forward; else if (rotY >= 135 && rotY < 215) moveState = MoveState.Left; else if (rotY >= 215 && rotY < 305) moveState = MoveState.Back; else moveState = MoveState.Right; } else { if (rotY >= 45 && rotY < 135) moveState = MoveState.Back; else if (rotY >= 135 && rotY < 215) moveState = MoveState.Right; else if (rotY >= 215 && rotY < 305) moveState = MoveState.Forward; else moveState = MoveState.Left; } } }
これである程度移動方向を正しく得られるようになりましたが
まだ100%正しくは取ることは出来ず((45,135,215,305)°辺りで細かく移動すると偶に間違った方向が返ってきたりします)
これ以上はもうお手上げなのでアドバイスを頂ければかと思います。
よろしくお願いします。