UEでステージのプレイタイムを計測するだけに4時間以上かかった話。

ワールドパーティションを設定したレベルにおいて、ステージを遊んだプレイ時間を計測しようとしましたが、超大苦戦。ワールドパーティションレベルで時間を計測しようと実装している人に向けて解決方法を備忘しておきます。

結論・成功方法

  1. 時間の計測はレベルブループリントのTickで行う。
  2. レベルブループリントからゲームインスタンスにプレイ時間(PlayTime)を常に渡す
    「 毎フレーム更新 」
  3. ゲームインスタンスの変数値(PlayTime)をレベル上に配置したアクターに渡す。

※言葉ではわかりにくいのでもしかしたらYouTube動画で解説するかもしれません。

後日談(240706追記)

ワールドパーティションには各アクターの詳細ウインドウからワールドパーティションの設定ができます。設定項目に「 is Spatially Loaded 」という項目があり、この値を「 false 」にすることでワールドパーティションレベル上でも常のロードされた状態を維持することができるそうです。

今回のタイマーもわざわざレベルブループリントで実装しなくても、タイマーを計測するアクターのis Spatially Loaded=falseで簡単に実装できたかもしれません。

実際に実験はしていないのでなんとも言えませんが、おそらくこの方法で常にタイマーアクターをレベル上に読み込んで、時間の計測をすることが可能だったかもしれません。

 

YouTube動画貼り付け予定地

 

 



 

レベルブループリントで時間の計測を行う

失敗した方法で説明しますが、ワールドパーティションレベルでは、レベル上に配置したアクターでは時間の計測が止まってしまいます。

そこでレベルブループリントのTickで時間の計測を行います。

レベルブループリンの変数値(PlayTime)をレベル上に配置したアクターに渡す

レベルブループリントのプレイ時間(PlayTime)変数の値をレベルに配置したアクターのウィジェットに反映したいのですが、直接レベルブループリントからアクターへ値を渡すことはできません。

そこで一旦ゲームインスタンスに値を渡して、ゲームインスタンスからアクターへプレイ時間(PlayTime)の値を渡します。

ウィジェットのテキストが更新されない問題に苦戦しつつもなんとかキャストを使用して、テキストの値を変更できました。(変にいじくりまわしたウィジェットのプロパティでもやや苦戦)



 



 

失敗した方法

  1. 計測した時間が一定の場所を通り過ぎるとカウントを停止する
  2. レベルブループリントのカウントした時間をアクターから取得できない
  3. ワールドに配置したウィジェットのテキストが更新されない

計測した時間が一定の場所を通り過ぎるとカウントを停止する

ワールドパーティションで時間を計測するアクターがアンロードされてしまっていた。

解決方法 → レベルブループリントのTickで時間をカウント

 

 

レベルブループリントのカウントした時間をアクターから取得できない

解決方法1 → ブループリントインタフェースを使用する → 失敗

解決方法2 → ゲームインスタンスにカウントした時間を渡す → 成功

 

ワールドに配置したウィジェットのテキストが更新されない

ワールドに配置した自身のウィジェットを取得するのに苦労しました。

最終的には画像のような方法でワールドに配置したウィジェットのテキストを変更できました。

 



 

まとめ

単純にタイマーを設置するだけなので1時間もあればできると、たかをくくっていましたが、とんだところで苦戦に会いました。

ワールドパーティションというひょんな設定とウィジェットの変更に慣れていなかったのか思った以上に時間がかかり、げんなりしています。皆さんのタイマー設置の何かの役に立てれば幸いです。

 

 

コメント

タイトルとURLをコピーしました