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

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

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

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

Q&A

0回答

2772閲覧

Unity 衝突の優先順位化

sanmaguro

総合スコア7

Unity

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

0グッド

0クリップ

投稿2018/10/16 05:16

Unityで衝突判定の優先順位化をしたいです
現在はList化を行って判別を付けていますが
当たった後に出てほしいプログラムが出てきません

間違っている点、解決策ございましたらお願いします

内容

A~Cの三つのobjectを判断します
Playerに対してそれぞれ当たった時にobjectを出現させたいです
優先順位としてはA=B>Cです
A,Bが重なることはありませんがCはどちらとも重なることがあるため
衝突の判断がしたいです

つたない文章で申し訳ございませんがご教授いただけますようお願いします

using System.Collections; using System.Collections.Generic; using UnityEngine; public class List : MonoBehaviour { CircleCollider2D cc; // Rigidbody2D rd2d; void Awake() { cc = gameObject.AddComponent<CircleCollider2D>() as CircleCollider2D; cc.isTrigger = true; // rd2d = gameObject.AddComponent<Rigidbody2D>() as Rigidbody2D; // rd2d.bodyType = RigidbodyType2D.Kinematic; } private List<GameObject> myList = new List<GameObject>(); void OnTriggerEnter2D(Collider2D coll)//TriggerEnter2D When player is hit enemy, it is stored in myList { if (coll.gameObject.CompareTag("Mogura") && !myList.Contains(coll.gameObject)) myList.Add(coll.gameObject); if (coll.gameObject.CompareTag("Cat") && !myList.Contains(coll.gameObject)) myList.Add(coll.gameObject); if (coll.gameObject.CompareTag("Plane1") && !myList.Contains(coll.gameObject)) myList.Add(coll.gameObject); if (coll.gameObject.CompareTag("Plane2") && !myList.Contains(coll.gameObject)) myList.Add(coll.gameObject); } void OnTriggerExit2D(Collider2D coll)//TriggerExit2D Delete myList when enemy leaves from player { if (coll.gameObject.CompareTag("Mogura") && myList.Contains(coll.gameObject)) myList.Remove(coll.gameObject); if (coll.gameObject.CompareTag("Cat") && myList.Contains(coll.gameObject)) myList.Remove(coll.gameObject); if (coll.gameObject.CompareTag("Plane1") && !myList.Contains(coll.gameObject)) myList.Add(coll.gameObject); if (coll.gameObject.CompareTag("Plane2") && !myList.Contains(coll.gameObject)) myList.Add(coll.gameObject); } void Update() { int damage1 = 0; foreach (GameObject go in myList) { damage1 += (go.name == "Moguraprefab") ? 2 : 0; damage1 += (go.name == "Catprefab") ? 1 : 0; damage1 += (go.name == "Plane1") ? 1 : 0; damage1 += (go.name == "Plane2") ? 1 : 0; } { if (damage1 == 3) { GetComponent<MoguraPlayer>(); } else if (damage1 == 2) { GetComponent<CatPlayer>(); } if (damage1 == 1) { GetComponent<NonPlayer>(); } Destroy(gameObject); } } }

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

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

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

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

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

sakura_hana

2018/10/17 02:32

解決するか分かりませんが、「void Update()」を「void FixedUpdate()」にするとどうでしょうか?
sanmaguro

2018/10/17 03:02

変化なく、Objectは出てきませんでした。ご回答いただきありがとうございました、もう少し検討してみようと思います
sakura_hana

2018/10/17 04:21

ちゃんと読んでませんでしたが、「オブジェクトが出て来る」とはどういうことですか? 今のスクリプトだとそれに該当するソースが無いので出て来ようがありません。  また、ABCと判断するとのことですがソース内で分岐しているのは4種類ですし、「このソースが付いているオブジェクトとの衝突」でいいのかも疑問です(このソースが付いているオブジェクト=Playerなら、Destroy(gameObject);してしまっていいのか?と思います)。
sanmaguro

2018/10/17 04:39

説明不足ですみません。objectが出てくるScriptがあるのでif文で動作の制御をおこなおうと考えています。ABCの判断に関してですが、A,B,C×2という状態です。Playerと表記しましたが実際は透明なオブジェクトが本体であり動作制御のflagとして使用しているためDestroyしてますのでオブジェクト=Playerではなくif文で動作したScriptによって出現したオブジェクト=今回申し上げているobject ということになります。説明を簡略化しようとしたため混乱を招いてしまいすみません
sakura_hana

2018/10/17 05:47

やはりよく分かりません。とりあえず問題点として、質問内のコードは衝突判定後に何もしていません。GetComponent<〜〜>();していますが、コンポーネント取得後に何もしていないので当然何も起こりません。(強いて言えばDestroy(gameObject);の為に「このオブジェクトが消える」だけは起こる) 「条件分岐が正しいのか」を調べたいならDestroyの前の行に「Debug.Log(damage1);」とでもすればif分岐の結果は分かります。「オブジェクトの生成方法が分からない」ということなら「unity オブジェクト 生成」あたりで検索してください。
sanmaguro

2018/10/17 06:45

説明がうまくできずにすみません、Get~が動いていなかったんですね。もう少しちゃんと調べてみます。説明不足な質問に丁寧に対応していただきありがとうございました。
sakura_hana

2018/10/17 06:59

厳密には、エラーが出ていないならGetComponentは正しく動いています。その後何もさせていないのが問題です。「このオブジェクトに付いているMoguraPlayerを取得しました」……で?という状態なのです(本来ならその後、取得したMoguraPlayerのメソッドや変数を呼ぶはず)。  https://teratail.com/help/question-tips こちらや質問のテンプレートを参考に情報を整理するといいかと思います。
sanmaguro

2018/10/17 07:06

長くお付き合いいただいて申し訳ないのですが一点だけ質問させてください。GetComponentの<>の中はスクリプト名が入るのだと思っているのですが違うのでしょうか?Triggerで反応して次にGet~のスクリプトが呼べるものという認識が間違っていたということでしょうか。(エラーは出ていません)
sakura_hana

2018/10/17 08:06

「GetComponentの<>の中はスクリプト名が入る」は正しいです(正確には「コンポーネント名」です。自作スクリプトの他に「SpriteRenderer」等のデフォルトコンポーネントも入れられます)。 「Triggerで反応して次にGet~のスクリプトが呼べる」は、見た目上はそうですが直接の因果関係は無いです。「毎フレーム衝突判定→衝突してたらOnTriggerEnter2Dが呼ばれる→リストにGameObjectが入る」「毎フレームUpdateが呼ばれる→myListの中身をチェック→if文に当てはまっていたらGetComponent実行」という2つの動きが並列して起こっています。
sakura_hana

2018/10/17 08:07

ちなみに上記で「毎フレーム」と書きましたが、厳密には別物です。衝突判定はデフォルトだと(Unity2018の場合)0.0167秒毎に実行(秒数は常に固定)。Updateはその時のフレームレートによって頻度が変わります(そしてフレームレートは設定や負荷によって変わる)。最初に「FixedUpdateでは?」と訊いたのはこれが理由で、FixedUpdateなら衝突判定と同じ間隔で実行される為、物理演算と絡めた処理はこちらを使うのがセオリーです。詳しくは「FixedUpdate」で検索してみてください。
sanmaguro

2018/10/17 10:07

丁寧な回答ありがとうございます。Componentについて調べてもうまく使えなかったのでやっと理解できました。FixedUpdateについても調べてみます。説明が不足しているにもかかわらず丁寧に説明していただき本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問