Developer

【Unity実践】#23 アセット編 ~ ドラゴンの作成 part3 ~【Boxゲーム】
2021.06.29
Lv2

【Unity実践】#23 アセット編 ~ ドラゴンの作成 part3 ~【Boxゲーム】

今回の内容

ドラゴン作成の第3回目となります。
ドラゴンのアニメーションの作成とその他の微調整を行って、
今回でドラゴンに関しては完成となる予定です!

※初めての方はこちらから
【第1回記事】この連載について

アニメーターコントローラーの作成

ドラゴンのアニメーションとして、以下の2つの状態を作成したいと思います。
・Idle(待機状態)
・Attack(炎を吐き出すとき)

まずは Assets > Animations 以下に、Animator Controller を新規作成して、
名前を DragonAnimController としてください。

さらにこれを、GreenDragon の Animator に設定しましょう。

あとは DragonAnimController を編集していきます。
アニメータービューでステートを作成して名前は Idle にしましょう。

作成した Idle を選択して、Motionの項目に以下を設定してください。
FreeDragons > Animations > DragonSoulEater > Idle > Idle

さらに新規ステートで Attack を作成して、Any State から遷移する設定としましょう。

Parametersタブで、Trigger型の AttackTrigger というパラメータを作成し、
これを Any State => Attack への遷移の条件としましょう。

Attackステートのモーションには以下を設定してください。
FreeDragons > Animations > DragonSoulEater > Fireball Shoot > Fireball Shoot

さらに追加で、Attackステートの以下の項目を設定して下さい。

設定したアニメーションの前半部分が不要だったので、
Cycle Offset を 0.5 とすることでアニメーションの中間から再生する設定としています。
Speed はアニメーションが終了するまでが早すぎたので遅らせる目的で変更しています。

ここまでで一旦アニメーターコントローラーの作成は完了です。

スクリプトで攻撃アニメーションを再生する

炎を吐く際に先ほど作成した Attack を再生させます。
DragonScript を編集して、以下のように記述して下さい。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DragonScript : MonoBehaviour
{
    public GameObject Fire;
    public bool isDamaged;
    Quaternion DefaultRot;
    Animator anim;

    void Start()
    {
        DefaultRot = transform.rotation;
        anim = GetComponent<Animator>();
    }

    void Update()
    {
        if (isDamaged) Destroy(gameObject);
    }

    private void OnTriggerStay(Collider other)
    {
        if (other.isTrigger) return;

        if(other.tag == "Player" && !StageControllerScript.isGameOver)
        {
            // ターゲット位置
            Vector3 targetPos = other.bounds.center;

            // プレイヤー以外のレイヤマスク
            int layerMask = ~(1 << other.gameObject.layer);

            // プレイヤー以外を対象にLinecastして、ヒットするかチェック
            // ヒットしなければ、炎を吐く
            if (!Physics.Linecast(transform.position, targetPos, layerMask, QueryTriggerInteraction.Ignore))
            {
                if (!Fire.activeSelf)
                {
                    transform.LookAt(other.transform);
                    Fire.SetActive(true);
                    Invoke("DisableFire", 1.0f);

                    anim.SetTrigger("AttackTrigger");
                }
            }
        }
    }

    private void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.tag == "Player")
        {
            collision.gameObject.GetComponent<PlayerScript>().isDamaged = true;
        }
    }

    void DisableFire()
    {
        Fire.SetActive(false);
        transform.rotation = DefaultRot;
    }
}

記述ができたらシーンを再生してみましょう。
以下の様に、炎を吐く際に口を開くアニメーションが再生されていればOKです。

プレハブの整理

最後にプレハブの整理として、以下の対応を行っておきましょう。
・GameScene3 の プロトタイプの Dragon を削除

・GreenDragon のプレハブを Prefabs フォルダ内に作成

ここまででドラゴンの作成は完了としたいと思います。

おわりに

前々回から3回にわたってドラゴンの作成を行いましたがこれで完了となります。
また、今回でこの連載のメインセクションは一旦完了となります。

ただし、連載の都合で雑に実装してきている箇所があるのでそういった細かい点の修正や、
業務上でのTipsのような内容を番外編として次回以降の記事で紹介したいと思います。

というわけでもう少しだけ、連載は続きますので是非そちらもご覧頂ければと思います。

 
 

連載目次リンク

実践Unityゲームプログラミング 連載目次
 

関連する連載リンク

「初心者のための」Unityゲーム制作 目次
 

© Unity Technologies Japan/UCL