Open tmori opened 10 months ago
https://docs.unrealengine.com/4.27/ja/Basics/InstallingUnrealEngine/
Epic GamesというアプリがUnity Hubに対応していると思われる。
起動ボタンをクリック(バージョン選択できる)
起動ボタンを押下すると、Epic Games
アプリが落ちて、プロジェクトブラウザが開く。
プリミティブなオブジェクトをシーンに配置して、シミュレーション実行できるようになる
プロジェクトブラウザで、ゲーム
タブを選択して、「ブランク」を選んで、プロジェクトデフォルトを C++
にする。
スターターコンテンツのチェックは外す。
カテゴリは、「シミュレーション」にすること!
XCodeが起動し、コンパイルが走り出す。
起動した!
画面左上のタブの名前が、最初、「名称未設定」とあったが、保存ボタンをクリックして、名前を入れたら変わった。 初期プロジェクトでは、マップの新規作成まではやってくれるけれど、永続化されない状態なんだな。
シミュレーションを停止させた場合、UE側のシミュレーションも一時停止させて時間も進まなくしたいのですが、可能でしょうか
はい、Unreal Engineでシミュレーションを一時停止させることは可能です。一時停止中は、ゲームの時間も進行しなくなります。これを実現するには、主にゲームの世界(UWorld
オブジェクト)を操作することになります。
SetPause
関数の使用:
UWorld
クラスのSetPause
関数を使用してゲームを一時停止させることができます。GetWorld()->SetPause(true);
false
を引数として渡します:
GetWorld()->SetPause(false);
ブループリントでの実装:
Tick
関数は呼び出されなくなり、ゲーム時間も進行しません。GetTimeSeconds
などの時間関数も一時停止中は時間を進めません。これにより、外部シミュレーションの状態に応じてUnreal Engineのシミュレーションを一時停止および再開することが可能になります。また、この機能を使って、ユーザーによる手動の一時停止/再開操作も実装できます。
シミュレーション時間として適切なのは、GetTimeSecondsですね。シミュレーション停止させたときに、連動して時間が停止するので。
はい、正確にはその通りです。GetTimeSeconds
関数は、Unreal EngineのUWorld
クラスが提供するメソッドで、ゲームが開始してからの総経過時間(秒)を返します。この関数はゲームが一時停止された際にも時間の進行を停止するため、シミュレーション時間として適切です。
GetTimeSeconds
関数の特徴シミュレーション時間の追跡:
ゲームの状態との連動:
GetTimeSeconds
で得られる時間に直接反映されます。UWorld
オブジェクトのSetPause
関数を使用します。SetPause
関数にfalse
を渡して再開します。Tick
関数の呼び出しにも影響します。一時停止中はTick
関数は実行されません。GetTimeSeconds
を使用することで、ゲーム内のシミュレーション時間を正確に追跡し、外部シミュレーションシステムとの時間同期を行うことが可能になります。これにより、ゲームのビジュアライズと外部シミュレーションのデータを効果的に組み合わせることができます。
シミュレーション再開させるには、独立して駆動するスレッドかイベントコールバックが必要ですよね。
シミュレーションを再開させるためには、確かに独立して駆動するスレッドやイベントコールバックが必要になる場合があります。Unreal Engineにおけるシミュレーションの一時停止と再開の実装は、ゲームの具体的な要件や設計によって異なりますが、以下の方法が考えられます。
SetPause
関数を呼び出してゲームの状態を制御します。ゲームの具体的な要件に応じて、これらの方法を組み合わせることで、シミュレーションの一時停止と再開を効果的に制御できます。また、Unreal Engineの機能を最大限に活用し、パフォーマンスと安定性を確保することが重要です。
うーん、外部から不定期にくるイベントを監視するとなると、スレッドしかないですね。
外部から不定期に来るイベントを監視する場合、確かに独立したスレッドを使用するのが一つの有効な解決策です。Unreal Engineでマルチスレッディングを実装する際には、特に同期やデータ共有における安全性に注意を払う必要があります。
独立した監視スレッドの作成:
スレッド間通信:
エラーハンドリングと同期:
マルチスレッディングは強力なツールですが、複雑さとリスクも伴います。実装には慎重さと適切なプログラミング手法が求められます。Unreal Engineのドキュメントやコミュニティのリソースを活用して、最適な実装方法を探求してください。
UEは、マルチスレッド対応に特化した適切なライブラリ群を用意しているのではないでしょうか?
はい、Unreal Engineはマルチスレッディングに関連するいくつかの特化したライブラリやフレームワークを提供しています。これらは、マルチスレッド処理のための安全で効率的な機能を開発者に提供することを目的としています。
タスクベースのマルチスレッディング:
FTaskGraphInterface
を使用してタスクベースのマルチスレッディングがサポートされています。スレッドセーフなコンテナ:
TQueue
, TArray
, etc.)があります。スレッドセーフなプリミティブ:
FCriticalSection
, FEvent
, FMutex
などのスレッドセーフなプリミティブが提供されています。非同期処理:
FAsyncTask
やFRunnable
インターフェイスを使用することで、独立したスレッドでの非同期処理が可能です。Async
や Future
の使用:
std::future
やstd::async
のような、非同期タスクを管理するための機能も提供されています。これらのマルチスレッド機能を適切に使用することで、効率的かつ安全なマルチスレッド処理をUnreal Engine内で実現できるでしょう。Linuxカーネル開発のご経験を活かして、これらの高度な機能を効果的に利用されることをお勧めします。
大体、全体設計が見えてきました。
UEでは、各アクターが独立してTickタイミングで動作します。 箱庭としては、箱庭管理のアクターをちゃんと管理したいので、 ルートアクターを用意します。そして、ルートアクターのtickから、各アクターの制御を行います。
各アクターは、箱庭の外部データ通信をします。
そして、箱庭のシミュレーションイベント監視は、専用スレッドを用意して、イベント監視させます。箱庭からのシミュレーション開始や停止イベントです。これらのイベント通知を受けたら、UE側のシミュレーションの開始や停止させます。
こんな感じで行けますか?
お考えの設計はUnreal Engineのフレームワーク内で実現可能であり、効率的なアプローチのようです。以下は、提案された設計の各要素に関するいくつかの具体的な考慮事項です。
Tick
関数で、他のアクターの状態を更新したり、特定のロジックを実行したりすることができます。SetPause
関数などを使用して実装できます。全体的に、ご提案された設計は、シミュレーションの中央集権的な制御と各アクターの分散型の動作を適切に組み合わせています。これにより、複雑なシミュレーションを効果的に管理し、Unreal Engineの強力な
ビジュアライゼーション機能を活用することができるでしょう。また、専用のイベント監視スレッドを使用することで、シミュレーションの状態管理をより効果的に行えます。
ただし、各アクターが外部データと通信する際や、専用イベント監視スレッドを使用する際には、スレッドセーフなプログラミングや効率的なリソース管理に注意を払う必要があります。また、シミュレーションの一時停止や再開に関連するUnreal EngineのAPIを適切に利用することで、シミュレーションの制御を柔軟に行うことができます。
全体的な設計がUnreal Engineのフレームワーク内で実装可能であることを考えると、プロジェクトの目的に合わせた効率的で柔軟なシミュレーション環境を構築することができそうです。
最小構成でのタスクリスト
考え方
タスクリスト
以降は、こちらで対応します。
https://github.com/toppers/hakoniwa-unreal-simasset-plugin/issues/1