Diese Seite erläutert Gameplay-Programmierkonzepte der Unreal Engine (UE) für Unity-Nutzer. Bei den folgenden Erläuterungen wird davon ausgegangen, dass Sie mit Unity C# vertraut sind und UE C++ und Blueprint lernen möchten.
Die folgenden Beispiele behandeln einige gängige Anwendungsfälle der Gameplay-Programmierung in Unity C# und zeigen, wie Sie die gleiche Funktionalität in UE implementieren können.
Instanzierung von GameObject / Actor spawnen
In Unity verwenden Sie die Funktion Instantiate, um neue Instanzen von Objekten zu erstellen. Diese Funktion nimmt einen beliebigen UnityEngine.Object-Typ (GameObject, MonoBehaviour usw.) entgegen und erstellt eine Kopie davon.
public GameObject EnemyPrefab;
public Vector3 SpawnPosition;
public Quaternion SpawnRotation;
void Start()
{
GameObject NewGO = (GameObject)Instantiate(EnemyPrefab, SpawnPosition, SpawnRotation);
NewGO.name = "MyNewGameObject";
}UE hat zwei verschiedene Funktionen zum Instanzieren von Objekten:
NewObjecterstellt neueUObject-Typen.SpawnActorspawntAActor-Typen.
UObjects und NewObject
Das Ableiten von Subklassen aus UObject in UE ist ähnlich wie das Ableiten von Subklassen aus ScriptableObject in Unity. Diese sind nützlich für Gameplay-Klassen, die nicht in der Welt spawnen oder angehängte Komponenten wie Actors haben müssen.
Wenn Sie in Unity eine Subklasse von ScriptableObject erstellt haben, können Sie sie wie folgt instanzieren:
MyScriptableObject NewSO = ScriptableObject.CreateInstance<MyScriptableObject>();Wenn Sie in UE eine Subklasse von UObject erstellen, können Sie sie wie folgt instanzieren:
UMyObject* NewObj = NewObject<UMyObject>();AActors und SpawnActor
Sie können Actors mit der SpawnActor-Methode auf einem World-Objekt (UWorld in C++) spawnen. Einige UObjects und alle Actor bieten eine GetWorld-Methode, um das World-Objekt zu holen.
Im folgenden Beispiel verwenden wir diese Methode mit dem Spawn-Parameter eines bestehenden Actors, um die Funktionalität der Instantiate-Methode von Unity zu emulieren.
Beispiel
Unten sehen Sie ein Beispiel für die AActor-Subklasse, AMyActor. Der Standard-Konstruktor initialisiert int32 und USphereComponent*.
Beachten Sie die Nutzung der CreateDefaultSubobject-Funktion. Diese Funktion erstellt Komponenten und weist diesen Standardeigenschaften zu. Mit dieser Funktion erstellte Unterobjekte dienen als Standardvorlage, sodass Sie sie in einer Subklasse oder einem Blueprint ändern können.
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
UPROPERTY()
int32 MyIntProp;
UPROPERTY()
USphereComponent* MyCollisionComp;
Dies erstellt einen Klon eines AMyActor, einschließlich aller Member-Variablen, UPROPERTYs und Komponenten.
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);
}Casting von einem Typ zu einem anderen
In diesem Fall nehmen wir eine Komponente, die wir bereits haben, und casten diese dann auf einen bestimmten Typ, um unter bestimmten Umständen etwas zu tun.
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
Sie können in Blueprint casten, indem Sie einen Cast to-Knoten verwenden. Weitere Informationen finden Sie im Casting-Schnellstartleitfaden.
GameObject / Actor zerstören
GameObject / Actor zerstören (mit 1 Sek. Verzögerung)
GameObjects / Actors deaktivieren
Unity C# C# | UE C++ C++ | Blueprint |
Zugriff auf das GameObject / den Actor über eine Komponente
Unity C# C++ | UE C++ C++ | Blueprint |
Zugriff auf eine Komponente über das GameObject / den Actor
Unity
MyComponent MyComp = gameObject.GetComponent<MyComponent>();UE C++
UMyComponent* MyComp = MyActor->FindComponentByClass<UMyComponent>();Blueprint
GameObjects / Actors finden
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
Hinzufügen von Tags zu GameObjects/Actors
Unity
MyGameObject.tag = "MyTag";UE C++
// Actors can have multiple tags
MyActor.Tags.AddUnique(TEXT("MyTag"));Blueprint
Hinzufügen von Tags zu MonoBehaviours/ActorComponents
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"));Vergleichen von Tags für GameObjects/Actors und MonoBehaviours/ActorComponents
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
Physik: RigidBody vs. Grundkörper-Komponente
In Unity weisen Sie einem GameObject eine RigidBody-Komponente zu, um ihm physikalische Eigenschaften zu verleihen.
In UE kann jede Grundkörper-Komponente (UPrimitiveComponent in C++) ein physikalisches Objekt darstellen. Einige häufige Grundkörper-Komponenten sind:
Form-Komponenten (
USphereComponent,UCapsuleComponentusw.)Statisches-Mesh-Komponenten
Skelett-Mesh-Komponenten
Im Gegensatz zu Unity, das die Zuständigkeiten für Kollisionen und Visualisierungen in separate Komponenten aufteilt, kombiniert UE die Konzepte „potenziell physikalisch“ und „potenziell sichtbar“ in einer einzigen Grundkörper-Komponente. Jede Komponente mit Geometrie in der Welt, die gerendert oder mit der physikalisch interagiert werden kann, ist eine Subklasse von UPrimitiveComponent.
Kollisionskanäle sind in UE das Äquivalent von Ebenen in Unity. Weitere Informationen finden Sie unter Kollisionsfilterung.
RayCast vs. RayTrace
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
Trigger-Volumen
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
Mehr über das Einrichten von Kollisionsreaktionen erfahren Sie unter Collision.
Kinematische Rigidbodies
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()
{
Input-Events
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
So könnten die Input-Eigenschaften in Ihren Projekt-Einstellungen aussehen:
Weitere Informationen zum Einrichten des Inputs für Ihr UE-Projekt finden Sie unter Input.
Weitere Informationen
Für weitere Informationen im Zusammenhang mit dem obigen Konzept empfehlen wir Ihnen, die folgenden Abschnitte zu lesen:
Gameplay Framework – Deckt die wichtigsten Spielsysteme ab, wie Spiel-Modus, Spieler , Controller, Pawn, Kamera und mehr.
Gameplay Architecture – Referenz zum Erstellen und Implementieren von Gameplay-Klassen.
Gameplay Tutorials – Tutorials zum Nachbauen geläufiger Gameplay-Elemente.