キャラクターの移動処理の解説。今回はバイオハザードタイプの左右キーで旋回、上下キーで前進/後退をするタイプの移動処理を作ります。
キャラクター(Player)データについては前回のJavaScript(GUIScript.js)の前のところまで作業をして下さい。なお、今回はカメラはPlayerの後ろに位置する為、Rotationは(0, 0, 0)に設定します。
キャラクターのアニメーション処理 - 強火で進め
http://d.hatena.ne.jp/nakamura001/20110612/1307880504
前準備が終ったらメインの作業に取り掛かります。
まず地面を作成します。Cubeを作成し、Scaleを(10, 1, 10)に設定。Playerの下(Playerキャラクターがちょっと浮くくらいの位置)に移動します。
次にプログラム部分。以下のJavaScriptをキャラクターに追加します。
【PlayerScript.js】
var gravity : float = 20.0; private var moveDirection : Vector3 = Vector3.zero; function Start() { animation.Play("idle"); } function FixedUpdate() { var inputH : boolean = false; var inputV : boolean = false; var controller = GetComponent(CharacterController); moveDirection = Vector3.zero; moveDirection.y -= gravity*Time.deltaTime; if (Mathf.Abs(Input.GetAxisRaw("Horizontal")) > 0.5) { inputH = true; transform.eulerAngles.y += Input.GetAxis("Horizontal") * 3.0f; } if (Mathf.Abs(Input.GetAxisRaw("Vertical")) > 0.5) { inputV = true; moveDirection += transform.forward * 2.0f; } controller.Move(moveDirection*Time.deltaTime); if (inputH || inputV) { animation.CrossFade("walk"); } else { animation.CrossFade("idle"); } }
順番に主な部分を解説します。
function Start() { animation.Play("idle"); }
スタート時にアイドル時のアニメーションを開始します。
moveDirection = Vector3.zero; (中略) controller.Move(moveDirection*Time.deltaTime);
Playerの移動量をmoveDirectionに格納し、最後に適用します。
moveDirection.y -= gravity;
重力として-Y方向に移動。
if (Mathf.Abs(Input.GetAxisRaw("Horizontal")) > 0.5) { inputH = true; transform.eulerAngles.y += Input.GetAxis("Horizontal") * 3.0f; }
左右キーが押されたらPlayerを旋回させる処理。 if (Input.GetAxis("Horizontal") != 0) では無く、この様に 0.5〜-0.5 を除外して有るのはアナログスティックなどではユーザの入力が無い(ニュートラルの位置に有る)場合でも0.1や-0.01などの小さな値を返すものが有る為です。
if (Mathf.Abs(Input.GetAxisRaw("Vertical")) > 0.5) { inputV = true; moveDirection += transform.forward * 2.0f; }
上下キーで前進、後進をさせる処理を行っています。左右キーと同様に小さい値の場合は入力無しとして扱っています。
controller.Move(moveDirection*Time.deltaTime);
最終的に確定した移動量を適用。
if (inputH || inputV) { animation.CrossFade("walk"); } else { animation.CrossFade("idle"); }
キー入力が有ったら walk のアニメーション、無かった場合は idle のアニメーションを再生。
今回のサンプルはこちらで試せます。一度画面をクリックしてフォーカスを当ててからキー入力をする様にして下さい。ソースファイルはこちら。
補足1
良いアニメーション付きのキャラデータが無かったので後進をさせる時も前進と同じアニメーションに成っています。実際には後進させる場合アニメーションを切り替えた方が良いでしょう。
補足2
今回はCharacter Controllerを事前に追加しましたがjsファイルに以下の記載をしておくとPlayerにドラッグした瞬間にCharacter Controllerが追加されます。
@script RequireComponent(CharacterController)
もちろん、事前にCharacter Controllerが追加済みの場合はもう一つ追加される様な事は有りません。