はじめに
自分はもともと Unity 専門でやっていましたが、Unreal Engine を触る機会が増えてきたので Unreal C++ の勉強を始めてみました。
Unreal C++ を学習するにあたって Unity C# と比較した方が個人的に分かりやすかったのでこの記事では Unity C# と Unreal C++ の文法的な比較をメモ書きのような感じでひたすら書いていきます。
列挙型の定義
Unity C#
構文
enum {列挙型名}
{
    {列挙子名},
    {列挙子名}
}例
enum SampleEnum
{
    A,
    B
}Unreal C++
構文
UENUM()
enum class E{列挙型名} : uint8
{
    {列挙子名},
    {列挙子名}
};例
UENUM()
enum class ESampleEnum : uint8
{
    A,
    B
};配列の初期化
Unity C#
構文
{型名}[] {配列名} = { {値}, {値} };例
int[] sampleArray = { 1, 2 };Unreal C++
構文
TArray<{型名}> {配列名} = { {値}, {値} };例
TArray<int32> SampleArray = { 1, 2 };foreach
Unity C#
構文
foreach({型名} {変数名} in {配列名})
{
}例
 foreach (int element in sampleArray)
 {
 
 }Unreal C++
構文
for ({型名} {変数名} : {配列名})
{
}例
for (int32 Element : SampleArray)
{
}構造体の定義
Unity C#
構文
struct {構造体名}
{
    public {型名} {メンバ名};
    public {型名} {メンバ名};
}例
struct SampleStruct
{
    public int Member1;
    public int Member2;
}Unreal C++
構文
USTRUCT()
struct F{構造体名}
{
    GENERATED_BODY()
public:
    {型名} {メンバ名};
    {型名} {メンバ名};
};例
USTRUCT()
struct FSampleStruct
{
    GENERATED_BODY()
public:
    int32 Member1;
    int32 Member2;
};構造体型の変数の初期化
Unity C#
構文
{構造体名} {変数名} = new()
{
    {メンバ名} = {値},
    {メンバ名} = {値}
};例
SampleStruct sampleStruct = new()
{
    Member1 = 1,
    Member2 = 2
};Unreal C++
構文
{構造体名} {変数名} =
{
    {値},
    {値}
};例
FSampleStruct SampleStruct =
{
    1,
    2
};動的デリゲートの宣言(引数/戻り値なし)
Unity C#
構文
delegate void {デリゲート名}();例
delegate void SampleDelegate();Unreal C++
構文
DECLARE_DYNAMIC_MULTICAST_DELEGATE({デリゲート名});例
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FSampleDelegate);動的デリゲートへの関数の登録
Unity C#
構文
{デリゲート} = {関数名};例
sampleDelegate = SampleMethod;Unreal C++
構文
//登録する関数の宣言には UFUNCTION() が付いている必要がある
{デリゲート}.AddDynamic(this, &{クラス名}::{関数名});例
SampleDelegate.AddDynamic(this, &ASampleActor::SampleFunction);動的デリゲートに登録してある関数の呼び出し(引数なし)
Unity C#
構文
{デリゲート}();例
sampleDelegate();Unreal C++
構文
{デリゲート}.Broadcast();例
SampleDelegate.Broadcast();仮想関数の定義・宣言
Unity C#
構文
// protected か public
{アクセス修飾子} virtual {戻り値の型名} {関数名}()
{
}例
protected virtual void SampleMethod()
{
}Unreal C++
構文
{アクセス修飾子}: // protected か public
    virtual {戻り値の型名} {関数名}();例
protected:
    virtual void SampleFunction();仮想関数のオーバーライド
Unity C#
構文
{アクセス修飾子} override {戻り値の型名} {関数名}()
{
}例
protected override void SampleMethod()
{
}Unreal C++
構文
{アクセス修飾子}:
    {戻り値の型名} {関数名}() override;例
protected:
    void SampleFunction() override;参照渡しを用いた関数の定義・宣言
Unity C#
構文
{アクセス修飾子} {戻り値の型名} {関数名}(ref {型名} {引数名})
{
}例
private void SampleMethod(ref int sampleParameter)
{
}Unreal C++
構文
{アクセス修飾子}:
    {戻り値の型名} {関数名}({型名}& {引数名});例
private:
    void SampleFunction(int32& SampleParameter);参照渡しを用いた関数の呼び出し
Unity C#
構文
{関数名}(ref {変数名});例
SampleMethod(ref sampleVariable);Unreal C++
構文
//値渡しと変わらない
{関数名}({変数名});例
SampleFunction(SampleVariable);インターフェースの定義
Unity C#
構文
public interface I{インターフェース名}
{
    {戻り値の型名} {関数名}();
}例
public interface ISampleInterface
{
    void SampleMethod();
}Unreal C++
構文
UINTERFACE()
class U{インターフェース名} : public UInterface
{
    GENERATED_BODY()
};
class I{インターフェース名}
{
    GENERATED_BODY()
public:
    virtual {戻り値の型名} {関数名}();
};例
UINTERFACE()
class USampleInterface : public UInterface
{
    GENERATED_BODY()
};
class ISampleInterface
{
    GENERATED_BODY()
public:
    virtual void SampleFunction();
};型推論の変数の初期化
Unity C#
構文
var {変数名} = {値};例
var sampleVariable = 0;Unreal C++
構文
auto {変数名} = {値};例
auto SampleVariable = 0;辞書型の変数の初期化
Unity C#
構文
Dictionary<{型名}, {型名}> {変数名} = new()
{
    { {値}, {値} },
    { {値}, {値} }
};例
Dictionary<int, string> sampleDictionary = new()
{
    { 1, "One" },
    { 2, "Two" }
};Unreal C++
構文
TMap<{型名}, {型名}> {変数名} =
{
    { {値}, {値} },
    { {値}, {値} }
};例
TMap<int32, FString> SampleMap =
{
    { 1, TEXT("One") },
    { 2, TEXT("Two") }
};戻り値がジェネリック型の関数の定義・宣言
Unity C#
構文
{アクセス修飾子} T {関数名}<T>() where T : {共通の親クラス名やインターフェース名など}
{
    // T 型の値を返す処理
}例
private T SampleMethod<T>() where T : SampleClass
{
}Unreal C++
構文
{アクセス修飾子}:
    template<class T>
    T* {関数名}();例
private:
    template<class T>
    T* SampleFunction(); 
 

