Language:
Page Info
Engine Version:

FName

FNames は、 コンテンツ ブラウザ で新規アセットに名前を付けたり、ダイナミック マテリアル インスタンスのパラメータを変更する場合、またはスケルタル メッシュのボーンにアクセスする時に使います。再利用する場合でも、所定の文字を一回だけデータ テーブルに格納するので、 非常に負荷の軽いシステムです。Fnames は大文字・小文字を区別しません。変更も操作もできません。Fnames のストレージ システムと静的な性質によって、 キーによる参照と Fnames へのアクセスが速いです。FNames サブシステムのもう 1 つの特徴は、文字列から Fname への変換をハッシュ テーブルで素早く行うことです。

FNames は大文字・小文字を区別せず、インデックスの組み合わせとしてユニークな文字列とインスタンス番号のテーブル内に格納されます。

FNames の作成

FName TestHUDName = FName(TEXT("ThisIsMyTestFName"));

変換

FNames は、FStrings と FText にのみ変換可能であり、 FStrings からのみ変換が可能です。

FName からの変換

変換元

変換先

FName

FString

TestHUDString = TestHUDName.ToString();

FName

FText

TestHUDText = FText::FromName(TestHUDName);

FName -> FText が有効な場合はありますが、FNames のコンテンツは FText の「自動ローカライゼーション」 の効果がないことに注意してください。

FName への変換

変換元

変換先

FString

FName

TestHUDName = FName(*TestHUDString);

FString -> FName は危険です。FName は大文字、小文字を区別せず、変換は不可逆であるためです。

FText

FName

FText から FName への直接変換はありません。かわりに、FString に変換し、次に FName に変換します。

FText -> FString -> FName は、危険です。FName はケース インセンシティブ、変換は不可逆であるためです。

変換中、作成中の 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 に設定します。普通の文字列の場合とは違って、ヌルポインタに対するチェックを行いません。