【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コース」を受講してから一気に色々なことができるようになりました。(メンターさんにいつでも質問できるのが大きかったです。)
もっとUnityで色々なアプリを作れるようになりたい!という方はぜひUnityコースを受講することを考えてみてください!
確実に今よりは成長しますので!
興味のある方は下記の記事にUnityコースの詳細をまとめていますので、そちらもどうぞ!