Esta página explica conceitos de programação de jogo da Unreal Engine (UE) para usuários Unity. As explicações abaixo pressupõem que você está familiarizado com Unity C# e quer aprender UE C++ e Blueprint.
Os exemplos abaixo abordam alguns casos de uso comuns de programação de jogabilidade em Unity C# e como implementar a mesma funcionalidade na UE.
Como instanciar GameObject / Spawning Actor
Em Unity, você usa a função instanciar para criar novas instâncias de objetos. Essa função recebe qualquer tipo UnityEngine.Object (GameObject, MonoBehaviour, etc.) e faz uma cópia dele.
public GameObject EnemyPrefab;
public Vector3 SpawnPosition;
public Quaternion SpawnRotation;
void Start()
{
GameObject NewGO = (GameObject)Instantiate(EnemyPrefab, SpawnPosition, SpawnRotation);
NewGO.name = "MyNewGameObject";
}A UE tem duas funções diferentes para instanciar objetos:
NewObjectcria novos tipos deUObject.SpawnActorgera tipos deAActor.
UObjects e NewObject
Criar subclasses de UObject na UE é semelhante a criar subclasses ScriptableObject em Unity. Essas classes de jogabilidade são úteis e não precisam ser geradas no mundo nem anexadas a componentes como os Atores.
Em Unity, se você criou uma subclasse de ScriptableObject, pode instanciá-la desta forma:
MyScriptableObject NewSO = ScriptableObject.CreateInstance<MyScriptableObject>();Na UE, se você criar uma subclasse de UObject, poderá instanciá-la desta forma:
UMyObject* NewObj = NewObject<UMyObject>();AActors e SpawnActor
Você pode gerar Atores usando o método SpawnActor em um objeto de Mundo (UWorld em C++). Alguns UObjects e todos os atores fornecem um método GetWorld para obter o objeto de mundo.
No exemplo a seguir, usamos esse método com um parâmetro de surgir de ator existente para emular a funcionalidade do método instanciar do Unity.
Exemplo
Veja a seguir o exemplo de subclasse AActor, AMyActor. O constructor padrão inicializará o int32 e o UsphereComponent*.
Observe o uso da função CreateDefaultSubobject. Esta função cria componentes e atribui propriedades padrão a eles. Os subobjetos criados com essa função atuam como um modelo padrão, para que você possa modificá-los em uma subclasse ou Blueprint.
UCLASS()
class AMyActor : public AActor
{
GENERATED_BODY()
UPROPERTY()
int32 MyIntProp;
UPROPERTY()
USphereComponent* MyCollisionComp;
Isso cria uma clonagem de AMyActor, incluindo todas as variáveis de membro, UPROPERTYs e componente.
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);
}Como converter de um tipo para outro
Nesse caso, obtemos um componente que sabemos que temos, depois convertemos em um tipo específico e fazemos algo condicionalmente.
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
Você pode converter em Blueprint usando um conversor para nó. Para obter informações mais detalhadas, consulte o Guia de início rápido de conversão.
Como Destruir um GameObject / Ator
Como Destruir um GameObject / Actor (com atraso de 1 segundo)
Como Desativar GameObjects / Atores
Unity C# C# | UE C++ C++ | Blueprint |
Como Acessar o GameObject / Ator a partir de um Componente
Unity C# C++ | UE C++ C++ | Blueprint |
Como Acessar um Componente a partir do GameObject / Ator
Unity
MyComponent MyComp = gameObject.GetComponent<MyComponent>();UE C++
UMyComponent* MyComp = MyActor->FindComponentByClass<UMyComponent>();Blueprint
Como Localizar GameObjects / Atores
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
Como adicionar tags a GameObjects / Atores
Unity
MyGameObject.tag = "MyTag";UE C++
// Actors can have multiple tags
MyActor.Tags.AddUnique(TEXT("MyTag"));Blueprint
Como adicionar tags a 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"));Como comparar tags em GameObjects / Atorrs e 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
Física: RigidBody vs. Componente primitivo
Em Unity, para fornecer características físicas a um GameObject, você anexa um componente RigidBody.
Na UE, qualquer componente primitivo (UPrimitiveComponent em C++) pode representar um objeto físico. Alguns componentes primitivos comuns são:
Componentes de forma (
USphereComponent,UCapsuleComponent, etc.)Componentes de malha estática
Componentes de Malha esquelética
Ao contrário do Unity, que separa as responsabilidades de colisão e visualizações em componentes separados, a UE combina os conceitos de "potencialmente físico" e "potencialmente visível" em um único componente primitivo. Qualquer componente com geometria no mundo que possa ser renderizado ou com o qual se possa interagir fisicamente é uma subclasse de UPrimitiveComponent.
Os canais de colisão são o equivalente da UE às camadas em Unity. Para saber mais, consulte Filtro de Colisão.
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
Volumes de disparador
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
Para saber mais sobre como configurar respostas a colisões, consulte Colisão.
Corpos Rígidos Cinemáticos
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()
{
Entrada de Eventos
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
Esta é a aparência das propriedades de entrada nas Configurações de Projeto:
Para saber mais sobre como configurar a entrada para seu projeto da UE, consulte Entrada.
Leitura adicional
Para saber mais sobre os conceitos acima, recomendamos conferir as seguintes seções:
Framework de jogabilidade: abrange os principais sistemas, como modo de jogo, estado do jogador, controles, pawns, câmera e mais.
Arquitetura de jogabilidade: referência para criar e implementar classes de jogabilidade.
Tutoriais de jogabilidade: tutoriais para recriar elementos comuns de jogabilidade.