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

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

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

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

Unity

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

Q&A

解決済

2回答

2115閲覧

OnTriggerStayが実行されていないときにそれを検知、あるいは別の命令を実行したい

Beat-san

総合スコア2

C#

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

Unity

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

0グッド

0クリップ

投稿2021/10/06 08:20

編集2021/10/07 23:45

OnTriggerStayが働いていているならtrue、働いていないならfalseといった動きをさせたい

Unityで開発をしている際、ある一定範囲(Collider内)でオブジェクトが存在しているかどうかを検知させたいのですが、
そのオブジェクトがCollider内でDestroyされることもあるのでOnTriggerExitでCollider内に存在したままなのか否かが検知できません。
なのでOnTriggerStayが働いているか否かがわかる方法を教えていただきたいです。

該当のソースコード

C#

1private bool hoge=false; 2void OnTriggerStay(Collider other) 3{ 4 hoge=true; 5 //ここで検知するがOnTriggerStayが終わってもfalseにできない 6}

試したこと

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10173541710
https://teratail.com/questions/147655
https://teratail.com/questions/23252
https://teratail.com/questions/256065
このあたりの回答は見ました

また上にも述べましたがOnTriggerEnter,ExitはCollider内でDestroyされるとcallされないので使えません

何卒よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Unity 2019.4.8f

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

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

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

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

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

bboydaisuke

2021/10/06 08:27

考え方が逆で、やりたい事をコンピュータができることの範囲で実現しなければなりません。その「やりたい事」を実現するための方法が誤っているのでしょう。 コンピュータができることを理解した上で、その制限の元、やりたい事をどうすれば実現できるか、をもう一度考えた方がよいと思います。
Beat-san

2021/10/06 08:56

一切攻撃的な意図はなく、bboydaisukeさんのおっしゃることを否定するつもりでもなく、むしろ正しいことをおっしゃってると思うのですが、返答させていただきます。ご不快になられたら申し訳ございません。 今回私が考え、調べた中で質問にあるように解決方法が見つかりませんでした。 なのでbboydaisukeさんのおっしゃる、コンピュータができることの範囲も自分が調べてもわからない以上、私が質問している地点までが制限だと私は思います。 そのうえで自分の知らない知識をすでに持っている方、あるいはその制限を超えたことを知っている方がいれば、より効率よく問題解決ができるのかな、と思い質問をあげさせていただきました。 そのコンピュータができることの(今回はUnityですが)範囲をこのサイトで求めるのは間違っているのでしょうか? また質問への追記・修正の依頼へのコメントなのでお聞きしますが(bboydaisukeさんにそういった意図はないかもしれませんが)bboydaisukeさんのお話を基にすると具体的にはどのような修正をほどこせばよいでしょうか?
bboydaisuke

2021/10/06 09:21

この質問は「XY問題」になっていると思うので、まずはそれが何なのか調べてみるとよいと思います。
Beat-san

2021/10/06 13:19

なるほど、確かに書き込むばかりで質問が二重になってました。(本題と”理想的なのはOnTriggerStayが呼ばれなくなった瞬間にコールバックが飛ばせるとよいと思うのですが”の下りなどということ...でしょうか?)質問を見直して整理してみます。ありがとうございます。
退会済みユーザー

退会済みユーザー

2021/10/07 02:21

stay中のdestroyが問題ならOnDestroyでその場合の処理を行う、ではダメなのでしょうか?
Beat-san

2021/10/12 05:30

それも確かにいい解決法ですね!! ありがとうございます!
guest

回答2

0

なんかもっとうまいやり方ありそうな気がしますが・・・

  1. トリガー範囲内のやつにはスクリプトを追加
  2. そいつらのDestroy時のイベントを購読
  3. Destroyした場合はそいつをOntriggerExitしたことにする

みたいな流れでしょうか。スクリプトは試しながら書いて整理できてないのでもっと良くできると思います。(GetComponentが乱発してるのでほんとはあんまり良くないです)

NotifyObject

cs

1using UnityEngine; 2using System; 3 4public class NotifyObject : MonoBehaviour { 5 public event Action OnDestroyListener; 6 public event Action OnDisableListener; 7 8 private void OnDestroy() { OnDestroyListener?.Invoke(); } 9 private void OnDisable() { OnDisableListener?.Invoke(); } 10} 11

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Player : MonoBehaviour { 6 Rigidbody rb; // テスト用:キャラ動かすため 7 public List<Collider> myNotifyObjects = new List<Collider>(); // 自身の範囲内にあるトリガー対象 8 9 public GameObject test; // テスト用:範囲内でオブジェクトを消すテスト用 10 11 // Start is called before the first frame update 12 void Start() { 13 rb = GetComponent<Rigidbody>(); 14 } 15 16 // Update is called once per frame 17 void Update() { 18 // テスト用:キャラ動かして実験用 19 rb.velocity = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")); 20 21 // テスト用:スペースキーを押して設定したオブジェクトをDestroyしてみる 22 if (Input.GetKeyDown(KeyCode.Space)) { 23 Destroy(test); 24 } 25 } 26 27 private void OnTriggerStay(Collider other) { 28 if (!myNotifyObjects.Contains(other)) { 29 myNotifyObjects.Add(other); 30 31 var c = other.GetComponent<NotifyObject>(); 32 if (c == null) c = other.gameObject.AddComponent<NotifyObject>(); 33 34 c.OnDestroyListener += () => OnTriggerExit(other); 35 } 36 } 37 38 private void OnTriggerExit(Collider other) { 39 Destroy(other.gameObject.GetComponent<NotifyObject>()); 40 myNotifyObjects.Remove(other); 41 } 42 43} 44

キャラの範囲内に入る(TriggerStay)と、自身の管理するコライダーとして記憶
破壊や非表示を追跡するためのスクリプトを追加して、そのイベントを購読

範囲から出たら自身の管理するコライダーから削除。
Destroy or Disabledの場合は範囲から出たことにして削除 みたいな?

もっと綺麗に実現できそうですが、それは他の方におまかせしたいと思います…!

投稿2021/10/08 04:52

hogefugapiyo

総合スコア3302

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

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

0

ベストアンサー

あまり詳しくないので、ただのアイデアですが、Destroyするとき、消したいオブジェクトの座標をカメラ外のどこかに瞬間移動させて、消えたように見せてからDestroyされるのはどうでしょうか?
これなら、OnTriggerExitも反応するのではないでしょうか?
詳しくないので、見当違いなこと言ってたらすみません…

投稿2021/10/11 06:48

moory

総合スコア146

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問