Unityでゲーム開発_オブジェクトの移動

Unityにおいて、ゲームオブジェクトの移動をコントロールする方法は色々ある。例えば…

  • 物理演算により、力を加えてオブジェクトを動かす方法
  • オブジェクトの速度をコントロールする方法
  • オブジェクトの位置をコントロールする方法
  • 3Dキャラクターのアニメーションに組み込まれた移動をUnityの中で使う方法

などなど。

方向キーの入力でオブジェクトを動かすシンプルな例を通じて、オブジェクトの移動に関わりのある、ごく基本的な部分についてまとめてみた。

入門向けのチュートリアルではキャラクターの移動をコントロールするために、次のようなコードがよく登場する。

public class PlayerController: MonoBehaviour {
    public GameObject player;
    public float speed;
    private Rigidbody playerRb;

    void Start() {
        playerRb = GetComponent<Rigidbody>();
    }

    void FixedUpdate() {
        float moveHorizontal = Input.GetKeyAxis("Horizontal");
        float moveVertical = Input.GetKeyAxis("Vertical");
        Vector3 movement = new Vector3(moveHorizontal, moveVertical, 0);

        //AddForceメソッドを使う場合
        playerRb.AddForce(movemment * speed, ForceMode.Force);

        //velocityプロパティを使う場合
        //playerRb.velocity = movement * speed;

    }
}

Input.GetAxisを使って方向キーの入力を取得し、それをベクトルに変換してRigidbodyのAddForceメソッドやvelocityプロパティに渡すとオブジェクトが移動する。

Input.GetAxisの値は上または右の方向キーを押すと0~1の間で、下または左の方向キーを押すと-1~0の間で変化する。この変化のスピードはEdit>Project Setting>InputのGravity及びSensitivityで変えられる。キーの入力状態を滑らかに変化させるのではなく、ONとOFFの区別をはっきりしたい場合は、AddForceメソッドやvelocityプロパティに渡すベクトルをnormalizedを使って大きさ1に固定するなどの処理を加える。

Rigidbodyには物理演算のためのパラメータが備わっていて、物体の質量や空気抵抗、回転に対する空気抵抗、重力の影響の有無などをInspectorタブ内で変えることができる。また、オブジェクトが他のオブジェクトに触れり、ぶつかったりする場合、各オブジェクトのColliderのPhysic Materialを設定すると摩擦や弾性の挙動をコントロールできる。

物理演算でよく使われるRigidbodyのaddForceメソッドには力の加え方に4つのバリエーションがある。物体に連続的に力を加えるForce。Forceと同様の挙動を示すが、質量の影響を受けないAcceleration。瞬間的に速度を変化させてるImpulse。Impulseと同様の挙動を示すが質量の影響を受けないVelocityChange。これらを使い分けることで、オブジェクトの動きのコントロールのバリエーションも増やせる。

ボールやタイヤのような転がる形状のオブジェクトは、AddTorqueメソッドを使って回転方向に力を加えることで転がる動きを実装することもできる。

上記のような単純なコードでも、入力のレスポンスや物理演算のパラメータを変化させれば、ある程度はオブジェクトの運動に関する挙動をコントロールできる。しかし、オブジェクトの状態によってタイプの異なる動きをしたり、オブジェクトの運動に関わる要素が複雑に影響し合うなど、単純な物理演算だけでは動きをコントロールできない場合は、オブジェクトを動かすための関数を作って動きをコントロールするというやり方がよく使われている。

作るゲームによってオブジェクトをどのように動すかが変わってくるし、同じような動きを実装するためのやり方も何通りも考えられるので、適切なコントロール方法を考えるのはなかなか難しい。公式のチュートリアルやStandard Assets Example Projectに色々な例があるので、まずはその辺りを参考にするのが良いかもしれない。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です