UE4 UE4プログラマー向け勉強会 in 大阪
| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑
2016 年から UE4 / 2021年から UE5 を触り始めました。勉強したもののメモ用ブログです。ゲーム制作に関するメモや雑記とか色々あります。C++ での Qt、Unity もほんの少しあります。
| PAGE-SELECT | NEXT ≫
| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑
EndPlay
アクタのライフが終わりに近づくことを保証するために数か所で呼び出されます。
プレイ中に Destroy や Level Transitions でこれを発行します。
またアクタを含むストリーミングレベルがアンロードされた場合も発行します。
EndPlay が呼び出されるすべての場所は以下の通りです。
・Destroy の明示的な呼出し
・Play in Editor を終了
・レベル移行 (シームレスな移動またはマップのロード)
・アクタを含むストリーミング レベルをアンロード
・アクタのライフタイムの期限が終了
・アプリケーションをシャットダウン (全アクタを破壊)
| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑
| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑
| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑
といった感じの挙動になるようです。Ceil 表現式は、値を受け取り、一番近い整数へ 切り上げて 結果を出力します。Floor and Frac も参照してください。
例: 「0.2」の Ceil は「1.0」です。(0.2、1.6) の Ceil は (1.0、2.0) です。
| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑
FName LocalRowName = FDataTableRowHandle.RowName;
FYourStruct* OutRow = FDataTableRowHandle.DataTable->FindRow< fyourstruct >(LocalRowName, "");
auto _Record = MyDataTable->FindRow< fmydatatable >(_Names[_Lp], FString());
// データテーブルに割り当てる構造体
USTRUCT(BlueprintType)
struct FDataTableTest : public FTableRowBase
{GENERATED_BODY()
public:UPROPERTY(EditAnywhere, BlueprintReadWrite)
float Param = 0.0f;
};
データテーブル(Data Table)変数の「Find Row」関数を使ってデータテーブルの行のデータを取得思案す。// データテーブル
UDataTable* aDataTable;
// データテーブル取得
auto aRecord = aDataTable->FindRow< FDataTableTest >("RowName","");
'auto' キーワード
以下の例外がなければ、C++ コードで auto を使わないようにします。
初期化している型について常に明示的でなければなりません。
つまり、読み手がその型を見えるようにしなければなりません。
このルールは C# の ‘var' キーワードの使用にも適用されます。
auto の使用はどのような場合に認められますか?
・lambda を変数にバインドする必要がある場合です。lambda 型はコードで表現できないからです。
・iterator 変数に対して認められます。しかし、iterator の型が非常に詳細で読みづらくなります。
・テンプレートのコードで認められます。この場合、式の型は簡単に見分けることはできません。これは高度な事例です。
コードの読み手に型がはっきり見えるようにすることは非常に重要です。
一部の IDE では型を推測できますが、これはコンパイル可能な状態にあるコードに依存します。
merge/diff ツールのユーザーもサポートしません。または、
GitHub 上など各ソース ファイルを別個に見る場合などもサポートしません。
認められる方法で auto を使う場合、型名で使うように常に正しく const、 & または * を使うようにしてください。
`auto` を使うと、推測された型を希望の型にします。
こちらの方が他の人に対してもわかりやすいかもしれないですね。// データテーブル
UDataTable* aDataTable;
// データテーブル取得
FDataTableTest* aRecord = aDataTable->FindRow< FDataTableTest >("RowName","");
| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑
| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑
継承元によって接頭辞が変わる。といったもののようですね。テンプレートクラスには接頭辞 T が付きます。
UObject から継承されるクラスには接頭辞 U が付きます。
AActor から継承されるクラスには接頭辞 A が付きます。
SWidget から継承されるクラスには接頭辞 S が付きます。
C抽象インターフェースのクラスには接頭辞 I が付きます。
列挙型変数には接頭辞 E が付きます。
その他のほとんどのクラスには接頭辞 F が付きますが、サブシステムによっては別の文字が使用されます。
Typedef には、その型に対して適切な接頭辞が付きます。
構造体の typedef の場合は、F に、
UObject の typedef の場合は、U になる等のようになります。
列挙型変数には接頭辞 E が付きます。
ブール変数には、必ず接頭辞 b を付けてください (例、bPendingDestruction や bHasFadedIn)。
必須ではありませんが、参照から渡されたり、関数によって値が書かれる場合は、
関数パラメータ名に「Out」を接頭辞として付けることを推奨します。
こうすることで、引数に渡された値が関数によって置き換えられることが明白になります。
In または Out のパラメータも boolean の場合、In/Out の接頭辞の前に b を付けます (例: bOutResult)。
| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑
「GetWorld()->GetFirstPlayerController()->PlayerCameraManager」で「APlayerCameraManager」を取得します。// 現在のカメラの位置と角度と画角を取得
APlayerCameraManager* aPlayerCameraManager = GetWorld()->GetFirstPlayerController()->PlayerCameraManager;
FVector aCameraLocation = aPlayerCameraManager->GetCameraLocation(); // 位置
FRotator aCameraRotation = aPlayerCameraManager->GetCameraRotation(); // 角度
float aCameraFov = aPlayerCameraManager->GetFOVAngle(); // 画角
| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑
enum のタイプ名から FindObject で UEnum 型のObjetを取得し、そこから情報を取っているようで、これを参考にしました。
この列挙型から「UEnum」型の取得はこんな感じに。// サンプルの列挙型
UENUM(BlueprintType)
enum class EEnumSample : uint8
{
SampleNone = 0,
SampleOne = 1,
SampleTwo = 2,
};
// 列挙型の定義名
FString aEnumTypeString(TEXT("EEnumSample"));
// 列挙型の定義名から UEnum を取得
const TCHAR* aEnumChar = *aEnumTypeString;
UEnum* const aEnum = FindObject(ANY_PACKAGE, aEnumChar);
| UE4 | 10:00 | comments:0 | trackbacks:0 | TOP↑
| PAGE-SELECT | NEXT ≫