強火で進め このページをアンテナに追加 RSSフィード

整理された情報は こちら へどうぞ。

2011年06月12日

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

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

キャラクター(Player)データについては前回のJavaScript(GUIScript.js)の前のところまで作業をして下さい。なお、今回はカメラはPlayerの後ろに位置する為、Rotationは(0, 0, 0)に設定します。

キャラクターのアニメーション処理 - 強火で進め

http://d.hatena.ne.jp/nakamura001/20110612/1307880504

前準備が終ったらメインの作業に取り掛かります。

まず地面を作成します。Cubeを作成し、Scaleを(10, 1, 10)に設定。Playerの下(Playerキャラクターがちょっと浮くくらいの位置)に移動します。

f:id:nakamura001:20110612230314p:image

次にプログラム部分。以下の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が追加済みの場合はもう一つ追加される様な事は有りません。

匿名匿名 2014/06/09 20:15 はじめまして、Unityを勉強中の者です。
ページ上部のサンプルでは
moveDirection += transform.forward * 2.0f;
となっていますが、

ページ下記の解説では
moveDirection += transform.forward*Input.GetAxis("Vertical") * 2.0f;
(?)と記されているようです。

実際のコードは
moveDirection += transform.forward * Input.GetAxis("Vertical") * 2.0f;
の記述でいいのでしょうか?

nakamura001nakamura001 2014/06/09 22:01 ご指摘ありがとうございます。 moveDirection += transform.forward * 2.0f; を想定していましたがどちらの方法でもOKです。
Input.GetAxis("Vertical") 含めた場合にはゲームパッドのアナログスティックで操作した時にスティックの倒した量で旋回の速度が調整可能です。含めない場合は倒した量に関係なく同じ速度で旋回します。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

リンク元