このページでは、Unreal Engine (UE) のゲームプレイ プログラミングの概念を Unity ユーザー向けに説明します。 このページでの説明は、Unity の C# の経験があって、UE の C++ およびブループリントを学ぶユーザーを前提にしています。
以下に示している例では、Unity の C# でよく使われるゲームプレイ プログラミングのユースケース、および同じ機能を UE で実装する方法を取り上げています。
ゲームオブジェクトをインスタンス化する / アクタをスポーンする
Unity では Instantiate 関数を使用して、オブジェクトの新しいインスタンスを作成します。 この関数は UnityEngine.Object 型 (GameObject、MonoBehaviour など) を受け取って、そのコピーを作成します。
public GameObject EnemyPrefab;
public Vector3 SpawnPosition;
public Quaternion SpawnRotation;
void Start()
{
GameObject NewGO = (GameObject)Instantiate(EnemyPrefab, SpawnPosition, SpawnRotation);
NewGO.name = "MyNewGameObject";
}Unreal Engine には、オブジェクトをインスタンス化するための次の 2 つの関数があります。
NewObjectは新しいUObject型を作成します。SpawnActorはAActor型をスポーンします。
UObjects と NewObject
UE での UObject のサブクラス化は、Unity での ScriptableObject のサブクラス化とよく似ています。 これらは、ワールドにスポーンする必要がないゲームプレイ クラスや、アクタのようにコンポーネントがアタッチされるゲームプレイ クラスに役立ちます。
Unity では、ScriptableObject のサブクラスを作成すると、それを次のようにインスタンス化できます。
MyScriptableObject NewSO = ScriptableObject.CreateInstance<MyScriptableObject>();UE では、UObject のサブクラスを作成すると、それを次のようにインスタンス化できます。
UMyObject* NewObj = NewObject<UMyObject>();AActors と SpawnActor
アクタは、ワールド オブジェクト (C++ では UWorld) の SpawnActor メソッドでスポーンできます。 一部の UObject とすべてのアクタには、ワールド オブジェクトを取得するための GetWorld メソッドがあります。
次の例では、それらのメソッドを既存のアクタのスポーン パラメータとともに使用して、Unity の Instantiate メソッドをエミュレートしています。
例
次の例は、AActor のサブクラスである AMyActor を示しています。 デフォルトのコンストラクタが int32 と USphereComponent* を初期化しています。
CreateDefaultSubobject 関数を使用していることに注目してください。 この関数は、コンポーネントを作成してデフォルトのプロパティを割り当てます。 この関数で作成されたサブオブジェクトはデフォルトのテンプレートとして機能するため、サブクラス内またはブループリント内で変更できます。
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
UPROPERTY()
int32 MyIntProp;
UPROPERTY()
USphereComponent* MyCollisionComp;
これにより、すべてのメンバー変数、UPROPERTY、コンポーネントが含まれている、AMyActor のクローンが作成されます。
AMyActor* CreateCloneOfMyActor(AMyActor* ExistingActor, FVector SpawnLocation, FRotator SpawnRotation)
{
UWorld* World = ExistingActor->GetWorld();
FActorSpawnParameters SpawnParams;
SpawnParams.Template = ExistingActor;
World->SpawnActor<AMyActor>(ExistingActor->GetClass(), SpawnLocation, SpawnRotation, SpawnParams);
}ある型から別の型にキャストする
この場合、あると分かっているコンポーネントを取得して、それを特定の型にキャストし、条件付きで何かを実行します。
Unity
Collider collider = gameObject.GetComponent<Collider>;
SphereCollider sphereCollider = collider as SphereCollider;
if (sphereCollider != null)
{
// ...
}UE の C++
UPrimitiveComponent* Primitive = MyActor->GetComponentByClass(UPrimitiveComponent::StaticClass());
USphereComponent* SphereCollider = Cast<USphereComponent>(Primitive);
if (SphereCollider != nullptr)
{
// ...
}Blueprint (ブループリント)
ブループリントでキャストを行うには、Cast to ノードを使用します。 詳細については、「キャストのクイックスタート ガイド」を参照してください。
ゲームオブジェクト / アクタを破壊する
ゲームオブジェクト / アクタを破壊する (遅延 1 秒)
ゲームオブジェクト / アクタを無効化する
Unity の C# C# | UE の C++ C++ | ブループリント |
コンポーネントからゲーム オブジェクト / アクタにアクセスする
Unity の C# C++ | UE の C++ C++ | ブループリント |
ゲームオブジェクト / アクタからコンポーネントにアクセスする
Unity
MyComponent MyComp = gameObject.GetComponent<MyComponent>();UE の C++
UMyComponent* MyComp = MyActor->FindComponentByClass<UMyComponent>();Blueprint (ブループリント)
ゲームオブジェクト / アクタを検索する
Unity
// Find GameObject by name
GameObject MyGO = GameObject.Find("MyNamedGameObject");
// Find Objects by type
MyComponent[] Components = Object.FindObjectsOfType(typeof(MyComponent)) as MyComponent[];
foreach (MyComponent Component in Components)
{
// ...
}
UE の C++
// Find UObjects by type
for (TObjectIterator<UMyObject> It; It; ++it)
{
UMyObject* MyObject = *It;
// ...
}
// Find Actor by name (also works on UObjects)
AActor* MyActor = FindObject<AActor>(nullptr, TEXT("MyNamedActor"));
Blueprint (ブループリント)
ゲームオブジェクト / アクタにタグを付加する
Unity
MyGameObject.tag = "MyTag";UE の C++
// Actors can have multiple tags
MyActor.Tags.AddUnique(TEXT("MyTag"));Blueprint (ブループリント)
MonoBehaviour / ActorComponent にタグを付加する
Unity
// This changes the tag on the GameObject it is attached to
MyComponent.tag = "MyTag";UE の C++
// Components have their own array of tags
MyComponent.ComponentTags.AddUnique(TEXT("MyTag"));ゲームオブジェクト / アクタおよび MonoBehaviour / ActorComponent のタグを比較する
Unity
if (MyGameObject.CompareTag("MyTag"))
{
// ...
}
// Checks the tag on the GameObject it is attached to
if (MyComponent.CompareTag("MyTag"))
{
// ...
}UE の C++
// Checks if an Actor has this tag
if (MyActor->ActorHasTag(FName(TEXT("MyTag"))))
{
// ...
}Blueprint (ブループリント)
UE の C++
// Checks if an ActorComponent has this tag
if (MyComponent->ComponentHasTag(FName(TEXT("MyTag"))))
{
// ...
}Blueprint (ブループリント)
物理:RigidBody と プリミティブコンポーネント
Unity では、ゲームオブジェクトに物理特性を付与するには RigidBody コンポーネントをアタッチします。
UE では、すべてのプリミティブ コンポーネント (C++ では UPrimitiveComponent) が物理オブジェクトを表現することができます。 以下に一般的なプリミティブ コンポーネントを挙げます。
形状コンポーネント (
USphereComponent、UCapsuleComponent、など)スタティックメッシュコンポーネント
スケルタルメッシュコンポーネント
コリジョンやビジュアライゼーションの役目が別々のコンポーネントに分かれている Unity とは異なり、UE では「物理化」と「可視化」の概念が 1 つのプリミティブ コンポーネントに組み合わされています。 ワールドでジオメトリを持ち、レンダリングできるか物理的に相互作用できるコンポーネントは、UPrimitiveComponent のサブクラスです。
UE のコリジョン チャンネルは Unity のレイヤーに相当します。 詳細については、「コリジョン フィルタリング」を参照してください。
レイキャストと レイ トレース
Unity
GameObject FindGOCameraIsLookingAt()
{
Vector3 Start = Camera.main.transform.position;
Vector3 Direction = Camera.main.transform.forward;
float Distance = 100.0f;
int LayerBitMask = 1 << LayerMask.NameToLayer("Pawn");
RaycastHit Hit;
bool bHit = Physics.Raycast(Start, Direction, out Hit, Distance, LayerBitMask);
UE の C++
APawn* AMyPlayerController::FindPawnCameraIsLookingAt()
{
// You can use this to customize various properties about the trace
FCollisionQueryParams Params;
// Ignore the player's pawn
Params.AddIgnoredActor(GetPawn());
// The hit result gets populated by the line trace
FHitResult Hit;
Blueprint (ブループリント)
トリガー ボリューム
Unity
public class MyComponent : MonoBehaviour
{
void Start()
{
collider.isTrigger = true;
}
void OnTriggerEnter(Collider Other)
{
// ...
}
UE の C++
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
// My trigger component
UPROPERTY()
UPrimitiveComponent* Trigger;
AMyActor()
Blueprint (ブループリント)
コリジョン反応のセットアップの詳細については、「コリジョン」を参照してください。
キネマティック リジッドボディ
Unity
public class MyComponent : MonoBehaviour
{
void Start()
{
rigidbody.isKinematic = true;
rigidbody.velocity = transform.forward * 10.0f;
}
}UE の C++
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
UPROPERTY()
UPrimitiveComponent* PhysicalComp;
AMyActor()
{
入力イベント
Unity
public class MyPlayerController : MonoBehaviour
{
void Update()
{
if (Input.GetButtonDown("Fire"))
{
// ...
}
float Horiz = Input.GetAxis("Horizontal");
float Vert = Input.GetAxis("Vertical");
UE の C++
UCLASS()
class AMyPlayerController : public APlayerController
{
GENERATED_BODY()
void SetupInputComponent()
{
Super::SetupInputComponent();
InputComponent->BindAction("Fire", IE_Pressed, this, &AMyPlayerController::HandleFireInputEvent);
Blueprint (ブループリント)
以下は、プロジェクト設定で入力プロパティがどのように表示されるかを示します。
UE プロジェクトでの入力のセットアップ方法については、「入力」を参照してください。
参考文献
上記の概念に関連する詳細情報については、以下のセクションを参照することをお勧めします。
ゲームプレイ フレームワーク - ゲーム モード、プレイヤー ステート、コントローラー、ポーン、カメラなどのコア ゲーム システムについて説明しています。
ゲームプレイのアーキテクチャ - ゲームプレイ クラスの作成および実装のリファレンスです。
ゲームプレイのチュートリアル - よく使われるゲームプレイ要素を再作成するためのチュートリアルです。