質問するログイン新規登録
Unity3D

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

Unity

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

Q&A

2回答

482閲覧

Unityで数msおきに処理を実行したいです

kurokogeanpan

総合スコア13

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2019/07/04 07:24

0

0

前提・実現したいこと

Unityで数msおきに処理を実行したいです

試したこと

現在、Time.fixedDeltaTimeに実行間隔を直接設定して
FixedUpdate()から該当の処理を行っています。

以下、実際のプログラムではないですがそれに近いサンプルです。

csharp

1public class MyClass : MonoBehaviour { 2 bool flag = false; 3 4 void Start() { 5 float fc = 150.0f; // Hz 6 7 if (Time.timeScale != 0.0f) { 8 // ここでFixedUpdateの更新間隔を設定する 9 Time.fixedDeltaTime = Time.timeScale / (fc * 2.0f); 10 } 11 } 12 13 void FixedUpdate() { 14 if (flag) { 15 // flagがtrueのときの処理 16 } else { 17 // flagがfalseのときの処理 18 } 19 20 flag = ~flag; 21 } 22}

これで一応動いてはいます。
しかし、物理エンジンでもFixedUpdate()を使っていると聞いたので、
今後物理演算を使用するときにこの方法だと重くなってしまうと思い別の解決策を探しています。

調べたこと

非同期の辺りなどを調べていたのですが具体的に利用する方法が浮かびませんでした。
Coroutineは更新間隔がフレーム基準になってしまうので諦めました。
Taskは何故か処理がfor文内に入らず原因がわからなかったのでこれも諦めました。

調べている限りフレーム単位でなく指定したごく短い間隔ごとに処理を行うというのは
結構厳しそうな印象ですがもしご存知の方がいらっしゃいましたらよろしくおねがいします!

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

Unityのバージョンはは2018.4.0f1のPersonalです。

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

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

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

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

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

guest

回答2

0

別スレッドを作ってその中で数msのウェイトを挟みながらループさせるってテですが、
GUI操作を含むならいろいろ小細工が必要になりますね

投稿2019/07/04 09:52

y_waiwai

総合スコア88180

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

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

fiveHundred

2019/07/04 10:00

実はUnityのほとんどの機能はメインスレッドでしか動作しないですし、そうなるとUpdate()やコルーチンといった、フレーム単位のものしかないのではないか、と思います。 (私が知らないだけかもしれませんが)
y_waiwai

2019/07/04 10:03

まあ、表示周りを含むとなるとぶっちゃけそういう話になりますね そうなるとこんなことをするのに意味があるのかということになりますわな。 結局、質問くんがなにをやりたいのかって話になりますが。
guest

0

フレーム単位でなく指定したごく短い間隔ごとに処理を行う

なぜ、そのような処理が必要なのでしょうか?
フレーム単位よりも細かくしても、人間の感度からしてあまり意味のないことだと思います。

以下のように、経過時間を取得し、場合によっては複数回実行するようにすれば、特に問題ないと思います。
(実行確認していないので、うまく動作しなかったらすいません)

C#

1public class MyClass : MonoBehaviour { 2 bool flag = false; 3 4 float intervalTime = 1.0f / 150.0f; // 実行間隔(秒) 5 float currentTime = 0.0f; 6 7 void Update() { 8 currentTime += Time.deltaTime; 9 10 while (currentTime >= intervalTime) { 11 // 実行したい処理 12 if (flag) { 13 // flagがtrueのときの処理 14 } else { 15 // flagがfalseのときの処理 16 } 17 18 flag = ~flag; 19 20 currentTime -= intervalTime; 21 } 22 } 23}

投稿2019/07/04 07:48

fiveHundred

総合スコア10466

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問