【Unity4】移動、レガシーアニメーションのスクリプト制御基礎

今日はプログラマらしく、スクリプトについていろいろトライアンドエラーをやっていた。

入門書籍などでUnityをはじめると、コントローラやらカメラ移動やら既存のスクリプトを貼り付けるだけで、それらしく出来てしまう。

そのため、実際にそういった動きをするスクリプトを一からフルスクラッチで作りたい場合、どうすればいいのってなると自身のあまりの無知さに驚いた。

アンドロイドでJAVAアプリ作ってたときは、カメラアングルから移動まで、座標変換やらステート管理やら全部スクラッチしてたのにこの体たらく。

Unityのユーザーマニュアルサイト見ながらHelloWorld的なことをしていたとです。

たとえば向きを変えたい場合、JavaならGLSLの描画エンジンの座標を回転させてオブジェクトを描画とかやるわけです。

Unityのスクリプトだとどうなるかというと、とてもオブジェクト指向になっている。

操作したいゲームオブジェクトには、transformという内部変数が予約されていて、こいつにたいして回転とか移動とか命令するとです。

たとえば、カーソルキーを入れた方向に即座に向きを変えたい場合に俺が試してみたのはこうだ。

void Update () {
	//① カーソルキーの入力を調べる
	float horizontal = Input.GetAxis("Horizontal");
	float vertical = Input.GetAxis("Vertical");
	
	if (horizontal != 0) {
		//② 上下キーが入力された
		
		Debug.Log("Horizontal:" + horizontal);

		Vector3 targetX;
		
		//②-1 現在位置の直前(または直後)にターゲットをおく
		if (horizontal > 0) {
			targetX = new Vector3(transform.position.x + 1.0f, transform.position.y, transform.position.z);
		} else {
			targetX = new Vector3(transform.position.x - 1.0f, transform.position.y, transform.position.z);
		}

		//②-2 ターゲットの方向を向く
		transform.LookAt(targetX);
	}

	if (vertical != 0) {
		//③ 左右キーが入力された

		Debug.Log("Vertical:" + vertical);

		Vector3 targetZ;
		
		//③-1 現在位置の直右(または直左)にターゲットをおく
		if (vertical > 0) {
			targetZ = new Vector3(transform.position.x, transform.position.y, transform.position.z + 1.0f);
		} else {
			targetZ = new Vector3(transform.position.x, transform.position.y, transform.position.z - 1.0f);
		}

		//③-2 ターゲットの方向を向く
		transform.LookAt(targetZ);
	}
}

※このスクリプトはLookAtの動作を見るためのロジックで、これ自体は問題のあるコードなためゲームには使えませんよ。念のため。

LookAtを使っているのがポイントで、回転量を計算してその分だけ回転させるという面倒なやり方じゃなくて、向きたい方向に仮想の目標を置いて、そちらに向かせるイメージ。

Unity公式のユーザーマニュアルは必読でした。

5年前

コメントを残す

メールアドレスが公開されることはありません。