3Dマップでキャラ(プレイヤー)の移動方法とカメラ設定 [Unity]
初期準備
キャラに追尾するカメラを使用する為に、次のアセットのダウンロードを行い、プロジェクトにインポートすることが必要です。
Standard Assets ※Unityが提供する無償の標準アセットです。 |
個人的には Third Person Camera (25ドル)がおススメです。
※この記事ではStandard Assetsを使用した例をご紹介します。
キャラ及び地面を設定する
今回のキャラは3Dオブジェクトの「キューブ」、地面は「キューブ」または「Terrain(地形)」のどちらかを設定してください。
キャラのキューブはインスペクターにあるタグを「Player」に変更します。
更にキャラのキューブはインスペクターの下部にある「コンポーネントの追加」で[物理][キャラクターコントローラー]を追加します。
カメラの追加
Unityの下部にある[プロジェクト]タブの[Assetes][Standard Assets][Cameras][Prefabs]の「MultipurposeCameraRig」を「ヒエラルキー」へドロップします。
さきほど、キャラのキューブのタグを「Player」にしたので自動的にそのキューブをカメラが追尾するようになります。
スクリプトを作成する
C#スクリプトを作成します。名前は「playerController」とします。
スクリプト(ソースコード)
WASDキーでキャラを移動。スペースキーでジャンプします。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class playerController : MonoBehaviour { private Vector3 moveDirection; private Vector3 addForceDownPower = Vector3.zero; private CharacterController controller; private float speed; // 移動速度 private float rotateSpeed; // 回転速度 private float gravity; // 重力 private float jumpPower; // ジャンプ力 // Start is called before the first frame update void Start() { this.rotateSpeed = 60.0f; this.gravity = 10f; this.jumpPower = 6; this.speed = 6.0f; this.controller = this.gameObject.GetComponent<CharacterController>(); } // Update is called once per frame void Update() { this.addForceDownPower = Vector3.zero; if (controller.isGrounded) { transform.Rotate(0, Input.GetAxis("Horizontal") * rotateSpeed * Time.deltaTime, 0); this.moveDirection = transform.forward * speed * Input.GetAxis("Vertical"); if (Input.GetButtonDown("Jump")) { this.addForceDownPower = Vector3.zero; moveDirection.y = this.jumpPower; } } else { this.moveDirection.y -= this.gravity * Time.deltaTime; } controller.Move(this.moveDirection * Time.deltaTime + this.addForceDownPower); } }
スクリプトをアタッチ
スクリプトをキャラのキューブの「ゲームオブジェクト」へドロップ。
後はゲームを実行して遊んでみましょう。
調整
キャラのキューブに追加した「キャラクターコントローラー」の半径などの設定、スクリプトの移動速度、回転などは各自で調整して下さい。
参考サイト
CharacterControllerをつかってプレーヤーを動かす
UnityのCharacterControllerの接地が判断出来ない時にスクリプトを使う
※今回のスクリプトは上記2サイトのコードの組み合わせ+αです。