ソースはこちらで公開しています。
https://github.com/matsushima-terunao/unity-chan
実際のゲームはこちら
http://ter.dip.jp/blog_unity/unity-chan/build/web/web.html
既存の 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 にドロップ
スクリプトを編集
Main Camera の TirdPersionGamera の 41-50 行目をコメントアウト
unitychan_dynamic_locomotion の FaceUpdate の 18-30 行目の OnGUI() をコメントアウト
unitychan_dynamic_locomotion の UnityChanControlScriptWithRgidBody の 181-190 行目の OnGUI() をコメントアウト
unitychan_dynamic_locomotion の RandomWind の 38-42 行目の OnGUI() をコメントアウト
この状態で再生してみます。
左 Ctrl キーでスライディングすれば OK です。
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 にドロップします。
敵が近づいてきて攻撃してくれば OK です。
→ 3-3. Unity でユニティちゃんアクションゲームを作る - 当たり判定の追加
← 3-1. Unity でユニティちゃんアクションゲームを作る - キャラクターの配置
↑ 一覧
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 でユニティちゃんアクションゲームを作る - キャラクターの配置
↑ 一覧
0 件のコメント:
コメントを投稿