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

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

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

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

Unity

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

Q&A

解決済

1回答

1468閲覧

OnTriggerStay2D はじめの数十フレームしか呼ばれない,他 挙動がおかしい?

UltraSuperMikan

総合スコア20

C#

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

Unity

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

0グッド

0クリップ

投稿2019/11/07 23:18

前提・実現したいこと

OnTriggerStay2Dが、接触時にきちんと毎フレーム呼ばれるように修正したい。

発生している問題・エラーメッセージ

// 以下, PlayerCtrlスクリプトからのDebug.Log()箇所の切り抜き ... void Update () { if (InputManager.Instance.UseButtonDown) Debug.Log("UseButtonDown By PlayerCtrl.Update()"); ... // 調査用コライダー処理 private void OnTriggerStay2D(Collider2D collision) { Debug.Log("OnTriggerStay2D() called"); if (InputManager.Instance.UseButtonDown) Debug.Log("UseButtonDown By PlayerCtrl.OnTriggerStay2D()"); // DEBUG 毎フレーム呼んでくれない? ...

イメージ説明

上記のようにして調べたところ、画像の「ラジオ」にプレイヤーの調査用コライダーを入れた際、OnTriggerStay2D()が正しく呼ばれていないようでした。
ラジオのコライダーに侵入したコンマ数秒間だけ、OnTriggerStayが呼ばれ、その後はうんともすんとも言わないようです。
一度ラジオから距離を取り、再びコライダーをぶつけると、同様に動作します。

また「アイテム使用ボタン」を連打しながら、同様にチェックしたところ、「キューを溜め込んでいる」というのでしょうか、コライダーを再度ぶつけてボタンを押下した際に、数回分まとめて押されたことになってしまいます。
(こちらは要検証。操作系統のバグかもしれませんが、Update().Debug.Log()で確認する限りは正しく取得できています。)

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

このプロジェクトを作成した初期段階から、よく現れる症状でして、その度に今回のようなデバッグを行ってきましたが、原因究明できませんでした。
大方組み上がってきて、自力で解決できそうにないと判断して、今回質問させていただいた次第です。
ご協力いただければ、幸いです。よろしくお願いいたします。

Unity 2018.4.11

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

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

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

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

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

sakura_hana

2019/11/08 01:49

Rigidbodyのスリープのせいかもしれません。 https://docs.unity3d.com/jp/current/Manual/RigidbodiesOverview.html 試しにSleepingModeを変えてみてください。 https://docs.unity3d.com/jp/current/Manual/class-Rigidbody2D.html ちなみにOnTriggerStay2Dは物理演算フレーム(FixedUpdate)、入力側は描画フレーム(Update)準拠なのでキー入力時の処理がおかしいのはこれが原因かもしれません。 これについては「unity FixedUpdate Update」で調べると色々情報が出るので別途把握しておくといいと思います。
UltraSuperMikan

2019/11/08 03:59

回答ありがとうございます。 操作系統のスクリプトのミスだと思ってたのは、Update()とのズレによるものだったんですね……。 入力受付の頻度をフラグなどで調整して対処していましたが、今回のRigidbodyのスリープを解消したことで、完全に入力系統が復活しました。 よろしければ、「回答」として、いただけませんか?
sakura_hana

2019/11/08 04:57

>Update()とのズレ ちょっと認識が違うかもしれませんので補足をば。 「スリープ状態になるとOnTriggerStay2Dが全く呼ばれなくなる(故にキー入力も全く反応しなくなる)」が大元の問題で、 それを解消したとしても「FixedUpdateとUpdateの間にはズレがある為、OnTriggerStay2D内でInputの判定をしようとするとおかしくなるかも」というのが後者の話です。 後者については可変フレームレートが元凶なので「環境やその時の負荷によって起こったり起こらなかったりする」為に、ぱっと見では問題無さそうでも正しく理解しておいた方がいいですよ、というお話でした。
UltraSuperMikan

2019/11/08 22:19

補足解説ありがとうございます。 しかし、GetButtonDownなどの1フレームのアクションを、そのままでは取得できないのはもどかしいですね……。
UltraSuperMikan

2019/11/08 22:26

ボタンの複数回検知について補足情報です。 物理フレーム・描画フレームの時差で、GetButtonDownなどの1フレームアクションを、1~3回ほど連続して取得してしまう現象は把握していました。 今回のスリープ中の入力では、入力検出が、さらに大きくブレました。(1~8回ほどへ) おそらく、スリープ中にOnTriggerStay2Dがコールされた文もスタックされているのではないかと思われるのですが、この情報について、なにかご存知ありませんか?
sakura_hana

2019/11/12 01:52

>スリープ中に〜 私は思い当たる節は無いです。(内部処理的にこうしているのかな?という想像は出来ますが確証も無いので……) 上手いこと制御するしかないかと。
guest

回答1

0

ベストアンサー

(質問へのコメントより)
Rigidbodyのスリープが原因だったようです。(SleepingModeの変更にて対応可)
リジッドボディ概要 - Unity マニュアル
Rigidbody 2D - Unity マニュアル

投稿2019/11/08 04:57

sakura_hana

総合スコア11427

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問