はじめに
この記事はUnity初心者さん向けになっています。
上級者さんはブラウザバック推奨です。
制作しているゲームの動画がこちら。現在プレイヤー挙動を調整しています。
今回は作成したコードからプレイヤーの移動を抜き出してみます。(自分の復習もかねて)制作を始めた横スクアクション
— 胡桃メガネ (@MeGaNeKuRuMIII) April 27, 2024
とりあえずプレイヤーの動きをしっかり作って行ってます。 pic.twitter.com/NZem7WzU5T
プレイヤー移動について
プレイヤーのオブジェクトにRigidBodyとCapsuleColiderを追加。
RigidBodyはUseGravityを☑ConstrainsのFreezeRotationのXとZに☑を入れます。
あと、次の記事でジャンプを書くのでそれ用にMassを50~100の間にしていてください。
public class PlayerMove : MonoBehaviour
{
//移動関係
Vector3 moveDirection;
[SerializeField] private float speedMag;
private Rigidbody rb;
[SerializeField] private Vector3 moveVel;
//入力関係
private float InputX;
private float InputZ;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
InputDetection();
CalculateMoveVec();
}
private void FixedUpdate()
{
MoveFixed();
RotationFixed();
}
private void InputDetection()
{ //プレイヤーの入力検知
InputX = Input.GetAxisRaw("Horizontal");
InputZ = Input.GetAxisRaw("Vertical");
}
private void CalculateMoveVec()
{
//移動のベクトル計算
moveDirection = new Vector3(InputX, 0, InputZ);
moveDirection.Normalize();
moveVel = moveDirection * speedMag;
}
private void MoveFixed()
{
//移動
rb.velocity = new Vector3(moveVel.x, rb.velocity.y, moveVel.z);
}
private void RotationFixed()
{
// 回転
if (moveVel != Vector3.zero)// 入力していないときに(0,0,0)に向かないように
{
transform.localRotation = Quaternion.Lerp(transform.localRotation,
Quaternion.LookRotation(moveVel),
20.0f * Time.deltaTime);//入力方向に回転
}
}
}
プレイヤー移動は物理挙動で動かしています。プレイヤーの入力はUpdateで、物理計算関係はFixedUpdateで書いた方がいいそうなので、それぞれInputDetection()とCalculateMoveVec()とMoveFixed()にまとめてます。
また、回転部分はRotationFixed()に書いてます。
speedMag変数をインスペクターで調整して自分のしっくりくるものを見つけています。私は10前後が好みですね。
完成はこんな感じです。
プレイヤー移動のみ pic.twitter.com/wuXQ9eFdQ1
— 胡桃メガネ (@MeGaNeKuRuMIII) April 30, 2024
今後について…
ジャンプ処理はある程度作れているのですが、細かい挙動の調整をしているのでそれが終わり次第記事を書きます。わからんとか動かないとかあればコメントしてください。気づけたらお手伝いします。
Unity初心者さんの役に立てば嬉しいです。