Unityでキャラクターを移動させる方法【3D編】

2017.05.07 自習室 1
Unityでキャラクターを移動させる方法【3D編】

移動方法は大きく分けて「transformを使った移動」「Rigidbodyを使った移動」「CharactorControllerを使った移動」「Vectorを使った移動」の4つがあります(「Vectorを使った移動」」は指定位置まで自動的に動く(入力による移動ではない)ためか除かれていることが多いですが、ここでは含めます)。この分類に入らない移動方法もありますが、それはいったん「その他の移動方法」としてまとめます。

なお、「キャラクターの移動」といった場合、「位置を変える」「向きを変える」「アニメーションを変える」の3つの処理を合わせて説明していることが多いですが、ここでは「位置を変える」方法のみを取り上げています。「向きを変える」「アニメーションを変える」方法については別途まとめます。

環境

  • Unity 5.6.0f3
  • このページで使用している環境の設定方法はこちらから

移動方法の分類

transformを使った移動
オブジェクトのトランスフォーム情報(座標)を直接書き換える方法
  • transform.positionを書き換えて移動する
  • transform.Translateを使って移動する
Rigidbodyを使った移動
オブジェクトにRigidbodyをアタッチして、物理的に力を加える方法
  • Rigidbody.AddForceを使って移動する
  • Rigidbody.velocityを書き換えて移動する
  • Rigidbody.MovePositionを使って移動する
CharactorControllerを使った移動
CharactorControllerをアタッチして、移動機能を呼び出して動かす方法
  • CharactorController.SimpleMoveを使って移動する
  • CharactorController.Moveを使って移動する
Vectorを使った移動
Vectorで移動先を指定して動かす方法
  • Vector3.MoveTowardsを使って移動する
  • Vector3.Lerp(Vector3.Slerp)を使って移動する
その他の移動方法
上記分類に含まれない移動方法
  • NavMeshを使って移動する

transformを使った移動

  • 重力を加えるため、Rigidbodyをアタッチ
  • 床との接触判定のため、CapsuleColliderをアタッチ
  • 位置を直接書き換えているため、衝突判定をすり抜けやすい(ある意味、短いワープの連続)

transform.positionを書き換えて移動する

この移動方法の参考リンク
公式スクリプトリファレンス
Unityちゃんをキー操作で走らせる 2014.5.10
ゲーム開発初心者のためのUnity入門(11) 2017.1.30
【Unity】2D横スクロールアクションゲームのキャラクター移動方法 2017.9.23

transform.Translateを使って移動する

この移動方法の参考リンク
公式スクリプトリファレンス
キャラクターの移動<3D編> 2016.4.7
→滑らかに移動させる方法が説明されています。

Rigidbodyを使った移動

  • Rigidbodyコンポーネントをアタッチしておく必要がある
  • 衝突判定には以下の2つの条件が必要。少なくとも片方のオブジェクトにRigidbodyがアタッチされていること、両方のオブジェクトにcolliderがアタッチされていること

Rigidbody.AddForceを使って移動する

この移動方法の参考リンク
公式スクリプトリファレンス
プレイヤーの移動 2016.7.28

Rigidbody.velocityを書き換えて移動する

この移動方法の参考リンク
公式スクリプトリファレンス
キャラクターの移動<3D編> 2016.4.7

Rigidbody.MovePositionを使って移動する

  • 公式スクリプトリファレンスを見ると「Rigidbody interpolation(補間)を有効にした場合、Rigidbody.MovePosition を呼び出すとレンダリングされる中間フレームで2つの位置の間のスムーズな遷移となります。」と書いてあるが、ワープしているように見える。この記述の詳細は不明。
この移動方法の参考リンク
公式スクリプトリファレンス
プレイヤーの移動 2016.7.28

CharactorControllerを使った移動

  • CharactorControllerコンポーネントをアタッチしておく必要がある
  • CharactorControllerはカプセルコライダーと移動機能をセットにしたコンポーネント
  • rigidbodyに影響されない形でゲームオブジェクトを操作することができる
  • 基本的に重力が効かないので、スクリプトで重力相当の力を加える必要がある(rigidbodyをアタッチしても効かない)
  • 接触の検知はOnControllerColliderHitを使う

CharactorController.SimpleMoveを使って移動する

  • CharactorControllerを使うと物理演算は基本効かないが、SimpleMoveを使った移動では重力が自動的に加えられる。
この移動方法の参考リンク
公式スクリプトリファレンス
CharacterControllerをつかってプレーヤーを動かす 2016.9.4

CharactorController.Moveを使って移動する

この移動方法の参考リンク
公式スクリプトリファレンス
CharacterControllerをつかってプレーヤーを動かす 2016.9.4
Unityでキャラクターの移動をプログラミングしてみる 2017.3.9
プレーヤーキャラクターを動かす 2014.6.13
この移動方法でゲームを作っている本

Vectorを使った移動方法

Vector3.MoveTowardsを使って移動する

  • 指定した位置まで一定速度で移動させてくれる
  • 画像では最初、少し引っ掛かりがあるように見えますが、もっと滑らかに動きます
  • 重力が効いているとぴょんぴょん跳んでいるようになるので、画像では重力は切っています
この移動方法の参考リンク
公式スクリプトリファレンス
【Unity】Vector3.MoveTowardsを使って1マスずつ移動する方法 2017.9.10
Unityでよく使う便利な標準関数について 2017.1.21
Unity でホーミング弾的なものの実装 2014.7.24

Vector3.Lerp(Vector3.Slerp)を使って移動する

  • 指定した位置まで滑らかに移動させてくれる
  • LerpとSlerpはほぼ同じだが、少し動き方が変わる(特に動き始めと動き終わり)
  • 重力が効いているとぴょんぴょん跳んでいるようになるので、画像では重力は切っています
この移動方法の参考リンク
公式スクリプトリファレンス
Unityでよく使う便利な標準関数について 2017.1.21

その他の移動方法

NavMeshを使って移動する

NavMeshについては別途まとめる予定です


1 thought on “Unityでキャラクターを移動させる方法【3D編】”

コメントを残す

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