とあるプログラマの備忘録

都内某所に住むプログラマが自分用に備忘録を残すという趣旨のブログです。はてなダイアリーから移動しました!

【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第四回「敵に動きを入れたい」

前回で敵を塵にするところまではできたのですが、まだ敵は一歩も動きません。
なんかもっと近くに寄ったらこっちに向かってきてくれる様なアクションが欲しい物です。

1.近くに寄ったら敵が近づいてくるようにしたい

1-1.mobにCharacter Controller追加
とりあえず、この敵をなんとか動かしたいので、
Hierarchy > mobにInspectorからCharacter Controolerコンポーネントを追加します。
そして緑の当たり判定の部分をmobオブジェクトを囲うようにします。

1-2.mobが認識する範囲を作る
mobのInspectorから
Add Component > Physics > Sphere Colliderを追加して、
敵の認識ゾーンを作ります。

広さは10に設定してみました。

この円範囲をトリガーとします。
is Triggerにチェック

これで円に入ったらなんかアクションが起こせるようになりました。

2.近くによったら敵から近づいてくるスクリプトを書く
とりあえず空のJSを用意してAIとでも名付けて置きます。

そしてこれが一応のAI.jsです
コピーするときはコメント消してくださいね。

#pragma strict
 
var target : GameObject;
var speed :float =  1.0;
var gravity : float = 20.0;

//これは敵の認識範囲にいるかどうかのフラグ
private var isEnable =  false;
 
function Update () {
    //さっきaddConponentしたCharacterControllerを呼び出しています
    var controller : CharacterController = GetComponent(CharacterController);
    var moveDirection : Vector3 = Vector3.zero;
 
    //認識範囲にいれば
    if(isEnable==true){

        //アニメーションで走らせます
    	animation.Play("Run");

        //mobの位置と自分の位置の差分をとって距離をはかり、0でなければ
	if (Vector3.Distance(transform.position, target.transform.position)) {
    //自分の位置をtargetDirectionに入れて
             var targetDirection : Vector3 = target.transform.position;
    //敵が浮かない様に縦座標は0に固定します
	     targetDirection.y = 0;
    //敵の向きを自分に向かせます
	     transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(targetDirection - transform.position), Time.time * 0.1);
	 
             //敵のスピードと重力か次の位置を計算して移動させます
	     moveDirection += transform.forward * 1;
	     moveDirection.y -= gravity * Time.deltaTime;
	     controller.Move(moveDirection * Time.deltaTime * speed);
	}
    }
}


/**
 * 円の範囲に入ったときのハンドラ
 */
function OnTriggerEnter( colobj : Collider ){
    //円に入ったのがPlayerのタグがついているオブジェクトなら
    if(colobj.tag == 'Player'){
   //isEnableをtrueにして入ったオブジェクトをtarget変数に入れます
         isEnable =  true;
         target= colobj.gameObject;
    }
}

/**
 * 円の範囲外に出た時のハンドラ
 */
function OnTriggerExit( colobj : Collider ){
    //出たのがPlayerタグがついているオブジェクトなら
    if(colobj.tag == 'Player'){
        //フラグをfalseにする
        isEnable = false;
    }
}

3.マップ情に敵をランダムに発生させる

#pragma strict
var mobPrefab : GameObject;
var intervalMin : float = 1.0;
var intervalMax : float = 2.0;

function Start () {
	while(true){
		yield WaitForSeconds(Random.Range(intervalMin, intervalMax));
		
		var position : Vector3 = Vector3(Random.Range(1,200), 0 , Random.Range(1,200));
		
		Instantiate(mobPrefab, position, Quaternion.identity);

	}
}

結構考慮の足りていないスクリプトになってしましたが、とりあえずこれでmobgeneratorとして保存します。

そしたらGameObject > Create Emptyで空のゲームオブジェクトを作ってそこにmobgenerator.jsをアタッチします。
スクリプトのmobPrefabにmobオブジェクトをセットしてあげればこれにて完了です。



◆総評
とりあえずUnityの基本操作とUnityScriptの基本的な構文を勉強する為にここまでつくってきました。
総評としてはUnity面白いな!というのが素直な感想です。

Scriptもなにかしらの言語をやった事があればある程度予測の上直感的に行けそうな感じもします。
そして何よりこれから盛り上がっていくぞ、という勢いを各参考にさせてもらったサイトからかんじました。

まだ本当に触り程度でしか触って無くしかもググって調べる&Unity入門の本を一冊買って
四苦八苦しながらここまでつくりましたが、これからもUnityの勉強を続けていきたいとおもいます。

ーー追記
Unity記事を自分用に書いていたのですが思いのほか反響がすごいです。
やはり今とっても注目されているゲームエンジンなんだなぁと改めて実感いたしました。
正直本当に始めたばかりでここを見てくれた人たちの参考にすらならない物ばかりで大変恐縮ですが、
少しでも同じ問題で困っ手いる人の手助けができれば幸いです。

関連記事リンク
【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第一回「マップ作ろうぜ!」
【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第二回「キャラ動かしてみようぜ」
【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第三回「銃弾が撃てるスクリプトが書きたい」
【Unity入門】FPSのゾンビゲー見たいなのを作ってみたい(願望) 第四回「敵に動きを入れたい」