読者です 読者をやめる 読者になる 読者になる

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

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

【Unity 入門】ダンジョンゲーを作ってみたい 第二回「キャラクターをダンジョン内で動かす」

前回ダンジョンっぽいマップが出来上がり早くダンジョン内を動かしたいと思うのですが、
前にFPS系のゾンビゲーを作りたい!なんて事をしていたときは動かすキャラクターはコンポーネントに頼っていたのですが、
今回は動く時のスクリプトは自前で書きたいとおもいます。

では早速キャラクターを置きたいのですが、色々探したのですが、いい感じのモーションがついていて、
無料のキャラクターを探したのですが、ない。。。orz
しょうがないのでBlenderインスコして自分で作ってやるよっ!って思ったのですが、
すいません3Dモデリングなめてました。適当な物すらモデリングできずに一旦挫折(この奮闘記は又の機会に)
そんで結局行き着いたのが極力安くてモーションが沢山ついているアセットを購入するという事になりました。
こういう時いい方法があるよ!って方是非教えてください、攻撃モーションだけ拾ってきて、適当なボーンに適応できたりするの?

(もしも攻撃モーションがなくてよくて無料がいい人はこちらを)➡ Dokebimusa - GhostWarrior

今回は$10つかって(900円しないくらいだしこのくらいならお小遣いからなんとか)
これを購入しました。

デモはこちら
http://kimys2848.nayana.com/npc/blade/blade.html

まぁ前からこれ欲しかったんですけど、購入をためらっていましたが、アニメーション作ってる時間を買えるなら購入してしまおう!
ということで今回初有料物を使ってみたいと思います。

1.キャラクター周りの配置
1-1.キャラ置いてみる
インポートしたキャラクターファイルのプレハブをマップに適当に置いてみます。
キャラがデフォルトだと大きいのでスケールを調整します今回は0.5にしておきました

うん、いい感じですね

こいつは後で動かすのでCharacter Contorollerを追加してきます
PlayerのInspector>Add ComponentからPhysics>Character Contoroller
緑の枠をCharacter ContorollerのHeightとRadiusを調整してキャラに合わせます

1-2.カメラとライトの設置
キャラクターとの位置関係はこんな感じで配置して

ライトはカメラの子として置きます。

カメラはPlayer Camera1として置きます


2.カメラの自動追尾スクリプトを書く
前はplayerにカメラをつけてFPS視点でのカメラダッタのですが、
今回は絶対位置により固定方向カメラなので外出しにしています。
今のままだとキャラクターを動かしてもカメラは一切動かないので、プレイヤを自動追尾するスクリプトを書きます。

適当にcamera.csとでも名前をつけて

using UnityEngine;
using System.Collections;

public class camera : MonoBehaviour {
	
	public GameObject player;
	
	// Update is called once per frame
	void Update () {
		
		//プレイヤーどの位置に置くか
		transform.position = new Vector3(player.transform.position.x, player.transform.position.y + 2, player.transform.position.z - 1);
	}
}

真上だとせっかくのキャラクターの頭しか見えないので少し傾けてカメラをセットします
カメラの傾きはx軸に45で設定されています。
このスクリプトをPlayer Camera1にアタッチします。
オブジェクトにはプレイヤーをセット

3.プレイヤーを動かす
3-1.プレイヤーに登録されているアニメーションを見てみる
デフォルトでこんな感じでアニメーションが設定されているようです
結構あります、うれしい事にアイテムを拾うのとか、死亡時、コンボまでアニメーションがあるようです。
1000円でこれなら結構満足かも!

3-2.基本動作スクリプトを書く
とりあえずこんなスクリプトを書いてみました

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {
	
	public Vector3 targetDirection;

	// Use this for initialization
	void Start () {
	}
	
	// Update is called once per frame
	void Update () {
		
		targetDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
		
                //クリックで攻撃
		if (Input.GetButton("Fire1")){
			animation.Play("Attack");
			
     //Eでアイテム拾う
		}else if(Input.GetKey(KeyCode.E)){
			animation.Play("Pickup");
			
     //WASDで移動
		}else if (targetDirection.magnitude > 0.1) {
			animation.Play("Run");

        //プレイヤーの向きを変えて
			transform.rotation = Quaternion.LookRotation(targetDirection);
			//CharacterControllerコンポーネントを呼び出し
			CharacterController conroller = GetComponent<CharacterController>();
         //移動
			conroller.Move(transform.forward * Time.deltaTime * 3f);
		}else{
        //何も押されてない場合はIdle
			animation.Play("Idle");
		}
	}
}

これをPlayerMotor.csとして保存して、
スクリプトをプレイヤーにアタッチします。

さてさてどうでしょう、シュミレートするとダンジョン内を動き回る感じになるはず。
カメラはプレイヤーを固定位置からずっととり続けています。FPSみたいな視点では無く、ちゃんと動いているようです。

関連記事
【Unity 入門】ダンジョンゲーを作ってみたい 第一回「ダンジョン作ってみる」
【Unity 入門】ダンジョンゲーを作ってみたい 第二回「キャラクターをダンジョン内で動かす」