質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2942閲覧

Unity、接触判定について

_-.123ray

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/12/18 04:08

Unityの初心者向けチュートリアルの玉転がしのItem回収の質問です

using UnityEngine; using System.Collections; public class Item : MonoBehaviour { // トリガーとの接触時に呼ばれるコールバック void OnTriggerEnter (Collider hit) { // 接触対象はPlayerタグですか? if (hit.CompareTag ("Player")) { // このコンポーネントを持つGameObjectを破棄する Destroy(gameObject); } } }

アイテムがボールと接触時に破壊されるはずなのですがなぜかボールがアイテムをすり抜けていってしまいます。
トリガーに設定済みです。

リンク内容
こちらのウェブサイトにのせてあるコードをそのまま使いました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakura_hana

2018/12/18 04:17

「Playerにタグを設定する」の項目はやっていますか?(すり抜け自体はisTriggerがオンの時の正しい挙動です)
_-.123ray

2018/12/18 04:19

はい。すべてのアイテムのタグにPlayerを選択しています。
sakura_hana

2018/12/18 04:36

アイテムではなく「Playerオブジェクト」にPlayerタグを指定です。
_-.123ray

2018/12/18 04:44

してなかったです。今タグを変えてきたところ、アイテムが破壊されるようになりました。アイテム側はタフを設定するのは理解できるのですがプレイヤー側もプレイヤータグを指定しなければいけないのはなぜでしょうか....昨日始めたばかりの初心者で....
sakura_hana

2018/12/18 05:22

長くなったので回答に投稿しました。
_-.123ray

2018/12/18 05:30

読みました、本当にありがとうございました!
guest

回答1

0

ベストアンサー

プレイヤー側もプレイヤータグを指定しなければいけないのはなぜでしょうか

例え話をします。

神様(=開発者。つまり質問主さん)は思いました。
「アイテムにプレイヤーオブジェクトがぶつかったら、そのアイテムは消滅させよう」

そこでまず、アイテムの性質を決めるクラス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タグを付けるのは本来間違いです。アイテムオブジェクト同士が絶対にぶつからないならば影響はありませんが)

もちろん判断を下す方法はタグ以外にもあります(オブジェクトの名前で判断する、付いているコンポーネントで判断するなど)が、それはまた別のお話。

投稿2018/12/18 05:21

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_-.123ray

2018/12/18 05:29

完璧に理解いたしました....あなた様が神です.... 本当はアイテムにはプレイヤータグは必要なかったんですね。今回の場合プレイヤーという名前で判断しているのではなく、タグで判断しているのでそのタグのある物体居合消滅しないと、、、、 すごくわかりやすかったです。誠にありがとうございました。
sakura_hana

2018/12/18 05:29

補足。 他人のコードや作り方を見る時は「なぜそれをやっているのか」を把握してください。 サンプルページのコード内や説明ページには > 今回はシンプルで汎用的な「タグを確認する」方法を採用します。〜中略〜この接触対象のタグを調べ、Playerならば特別な処理を行うようにItemコンポーネントを以下のように修正します。 > // 接触対象はPlayerタグですか? > Playerオブジェクト側も設定しましょう。先ほど「Playerタグを持つオブジェクトと接触した場合」の処理を記述したため、PlayerオブジェクトにもPlayerタグが必要です。 などが丁寧に記載されています。 「ここはこういう意図でこうやっているんだな」ということを把握していくと、「じゃあ似た処理をしたい時にはこうすればいいのかな?」という発想が出やすくなります。 もちろん説明不足だったり筆者のミスだったりで意図が掴めないこともあるでしょうが、そういう時でも一度「こうなんじゃないかな?」という仮説を立てて、可能なら立証してください(難しかったら質問してください)。 その繰り返しが「プログラムの理解」に繋がります。
_-.123ray

2018/12/18 05:34

ほんとにその通りです........しっかり説明書があるのに読み込まなくてどうするんだって話ですよね........サンプルコードが与えられているからってそのままうつしたところで理解したことにはならないですね。これからのためにも肝に銘じておきます。ありがとうございました....!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問