【Unityゲーム作成①】プロトタイプ編 ~ ギミック(ドラゴン)の作成 part3 ~


今回の内容


今回はドラゴンの作成の第3回目で、完成まで実装を進めます!

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

★前回までのソースコード
GitHub

プレイヤーが倒れたら炎を吐かないようにする


前回までの実装では、プレイヤーが倒れたあともドラゴンが炎を吐き続けていました。

仕様的としてこのままと言う手もありますが、今回は吐きやめる形で進めます。
これは簡単で、DragonScript を修正してゲームオーバー時に炎を吐かないようにします。

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

public class DragonScript : MonoBehaviour
{
    public GameObject Fire;
    public bool isDamaged;

    void Start()
    {
        
    }

    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)
                {
                    Fire.SetActive(true);
                    Invoke("DisableFire", 1.0f);
                }
            }
        }
    }

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

    void DisableFire()
    {
        Fire.SetActive(false);
    }
}

ゲームオーバー時に再度炎を吐いていなれば成功です。

プレイヤーの方向を向くようにする


ドラゴンがプレイヤーの向きを向くようにします。
ついでに、炎を吐き終えると元の向きに戻るような仕様とします。

DragonScript に追記して、以下の様にしましょう。

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

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

    void Start()
    {
        DefaultRot = transform.rotation;
    }

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

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

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

対象の向きを向く処理
39行目の transform.lookAt で実装しています。
メソッド名の通り、引数の Transform の方向を向いてくれます。

(関連記事)
Transformコンポーネントの便利な関数まとめ

向きを元に戻す処理
DefaultRot に初期状態での向きを保存しておきます。
炎を吐きやめる処理(DisableFire)で、向きを DefaultRot にすることで元に戻しています。

=======================================

記述ができたら、ドラゴンの向きを画面手前に変更しましょう。

シーンを再生して、炎を吐いた後に正面に向き戻れば成功です。

一旦これでプロト段階でのドラゴンは完成となるので、最後に Dragon をプレハブ化だけしておきましょう。

おわりに


今回の内容はちょっと短めですがここまでとなります。
プロトタイプ編についてはここまでで一区切りとして、次回からはアセット適用編へと進む予定です。

アセットを適用することで、ゲームらしさが一気に増してきますのでお楽しみに!

★今回までのソースコード
GitHub


 

© Unity Technologies Japan/UCL

  • このエントリーをはてなブックマークに追加

PAGE TOP