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


今回の内容


今回はドラゴンの作成の第2回目です。
・プレイヤーが炎に触れたらゲームオーバーにする
・ドラゴンをギミックで倒せるように
・プレイヤーがドラゴンに触れたらゲームオーバーにする
これら3点を実装します!

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

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

炎のスクリプトを追加


プレイヤーが炎に触れるとゲームオーバーになる処理を作成します。
今回は、炎にスクリプトをアタッチして、OnTriggerEnter でプレイヤーにダメージを与えます。

新規スクリプト「FireScript」を作成して以下を記述しましょう。

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

public class FireScript : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if(other.tag == "Player")
        {
            other.GetComponent<PlayerScript>().isDamaged = true;
        }
    }
}

Fire(Dragon の子オブジェクト)にアタッチしたら、シーンを再生しましょう。

これでプレイヤーが炎に触れると、ダメージを受けてゲームオーバーとなります。

トラップでドラゴンを倒せるようにする


以前作成したトラップを使って、ドラゴンを倒す仕組みを実装します。
まずはドラゴンにダメージを受けた際のフラグを追加して、消滅する処理を実装しましょう。
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")
        {
            // ターゲット位置
            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);
                }
            }
        }
    }

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

次に、TrapScript に以下を追記します。

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

public class TrapScript : MonoBehaviour
{
    private void OnCollisionEnter(Collision other)
    {
        if (other.gameObject.tag == "Player")
        {
            other.gameObject.GetComponent<PlayerScript>().isDamaged = true;
        }

        if (other.gameObject.tag == "Dragon")
        {
            other.gameObject.GetComponent<DragonScript>().isDamaged = true;
        }
    }
}

「Dragon」タグの付いたオブジェクトと衝突するとダメージを与えるようしています。

最後にDragonオブジェクトに「Dragon」タグの設定と、Rigidbodyコンポーネントを追加しましょう。

ここまでで実装は完了です。
シーンにトラップを追加してテストしてみましょう。

ドラゴンがトラップに触れると消滅していれば成功です。

プレイヤーがドラゴンに触れるとゲームオーバーにする


プレイヤーがドラゴンに触れた時にゲームオーバーとする処理を実装します。
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")
        {
            // ターゲット位置
            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);
    }
}

今のシーンの配置だとテストができないので、一時的に以下の様に、
床を伸ばしてドラゴンの向きを変えると、テストができます。

テスト後は、配置は元にもどしておきましょう。

※補足:コライダーが無いのにOnCollisionEnter・・?
Dragonオブジェクトを見てみると、特にコライダーは設定されていないのに、
DragonScript の OnCollisionEnter は実行されているので疑問に思うかもしれません。

なぜコライダーがないのに衝突判定ができているかというと、Dragon の Rigidbodyコンポーネントがカギとなっています。
コライダー関連の特徴として、

Rigidbody が設定されていると、子オブジェクトのコライダーも適用される

と言う特徴があります。
結構大事な特徴なので覚えておきましょう。

おわりに


今回はここまでとなります。
残す実装として、
・ドラゴンが対象の方向を向くように
次回はこの機能の実装と細かい点の修正を行いたいと思います!

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


連載一覧

1.導入・準備編 ~ この連載について ~
2.導入・準備編 ~ 初期設定とUIの作成 ~
3.プロトタイプ編 ~ 壁・床・天井の作成 ~
4.プロトタイプ編 ~ プレイヤー作成 part1 ~
5.プロトタイプ編 ~ プレイヤー作成 part2 ~
6.プロトタイプ編 ~ プレイヤー作成 part3 ~
7.プロトタイプ編 ~ 箱の作成 part1 ~
8.プロトタイプ編 ~ 箱の作成 part2 ~
9.プロトタイプ編 ~ シーンの制御 part1 ~
10.プロトタイプ編 ~ シーンの制御 part2 ~
11.プロトタイプ編 ~ ゴール・トラップの作成 ~
12.プロトタイプ編 ~ ギミック(ドラゴン)の作成 part1 ~
13.プロトタイプ編 ~ ギミック(ドラゴン)の作成 part2 ~(今回の記事)
14.プロトタイプ編 ~ ギミック(ドラゴン)の作成 part3 ~
15.アセット編 ~ アセットストアの使い方と壁・床・天井への適用 ~
16.アセット編 ~ 箱の作成 part1 ~
17.アセット編 ~ 箱の作成 part2 ~
18.アセット編 ~ トラップの作成 ~
19.アセット編 ~ ゴールの作成 ~
20.アセット編 ~ 背景の作成 ~
21.アセット編 ~ ドラゴンの作成 part1 ~
22.アセット編 ~ ドラゴンの作成 part2 ~
23.アセット編 ~ ドラゴンの作成 part3 ~

 

© Unity Technologies Japan/UCL

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

PAGE TOP