FNames は、 コンテンツ ブラウザ で新規アセットに名前を付けたり、ダイナミック マテリアル インスタンスのパラメータを変更する場合、またはスケルタル メッシュのボーンにアクセスする時に使います。再利用する場合でも、所定の文字を一回だけデータ テーブルに格納するので、 非常に負荷の軽いシステムです。
Fnames は大文字と小文字を区別しません。変更も操作もできません。Fnames のストレージ システムと静的な性質によって、 キーによる参照と Fnames へのアクセスが速いです。FNames サブシステムのもう 1 つの特徴は、文字列から Fname への変換をハッシュ テーブルで素早く行うことです。
FNames は大文字と小文字を区別せず、インデックスの組み合わせとしてユニークな文字列とインスタンス番号のテーブル内に格納されます。
FNames の作成
FName TestHUDName = FName(TEXT("ThisIsMyTestFName"));
変換
FNames は、FStrings と FText にのみ変換可能であり、 FStrings からのみ変換が可能です。
FName からの変換
|変換元 | 変換先 | 例| |---|------|---------|%programming-and-scripting/unreal-architecture/string-handling:fnametofstring% %programming-and-scripting/unreal-architecture/string-handling:fnametoftext%
FName への変換
|変換元 | 変換先 | 例| |---|------|---------|%programming-and-scripting/unreal-architecture/string-handling:fstringtofname% %programming-and-scripting/unreal-architecture/string-handling:ftexttofname%
変換中、作成中の Fname の型に対して有効ではない文字が含まれることがあるので気をつけてください。 NameTypes.h の INVALID_NAME_CHARACTERS マクロは、FNames に対して無効な文字を定義し、 FName (IsValidObjectName() など) 内には Fnames の特定の用途に対する有効性を確認する関数があります。
比較
== 演算子は、2 つの Fname の比較に使用し、true あるいは false を返します。このように、文字列の比較を行う代わりに Index の値を比較することで、CPU の使用率を大幅に下げることができます。
FName::Compare も 2 つの Fname の比較に使用できます。this < Other の場合は < 0 を、this == Other の場合は 0 、 this > Other の場合は> 0 を返します。
CompareFloat = TestFName.Compare(OtherFName);
FNames の使用
FName の使い方は非常に分かりやすいです。アクタの Skeletal Mesh コンポーネントから「pelvis」という名前のボーンを取得するとします。以下の C++ コードは、GetBoneRotation()
へパスされながらオンザフライで作成された Fname の使用を表します。
FRotator rotPelvis = Mesh->MeshGetInstance(this))->GetBoneRotation(FName(TEXT("pelvis")));
これにより、GetBoneRotation()
へパスされる FName が作成され、対応するボーンに対して FRotator を返します。パッケージのロード時、ボーン名が FName 表にロードされるので、
FName 用のコンストラクタが、割り当てを避けながら、ハッシュ表にあるボーン名を見つけます。
名前テーブルの検索
FName が名前テーブルにあるかどうかを、自動追加せずに判断したい場合、Fname コンストラクタに別の種類の検索を設定することができます。
if( FName(TEXT("pelvis"), FNAME_Find) != NAME_None )
{
// Do something
}
名前テーブルに名前が存在しない場合、FName のインデックスを NAME_None
に設定します。普通の文字列の場合とは違って、ヌルポインタに対するチェックを行いません。