強火で進め

このブログではプログラム関連の記事を中心に書いてます。

キャラクターの移動処理(バイオハザードタイプ)

キャラクターの移動処理の解説。今回はバイオハザードタイプの左右キーで旋回、上下キーで前進/後退をするタイプの移動処理を作ります。

キャラクター(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が追加済みの場合はもう一つ追加される様な事は有りません。