UEFN / Verseでプレイヤー名を表示する方法
by milkc0de
ー なぜ string として扱えないのか ー
UEFNのVerseでは、プレイヤー名を通常の string として取得することはできません。
これはバグではなく、仕様です。
なぜ string で取得できないのか
プレイヤー名は
- 個人識別情報に該当し得る
- 外部保存や外部送信を防ぐ必要がある
- 表示環境ごとに処理が異なる可能性がある
という理由から、直接文字列化できない設計になっています。
つまり、次のようなことは不可能です。
var PlayerName : string = GetPlayerName()そのようなAPI自体が存在しません。
正しい設計思想
Verseではプレイヤー名は
「取得するデータ」ではなく「表示するための message」
として扱います。
つまり、
- string化は不可
- ログ保存も不可
- 外部通信も不可
- UI表示のみ可能
という制限付き設計です。
正しい実装方法(Billboardに表示)
重要ポイント
1. agent → string はできない
プレイヤー名を string に変換するAPIは存在しません。
2. message 型のみ許可される
UIへ表示する場合は message 型を使います。
3. <localizes> が必要
message を生成する関数には <localizes> を付与します。
技術的背景
Verseは型安全性を強く重視しています。
- message はローカライズ前提型
- string は汎用データ型
- 個人情報は string として扱わせない
この制限は意図的です。
不便に見えますが、 ゲーム内個人情報保護のための設計です。
応用例
「◯◯がボタンを押しました」と表示する
AgentPressedMessage<localizes>(value:agent) : message="{value} pressed the button"
OnTriggered(Agent:?agent):void=
if(A := Agent?):
Billboard.SetText(AgentPressedMessage(A))まとめ
- プレイヤー名は string では扱えない
- 表示は message 経由のみ
- 保存や外部送信は不可
- これはセキュリティ設計
結論
プレイヤー名はデータではなく表示専用オブジェクト。
Verseではこれが正解の扱い方です。