『Unity5ゲーム開発レシピ』「Part02 応用編 Chapter01 キャラクターを制御する」 学習記録2

Unity5ゲーム開発レシピ ハマるゲーム制作のノウハウ

Unity5ゲーム開発レシピ ハマるゲーム制作のノウハウ

序文

『Unity5ゲーム開発レシピ』18日目。

この後もくもく会です。

reedex.connpass.com

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;
    }
}

実行結果

www.youtube.com

感想

やったこと。

  • 視界内にターゲットがいるか判定する仕組みの実装
  • 当たり判定を特定の部位のみ、特定のタイミングで有効にする仕組みの実装

応用編はソースコードの説明がほとんどないので、自力でコードを読み解いていかなければいけない。
そんなことで学習スピードがガクッと落ちました。

今ぐらいのレベルならちょうどいい難易度で読み解いていけるけど、これから難しいものも出てくるかも。

addComponent()メソッドでスクリプトからコンポーネントをアタッチすることもできるんですねぇ。
SphereColliderはどのオブジェクトにアタッチされてるんだ!?って探し回っちゃいました。

カロリーメイトください。

BGM

SPACE / KREVA

www.youtube.com