ソースはこちらで公開しています。
https://github.com/matsushima-terunao/unity-chan

実際のゲームはこちら
http://ter.dip.jp/blog_unity/unity-chan/build/web/web.html

ユニティちゃんに攻撃アクションの追加

Animator 修正


既存の Animator に攻撃アクションの State を追加します。
 Hierarchy タブ -> unitychan_dynamic_locomotion を選択
 Animator タブ -> パネル内右クリック -> Create State -> Empty
 Inspector タブ -> New State を Attack に変更
 Motion 右端の○をクリック
 Select Motion ダイアログで Assets タブ -> SLIDE00 をダブルクリック
さらに State 間の遷移(Transition)を作成します。
 Any State で右クリック -> Make Transition -> Attack をクリック
 左下の Parameters 右の + をクリック -> Trigger
 New Trigger を Attack に変更
 先ほど追加した Trasition(矢印) をクリック
 Inspector タブ -> Conditions を Attack に変更
同様に Attack -> Idle への Transition を作成します。Conditions は Exit Time 0.50 にします。
のちに動きを確認したとき、反応が遅ければ、Transition のスライダを左に動かして遷移時間を短くしてみてください。



スクリプト作成


Trigger をセットするスクリプトを作成します。
 Assets 内に Javascript で UnityChanScript を作成
 スクリプトを Hierarchy タブ -> unitychan_dynamic_locomotion にドロップ
 スクリプトを編集
/**
 * ユニティちゃんスクリプト。
 *
 * @author 2014/08/31 matsushima
 */

#pragma strict

var animator: Animator;

function Start () {
	animator = gameObject.GetComponent(Animator);
}

function Update () {
	if (Input.GetButtonDown ("Fire1")) {
		animator.SetTrigger("Attack");
	}
}
元のスクリプト Fire1 のコードをコメントアウトしておきます。
 Main Camera の TirdPersionGamera の 41-50 行目をコメントアウト
		void FixedUpdate ()	// このカメラ切り替えはFixedUpdate()内でないと正常に動かない
		{
/*		
			if (Input.GetButton ("Fire1")) {	// left Ctlr	
				// Change Front Camera
				setCameraPositionFrontView ();
			} else if (Input.GetButton ("Fire2")) {	//Alt	
				// Change Jump Camera
				setCameraPositionJumpView ();
			} else {	
				// return the camera to standard position and direction
				setCameraPositionNormalView ();
			}
*/		}
ついでに画面のテキストも消します。
 unitychan_dynamic_locomotion の FaceUpdate の 18-30 行目の OnGUI() をコメントアウト
 unitychan_dynamic_locomotion の UnityChanControlScriptWithRgidBody の 181-190 行目の OnGUI() をコメントアウト
 unitychan_dynamic_locomotion の RandomWind の 38-42 行目の OnGUI() をコメントアウト

この状態で再生してみます。
左 Ctrl キーでスライディングすれば OK です。



敵キャラにアクションの追加

敵キャラも同様に Animator を修正します。
State
 Idle
  Motion: Assets/TinyMonsterPack/Animations/idle.anim
 Walk
  Motion: Assets/TinyMonsterPack/Animations/walk.anim
 Attack
  Motion: Assets/TinyMonsterPack/Animations/attack.anim
 Damage
  Motion: Assets/TinyMonsterPack/Animations/jump.anim
Parameters
 Damage Trigger
 Attack Trigger
 Speed Float 0.0
Transition
 Idle -> Walk
  Conditions: Speed Greater 0
 Walk -> Idle
  Conditions: Speed Less 0.1
 Any State -> Attack
  Conditions: Attack
 Attack -> Idle
  Conditions: Exit Time 0.90
 Any State -> Damage
  Conditions: Damage
 Damage -> Idle
  Conditions: Exit Time 0.82



さらに EnemyScript という名前でスクリプトを作成し、bear にドロップします。
/**
 * 敵スクリプト。
 *
 * @author 2014/09/01 matsushima
 */

#pragma strict

var animator: Animator;

var STATE_IDLE: int = 0;
var STATE_WALK: int = 1;

var state: int = STATE_IDLE;

var stateTime: float;

var speed: float = 0;

var player: GameObject;

function Start () {
	animator = gameObject.GetComponent(Animator);
	stateTime = Time.time;
	/*for (var o: GameObject in GameObject.FindGameObjectsWithTag("Player")) {
		Debug.Log(o.name);
	}*/
	//player = GameObject.FindGameObjectWithTag("Player");
	player = GameObject.Find("unitychan_dynamic_locomotion");
}

function Update () {
	var timeNow: float = Time.time;
	switch (state) {
	case STATE_IDLE:
		if (timeNow - stateTime >= 5) {
			state = STATE_WALK;
			stateTime = timeNow;
		} else {
			speed = Mathf.Max(0, speed - Time.deltaTime);
		}
		break;
	case STATE_WALK:
		if (timeNow - stateTime >= 5) {
			state = STATE_IDLE;
			stateTime = timeNow;
		} else {
			speed = Mathf.Min(1, speed + Time.deltaTime);
		}
		break;
	}
	// 攻撃
	var distance: Vector3 = player.transform.position - transform.position;
	if (distance.magnitude <= 1.0f) {
		animator.SetTrigger("Attack");
	}
	// 移動
	animator.SetFloat("Speed", speed);
	if (speed > 0) {
		var direction: float = Mathf.Atan2(distance.x, distance.z);
		// プレイヤー方向に回転
		transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0, direction * 180 / Mathf.PI, 0), Time.deltaTime);
		// プレイヤー方向に移動
		transform.position.x += Mathf.Sin(direction) * Time.deltaTime * speed;
		transform.position.z += Mathf.Cos(direction) * Time.deltaTime * speed;
	}
}
この状態で再生してみます。
敵が近づいてきて攻撃してくれば OK です。



ユニティちゃんライセンス

このアセットは、『ユニティちゃんライセンス』で提供されています。このアセットをご利用される場合は、『キャラクター利用のガイドライン』も併せてご確認ください。


→ 3-3. Unity でユニティちゃんアクションゲームを作る - 当たり判定の追加
← 3-1. Unity でユニティちゃんアクションゲームを作る - キャラクターの配置
↑ 一覧