わかゲームスタジオ

ゲーム制作初心者専門学生の備忘録

Unity キャラクターの動かし方

今回はゲームジャムでやったら怒られることランキング上位に入るであろう事を回避するための内容です。

①前知識

Unityでキャラクターを動かす方法の中で、メジャーなのが3つあります。
それは、

  1. transformを使った移動
  2. Rigidbody.Velocityを使った移動
  3. Rigidbody.Addforceを使った移動

です。
この中で最もやってはいけない方法が、1番のtransformを使った移動です。
理由は単純で、transformを使った移動は単に細かいワープを繰り返しているので、コライダーとの衝突判定を取得してくれません。
つまり、壁をすり抜ける状況が発生するのです。
個人で制作している場合は自身のミスなので問題ありませんが、比較的制作期間の短いジェムだと致命的なミスになり、大幅なタイムロスになってしまいます。
ですので、Unityでキャラクターを動かす時はtransformではなくRigidbodyを使うようにしましょう。
今回は2.のRigidbody.Velocityを使った方法を紹介します。

②PhisicsMaterialを作成

f:id:WakaiGames:20200826164923p:plain

  • 摩擦が働いて壁に張り付いてしまう現象を回避する為、摩擦は0にしておきます。

③キャラクターの準備

f:id:WakaiGames:20200826164926p:plain

  • 動かすためのRigidbodyを追加する。
  • コライダーを追加する。
  • コライダーに②で作成したPMを設定しておきます。
  • 新しいスクリプトを作る。

スクリプトの中身を書く

    [Header("リジッドボディ")]
    [SerializeField]
    private Rigidbody rigidbody;

    [Header("移動速度")]
    [SerializeField]
    private float speed = 15;

    [Header("入力制限")]
    [SerializeField]
    [Range(0, 1)]
    private float inputLimit = 0.1f;

    //入力値代入用
    private Vector2 inputVector;

    void Update()
    {
        //入力値を代入
        float hori = Input.GetAxis("Horizontal") >= -inputLimit && Input.GetAxis("Horizontal") <= inputLimit ? 0 : Input.GetAxis("Horizontal");
        float ver = Input.GetAxis("Vertical") >= -inputLimit && Input.GetAxis("Vertical") <= inputLimit ? 0 : Input.GetAxis("Vertical");
        inputVector = new Vector2( hori, ver);
    }

    private void FixedUpdate()
    {
        //カメラの向きから移動方向を決定
        Vector3 moveVector = (Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized * inputVector.y + Camera.main.transform.right * inputVector.x) * speed;
        //移動方向に重力分を足す
        rigidbody.velocity = moveVector + new Vector3(0, rigidbody.velocity.y, 0);
    }

以上が移動のみの内容です。
次はカメラの回転について書きたいと思います。