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

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

ただいまの
回答率

90.51%

  • Unity

    5507questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

Unity 衝突の優先順位化

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 264

sanmaguro

score 1

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);
        }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • sakura_hana

    2018/10/17 17:06

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

    キャンセル

  • sakura_hana

    2018/10/17 17:07

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

    キャンセル

  • sanmaguro

    2018/10/17 19:07

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

    キャンセル

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

同じタグがついた質問を見る

  • Unity

    5507questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。