Cette page explique les concepts de programmation de gameplay de l'Unreal Engine (UE) pour les utilisateurs d'Unity. Dans les explications ci-dessous, nous supposons que vous connaissez Unity C# et que vous souhaitez apprendre à utiliser UE C++ et Blueprint.
Dans les exemples ci-dessous, nous vous décrivons certains cas d'utilisation courants de la programmation de gameplay dans Unity C# et comment implémenter les mêmes fonctionnalités dans l'UE.
Instancier un GameObject ou faire apparaître un acteur
Dans Unity, vous utilisez la fonction Instantiate pour créer de nouvelles instances d'objets. Cette fonction prend n'importe quel type UnityEngine.Object (GameObject, MonoBehaviour, etc.) et en fait une copie.
public GameObject EnemyPrefab;
public Vector3 SpawnPosition;
public Quaternion SpawnRotation;
void Start()
{
GameObject NewGO = (GameObject)Instantiate(EnemyPrefab, SpawnPosition, SpawnRotation);
NewGO.name = "MyNewGameObject";
}L'UE propose deux fonctions différentes pour instancier des objets :
NewObjectcrée de nouveaux typesUObject.SpawnActorgénère les typesAActor.
UObject et NewObject
Le processus de création de sous-classes UObject dans l’UE est similaire au processus de création de sous-classes ScriptableObject dans Unity. Ces sous-classes sont utiles pour les classes de gameplay qui n'ont pas besoin d’être générées dans le monde ou d'être jointes à des composants, comme c'est le cas des acteurs.
Dans Unity, si vous avez créé une sous-classe de ScriptableObject, vous pouvez l'instancier comme suit :
MyScriptableObject NewSO = ScriptableObject.CreateInstance<MyScriptableObject>();Dans l’UE, si vous créez une sous-classe de UObject, vous pouvez l'instancier comme suit :
UMyObject* NewObj = NewObject<UMyObject>();AActor et SpawnActor
Vous pouvez générer des acteurs à l'aide de la méthode SpawnActor sur un objet World (UWorld en C++). Certains UObjects et tous les acteurs fournissent une méthode GetWorld pour récupérer l'objet World.
Dans l'exemple ci-dessous, nous utilisons ces méthodes avec le paramètre de génération d'un acteur existant pour émuler la fonctionnalité de la méthode Instantiate d’Unity.
Exemple
Vous trouverez ci-dessous l'exemple d’une sous-classe AActor, notamment AMyActor. Le constructeur par défaut initialise les int32 et le composant USphereComponent*.
Observez l'utilisation de la fonction CreateDefaultSubobject. Cette fonction crée des composants et leur assigne des propriétés par défaut. Les sous-objets créés avec cette fonction font office de modèle par défaut, de sorte que vous pouvez les modifier dans une sous-classe ou dans Blueprint.
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
UPROPERTY()
int32 MyIntProp;
UPROPERTY()
USphereComponent* MyCollisionComp;
Cela crée un clone de AMyActor, qui comprend toutes les variables membres, les UPROPERTY et les composants.
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);
}Projeter d'un type à un autre
Dans cet exemple, nous obtenons un composant connu, puis nous le projetons vers un type spécifique et effectuons une action conditionnelle.
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
Il est possible de réaliser une conversion dans Blueprint à l’aide d’un nœud Cast to. Pour plus d'informations, consultez la rubrique Guide de démarrage rapide sur la conversion.
Détruire un GameObject ou un acteur
Détruire un GameObject ou un acteur (avec un délai d'une seconde)
Désactiver un GameObject ou un acteur
Unity C# C# | UE C++ C++ | Blueprint |
Accéder à un GameObject ou à un acteur depuis un composant
Unity C# C++ | UE C++ C++ | Blueprint |
Accéder à un composant depuis un GameObject ou un acteur
Unity
MyComponent MyComp = gameObject.GetComponent<MyComponent>();UE C++
UMyComponent* MyComp = MyActor->FindComponentByClass<UMyComponent>();Blueprint
Chercher un GameObject ou un acteur
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
Ajouter des balises aux GameObjects/acteurs
Unity
MyGameObject.tag = "MyTag";UE C++
// Actors can have multiple tags
MyActor.Tags.AddUnique(TEXT("MyTag"));Blueprint
Ajouter des balises aux 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"));Comparer les balises des GameObjects/acteurs et des 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
Physique : RigidBody et Composant primitif
Dans Unity, pour attribuer des caractéristiques physiques à un GameObject, vous devez joindre un composant RigidBody.
Dans l’UE, tout composant primitif (UPrimitiveComponent en C++) peut représenter un objet physique. Parmi les composants de primitive les plus courants figurent :
Composants de forme (
USphereComponent,UCapsuleComponent, etc.)Composants de maillage statique
Composants de maillage squelettique
Contrairement à Unity, qui sépare les responsabilités de collision et les visualisations en composants distincts, l'UE combine les concepts de "potentiellement physique" et "potentiellement visible" dans un composant primitif unique. Tout composant ayant une géométrie dans le monde, dont le rendu est possible ou avec lequel il est possible d'interagir physiquement, est une sous-classe de UPrimitiveComponent.
Les canaux de collision sont l'équivalent dans l'UE des couches dans Unity. Pour en savoir plus, consultez la rubrique Filtrage des collisions.
RayCast et 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
Volumes de déclenchement
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
Pour en savoir plus sur la configuration des réponses aux collisions, consultez la rubrique Collision.
Kinematic Rigidbody
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()
{
Événements de commandes
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
Voici un exemple de propriétés de commandes dans les paramètres d'un projet :
Pour en savoir plus sur la configuration des entrées de votre projet UE, consultez la rubrique Entrée.
Ressources supplémentaires
Pour en savoir plus sur les concepts ci-dessus, nous vous recommandons de consulter les sections suivantes :
Framework de gameplay - Cette rubrique décrit les systèmes de jeu de base, tels que le mode de jeu, l'état du joueur, les contrôleurs, les pions, les caméras, etc.
Architecture de gameplay - Références pour la création et l'implémentation de classes de gameplay.
Tutoriels de gameplay - Tutoriels de recréation d'éléments de gameplay courants.