unity

【Unity】OnCollision/Triggerで接触したオブジェクトの親を取得する方法【超簡単】

こんにちは、しろうです。

昨日、作成していたAppleStoreにリリースするためのアプリが完成したので、次はスキルアップのためにUnityroomに公開するミニゲームを作ろう思って早速作業に取り掛かっていた時に

しろう
しろう
Collisionで接触したオブジェクトの親オブジェクトのコンポーネントを取得したいんだけど、どうすればいいんだっけ!?

となって、15分ぐらい足踏みしてしまったので忘れないように、また、同じように困っている人向けに書き残しておきます(*´ω`*)ノ

どうしてOnCollision/Triggerで接触したオブジェクトの親を取得したかったのか?

一応、説明しておきますと一人称のシューティングゲームを昨日まで作っていて、

しろう
しろう
頭と体で与えられるダメージの大きさを変えたい!

と思ったので、親に【敵ステータススクリプトを持ったオブジェクト】、子に【体(or頭)のコライダーを持ったオブジェクト】を作って、子に当たったら親オブジェクトのステータススクリプトを取得して、ダメージを与えようとしたという経緯です。

さて、それではサクッと説明していきます。

親オブジェクトを取得する方法

親オブジェクトを取得するのは下記の二つのコードが使えます。

transform.root.gameObject ; //階層の一番上のオブジェクトを取得
transform.parent.gameObject; //1つ上のオブジェクトを取得

「root」を使えば階層の一番上(親)のオブジェクトを取得できて、
「parent」を使えば1つ上の親オブジェクトを取得できます。

「transform」を使うっていうのが慣れないから困りますね、、、

それでは実際に使ってみましょう。

今回は上記の画像のような階層があるとします。

また、BodyオブジェクトにはBodyタグ、ArmオブジェクトにはArmタグが付いている。
親のEnemyオブジェクトは敵のステータスが格納されているEnemyStatusスクリプトがアタッチされていると思ってください。

「transform.root.gameObject ; 」を使う例

例えば、下記画像の階層になっているオブジェクトがあったとして、『子(「Arm」オブジェクト)に接触した時に一番の親(「Enemy」オブジェクト)のEnemyStatusコンポーネント を取得したい!』という時は下記のようになります。

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

public class CollisionGet : MonoBehaviour
{        

    private EnemyStatus enemyStatus;

    private void OnTriggerEnter(Collider other)
    {
        if(other.gameObject.tag == "Arm")
        {
            enemyStatus = transform.root.gameObject.GetComponent<EnemyStatus>();
        }
    }
}

これは実際に僕が使ったパターンのコードです。

簡単に説明しておくと、

OnTriggerEnterで当たった時に処理を呼び出し、当たったオブジェクトのタグがArmだったら、変数enemyStatusに接触したオブジェクト(今回は「Arm」)の最も親のオブジェクト(今回は「Enemy」)のEnemyStatusコンポーネントを格納する

という処理をしています。

しろう
しろう
うん、かなり便利!

ちなみにOnCllisionで使いたい時は下記のように関数と引数の型を変えてやればOK。

private void OnCollisionEnter(Collision collision)

「transform.parent.gameObject ; 」を使う例

それでは「子(Bodyオブジェクト)に接触した時に一つ上の親(Enemyオブジェクト)のコンポーネント を取得したい!」という時のコードもみておきましょう。

下記のようになります。

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

public class CollisionGet : MonoBehaviour
{        

    private EnemyStatus enemyStatus;

    private void OnTriggerEnter(Collider other)
    {
        if(other.gameObject.tag == "Body")
        {
            enemyStatus = transform.parent.gameObject.GetComponent<EnemyStatus>();
        }
    }
}

とっても簡単ですね。

これを知っているだけでも何かと便利なことはあるはず。(主にシューティング系で)

まとめ

自分のためにももう一度まとめておくと、下記の通りです。

transform.root.gameObject ; //階層の一番上のオブジェクトを取得
transform.parent.gameObject; //1つ上のオブジェクトを取得

これでもう忘れませんね!(絶対忘れますがw)

ちなみにこのコードを使ったミニゲーム「MonsterShooting」はUnityroomに公開してありますので、ぜひ遊んでみてください!(バグって音楽はありませんがご了承くださいw)

それでは皆さんも良いUnityライフを(*・ω・)ノ

Unityスキルをもっと上達させたい方へ

僕も最初の頃はUnityを独学でやっていたのですが、その頃は全くダメでした。笑

でもテックアカデミーのUnityコースを受講してから一気に色々なことができるようになりました。(メンターさんにいつでも質問できるのが大きかったです。)

だいたい2ヶ月で学生なら16万、大人なら20万ぐらいで通えるので将来のことを考えると、賢い自己投資かと思います。

もっとUnityで色々なアプリを作れるようになりたい!という方はぜひUnityコースを受講することを考えてみてください!

確実に今よりは成長しますので!

興味のある方は下記の記事にUnityコースの詳細をまとめていますので、そちらもどうぞ!

テックアカデミーのUnityコースを受講した正直な感想【ゲームをリリース出来ました】 先日、テックアカデミーのUnityコースを2ヶ月間受講しまして、無事AppleStoreにアプリをリリースすることができまし...