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

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

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

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

Unity

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

Q&A

解決済

2回答

1670閲覧

unityの処理周期を安定させたい

ryosan0201

総合スコア3

C#

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

Unity

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

0グッド

0クリップ

投稿2020/09/24 04:42

編集2020/09/24 04:43

前提・実現したいこと

Unityにて三自由度リンクロボットのティーチング作業をシミュレートしようとしています。
ジョイスティックで操作入力→操作入力をtxtファイルに毎周期保存→txtファイルを上から順に読み込ませて動作を再現
ってのをやろうとしています

下のソースコードのような処理をupdate内で各3軸に対して行っています。

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

unityの処理の問題なのか再現したロボットの動きが早送りみたいになります
おそらくupdateが呼ばれるタイミングでファイル書き込みを行っているがために、フレームレートの変動に合わせて書き込み周期もずれているせいだと思われます。

ティーチング実装でのあるあるだと思うのですが処理周期を無理やり上げるなどの解決策があれば具体的なやり方を教えていただけると幸いです。

やっている書き込み処理

c#

1 SetBoom(m_boomSmoothOut.Evaluate(Boom, Time.time) * 0.3f); 2 3 float txt1 = m_boomSmoothOut.Evaluate(Boom, Time.time) * 0.3f; 4 StreamWriter sw1 = new StreamWriter("../TextDataBoom.txt",true);// TextData.txtというファイルを新規で用意 5 sw1.WriteLine(txt1);// ファイルに書き出したあと改行 6 sw1.Flush();// StreamWriterのバッファに書き出し残しがないか確認 7 sw1.Close();//

試したこと

Edit→Project Settings→Timeのタイムステップを0.02から0.01にしてみましたが改善されませんでした

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

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

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

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

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

guest

回答2

0

ベストアンサー

これは求める精度、求める実行頻度にもよります。
基本的にUnityでは1ms単位の制御までは難しいです。10-20ms程度の精度は比較的簡単に出せますがそれ以上となると実装も難しくなりますし、様々な弊害もあります。
いくつか定期的な実行を行う手段を記載しておきます。
また根本的に方法を変える前提ならば入力方法と同時にTime.realtimeSinceStartupなどを用い、記録している時間も記録することをおススメします。

  • Update

Updateでできないと質問しているのにUpdateを手段として挙げるのは矛盾していると感じられるかもしれませんが、実行頻度によっては一定時間での反復実行が可能です。一般的にUpdateの実行頻度は60-200fps程度です。よってこれより低い実行頻度でならUpdate内で経過時間を比較することで反復実行が可能です。
例えば0.1秒ごとに実行を行いたい場合、コードとしては一般的に以下のようなものになります。

C#

1float timer = 0; 2void Update() 3{ 4 if(timer > 0.1f) //不等号逆だったので修正 5 { 6 実行したい処理 7 timer = 0; 8 } 9 else 10 timer += Time.deltatime; 11}
  • FixedUpdate

このイベント関数はUnity内のタイマーで正確に一定時間ごとに呼び出されます。これは現実時間と一致していないことに注意してください。FixedUpdateの実行頻度はEdit->ProjectSettings->Time->FixedTimeStepに依存しています。コードは以下のようになります。

C#

1void FixedUpdate() 2{ 3 実行したい処理 4}

以下の処理は説明が面倒なので省きます。もし使用しなければならない場合は調べてください。Thread以外では精度は変化しません。

  • Coroutine
  • InvokeRepeating
  • Thread

Threadは処理を別スレッドに流して前述の方法より正確な頻度で実行できますがUnityEngine名前空間に属しているクラスを使えなくなります。

投稿2020/09/24 17:57

編集2020/09/28 16:35
KEEL

総合スコア52

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

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

ryosan0201

2020/09/28 04:10

ありがとうございます。 タイマー使ってみます。
guest

0

処理周期を安定させるってなら、処理周期を早くするのではなく、遅い一定の周期になるように待ちを挟むようにします。

投稿2020/09/24 05:49

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問