
- 作者: BATA,まつだす
- 出版社/メーカー: 翔泳社
- 発売日: 2016/01/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
序文
『Unity5ゲーム開発レシピ』18日目。
この後もくもく会です。
Web系のもくもく会への参加は、今回でとりあえず一区切りにしようかなと思っています。
進捗
- Part02 応用編
- Chapter01 キャラクターを制御する
(学習時間:1.5時間)
コード実装部分
\Chapter1\PART02_CHAPTER01\003\before\dungeon\assets\Scripts\Attack.cs
using UnityEngine; using System.Collections; // animatorのステートにアタッチされるクラス public class Attack : StateMachineBehaviour { public string targetTagName; public float start, end; public float size = 0.5f; GameObject target; SphereCollider hitCollision; override public void OnStateEnter (Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // コリダーがアタッチされていなければ if (!hitCollision) { // 特定のタグがつけられたゲームオブジェクト(左足)を取得する foreach (var obj in GameObject.FindGameObjectsWithTag(targetTagName)) { // 取得したオブジェクトがanimatorがアタッチされているオブジェクト(ユニティちゃん)の子オブジェクトなら if (obj.transform.IsChildOf (animator.transform)) { // RidigbodyおよびSphereColliderコンポーネントを追加する obj.AddComponent<Rigidbody>(); hitCollision = obj.AddComponent<SphereCollider>(); hitCollision.radius = size; // 初期状態では無効にしておく(余計な干渉を避けるため?) hitCollision.enabled = false; break; } } } } override public void OnStateUpdate (Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // 現在のステート内経過時間 float currentTime = stateInfo.length * (stateInfo.normalizedTime % 1f); // 指定時間の間だけ衝突判定を有効にする if (currentTime > start && currentTime < end) { hitCollision.enabled = true; } else { hitCollision.enabled = false; } } override public void OnStateExit (Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // ステート終了時にはコリダーを無効にする hitCollision.enabled = false; } }
実行結果
感想
やったこと。
- 視界内にターゲットがいるか判定する仕組みの実装
- 当たり判定を特定の部位のみ、特定のタイミングで有効にする仕組みの実装
応用編はソースコードの説明がほとんどないので、自力でコードを読み解いていかなければいけない。
そんなことで学習スピードがガクッと落ちました。
今ぐらいのレベルならちょうどいい難易度で読み解いていけるけど、これから難しいものも出てくるかも。
addComponent()メソッドでスクリプトからコンポーネントをアタッチすることもできるんですねぇ。
SphereColliderはどのオブジェクトにアタッチされてるんだ!?って探し回っちゃいました。
カロリーメイトください。
BGM
SPACE / KREVA