Character Controllerを使わずにキャラクターを動かす

Unityにはプレーヤーの制御を行う方法がいくつかあります。

Character Controllerとは、Rigid Bodyつまり物理特性を使わずにキャラクターを動かすことを可能にしたものです。

docs.unity3d.com

今回は、これを使わずにプレーヤーを動かす方法を考えたいと思います。

SceneとPlayerの配置

次の図のようなSceneを作ります。

f:id:Taka8:20160903171712p:plain

PLayer GameObject

Playerの[inspector]->[Add Component]->[Physics]->[Rigidbody]でRigidbody Componentを付けます。

f:id:Taka8:20160903171959p:plain

このままだと……

f:id:Taka8:20160903172553g:plain

このように転倒してしまいます。なので、Rigidbody ComponentのConstraintsのFreeze RotationのX, Y, Zにチェックを入れます。

ついでにAngular Dragの値も0にしておきましょう。

f:id:Taka8:20160903173255p:plain

ここらへんの設定はUnity - マニュアル: Rigidbodyを参考にしてください。

PlayerControllerScript.cs

なお、Rigidbodyと絡める際は、FixedUpdate関数内に記述したほうが良いです。

タイマーもTime.deltaTimeではなく、Time.fixedDeltaTimeを使います。

イベント関数の実行順に関してはUnity - マニュアル: イベント関数の実行順

using UnityEngine;

public class PlayerControllerScript : MonoBehaviour
{

    public float speed = 5f;
    public float rotateSpeed = 120f;

    void FixedUpdate()
    {

        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        Vector3 velocity = new Vector3(0, 0, v);

        // キャラクターのローカル空間での方向に変換
        velocity = transform.TransformDirection(velocity);

        // キャラクターの移動
        transform.localPosition += velocity * speed * Time.fixedDeltaTime;

        // キャラクターの回転
        transform.Rotate(0, h * rotateSpeed * Time.fixedDeltaTime, 0);

    }

}

結果

上記のScriptをPlayer GameObjectにアタッチします。

f:id:Taka8:20160903183307g:plain


また、Rigidbodyで動かしているのでこんなこともできます。

f:id:Taka8:20160903185822g:plain

Multiplayer Networking/Unity/Standard Assets/Nintendo Switch/Asset Store/Git/GitHub for Windows/Arduino/Blender/はてなブログ/