質問: Unityの初心者向けチュートリアルの玉転がしのItem回収の質問です ``` using UnityEngine; using System.Collections; public class Item : MonoBehaviour { // トリガーとの接触時に呼ばれるコールバック void OnTriggerEnter (Collider hit) { // 接触対象はPlayerタグですか? if (hit.CompareTag ("Player")) { // このコンポーネントを持つGameObjectを破棄する Destroy(gameObject); } } } ``` アイテムがボールと接触時に破壊されるはずなのですがなぜかボールがアイテムをすり抜けていってしまいます。 トリガーに設定済みです。 リンク内容 こちらのウェブサイトにのせてあるコードをそのまま使いました。
回答: > > プレイヤー側もプレイヤータグを指定しなければいけないのはなぜでしょうか > > > 例え話をします。 神様(=開発者。つまり質問主さん)は思いました。 **「アイテムにプレイヤーオブジェクトがぶつかったら、そのアイテムは消滅させよう」** そこでまず、アイテムの性質を決めるクラス`Item.cs`を作りました。 以後、アイテムにさせたい働きはここに書き込んでいくことにします。 アイテムに何かのオブジェクトがぶつかった時、このぶつかった相手のオブジェクトを「hit」とします。 コードで書くとこうなります。 `void OnTriggerEnter (Collider hit) { }` もしこのhitがプレイヤーオブジェクトなら、アイテムは消滅しなくてはいけません。 もしこのhitがプレイヤーオブジェクトでないなら、アイテムは消滅してはいけません。 このhitがプレイヤーオブジェクトかどうか、どう判断しましょうか? 判断を下す方法の1つが「タグ」です。 神様は**「プレイヤーオブジェクトには"Player"というタグを付ける」**と決めました。 こう決めておけば、**hitのタグが"Player"なら、hitはプレイヤーオブジェクトである**と言えるでしょう。 こうして「hitのタグが"Player"であるならば」という条件分岐を用いて判断を下せるようになりました。 `if (hit.CompareTag ("Player")) { }` さて、ここで1つの疑問が生まれることでしょう。 「もしプレイヤーではないオブジェクトに"Player"タグが付いていて、アイテムにぶつかったらどうなるんだ?」 今回のスクリプトだと、アイテムは消滅します。 アイテムが有している判断材料は「hitのタグが"Player"かどうか」だけだからです。 見ているのは相手のタグだけで「hitが実際はどんなオブジェクトなのか」は知るところではありません。 だから**ぶつかった相手のタグが"Player"だったら、それがプレイヤーオブジェクトだろうがアイテムオブジェクトだろうが消滅します。** そうならないように、**神様は責任を持って、プレイヤーオブジェクトにはPlayerタグを付け、そうでないオブジェクトにはPlayerタグを付けないようにしなければいけない**のです。 (よってアイテムオブジェクトにPlayerタグを付けるのは本来間違いです。アイテムオブジェクト同士が絶対にぶつからないならば影響はありませんが) もちろん判断を下す方法はタグ以外にもあります(オブジェクトの名前で判断する、付いているコンポーネントで判断するなど)が、それはまた別のお話。