Cuando se trabaja con datos, a menudo es necesario convertir variables de un tipo de datos a otro. Por ejemplo, para mostrar el resultado de un cálculo es necesario convertir de float a cadena.
Toda conversión de tipos dentro de Verse es explícita, lo que significa que debes utilizar una función como ToString() o utilizar un operador de multiplicación (*) para convertir un objeto a un tipo de datos diferente. La conversión explícita de un tipo a otro también se denomina casting de tipo.
Cómo convertir float a int
Convertir un float a un int requiere una función que especifique explícitamente cómo convertirá de un número de coma flotante a un número entero. Las siguientes funciones se encargan de la conversión, pero todas trabajan de forma diferente. Tú decides cuál funciona mejor en cada situación.
En este ejemplo, diferentes funciones convierten cuatro valores literales `float` en valores `int` utilizando el operador `or` para crear un contexto de fallo. A continuación, set asigna los valores a variables de tipo `int`.
# The Int[] method has the <decides> effect,
# This means that we need to account for failure as it is a failable expression.
# This results in the following
# var WoodInt:int = failable expression or the value if it fails.
var WoodCollectedFloat:float = 10.5
var WoodInt:int = Int[WoodCollectedFloat] or 0
Print("Printing WoodInt Value (10): {WoodInt}")
# Similar to Int[], Floor[], Ceil[], and Round[] also have the <decides> effect
En este ejemplo, la expresión if crea el contexto de fallo para estas funciones falibles y set asigna los valores a variables de tipo int.
var WoodCollected:int = 0
var StoneCollected:int = 0
var GoldCollected:int = 0
var FoodCollected:int = 0
if:
# This block is the condition of the if expression
# Which creates the failure context
# If any fail, the entire chain of execution is rolled back
# And the else branch, if it exists, is executed
Cómo convertir int a float
El operador de multiplicación (*) convierte el entero en un número de coma flotante antes de realizar la multiplicación. La forma de convertir de un tipo de datos int a un tipo de datos float es multiplicar el entero por 1.0.
Este código convierte la variable int StartingPositionX en una float mediante multiplicación para poder utilizarla en la declaración de una variable vector3. El tipo de datos vector3 requiere valores de tipo float para sus campos X, Y y Z.
# Required for the vector3 type
using { /UnrealEngine.com/Temporary/SpatialMath}
var StartingPositionX:int = 960
# CurrentX = 960.0
var CurrentX:float = StartingPositionX * 1.0
var CurrentPosition:vector3 = vector3{X := CurrentX, Y := 0.0, Z := 0.0}
Print("CurrentX: {CurrentX}")Cómo convertir a una cadena
Puedes convertir varios tipos de datos en una string utilizando una función ToString() o una interpolación de cadenas, que llame a una función ToString(). Actualmente, los siguientes tipos tienen funciones ToString() incorporadas en Verse.
float
int
[]char
char
vector2
vector3
rotation
En este ejemplo, puedes ver cómo las variables se convierten en una cadena mediante las funciones de interpolación de cadenas y ToString(). Ambos métodos tienen el mismo resultado porque la interpolación de cadenas llama a ToString().
var WoodCollected:int = 100
# Convert using string interpolation
Print("WoodCollected: { WoodCollected }")
# or ToString() function
Print("WoodCollected: " + ToString(WoodCollected))
var InitialDistance:float = 3.625
# Convert using string interpolation
Print("InitialDistance: { InitialDistance }")
# or ToString() function
Cómo convertir un tipo de datos personalizado en una cadena
Los tipos de datos personalizados también pueden convertirse en cadenas implementando una función ToString(custom_type) para el tipo de datos. Si existe una función ToString(custom_type), la interpolación de cadenas la utilizará para convertir automáticamente los tipos de datos en cadenas.
Aquí tienes un ejemplo de función ToString() personalizada para un enum de frutas.
fruit := enum:
Apple
Banana
Strawberry
ToString(Fruit: fruit):string =
case(Fruit):
fruit.Apple => "Apple"
fruit.Banana => "Banana"
fruit.Strawberry => "Strawberry"
Aquí tienes un ejemplo de función ToString() personalizada para una clase personalizada. Observa que la función ToString() se declara fuera de la clase waypoint. En la función SetDestination(), la interpolación de cadenas de Destination está llamando a la función personalizada ToString().
# Custom class with constructor and a ToString() function
waypoint := class():
DisplayName:string
Position:vector3 = vector3{}
MakeWaypoint<constructor>(Name:string, X:float, Y:float, Z:float) := waypoint:
DisplayName := Name
Position := vector3{X := X, Y := Y, Z := Z}
ToString(Waypoint: waypoint):string =
Cómo convertir una referencia de objeto a un tipo diferente
Puedes convertir explícitamente referencias a objetos (o casting de tipo) a diferentes clases o interfaces utilizando la siguiente sintaxis:
if (NewObjectReference := object_type_to_cast_to[ObjectReference]) {}El object_type_to_cast_to representa la clase o interfaz a la que intentas convertir la referencia. Se trata de una expresión falible porque la conversión de tipo fallará si el objeto no puede convertirse al tipo especificado. El intento de convertir una referencia de objeto a una clase fallará si la clase no coincide con el tipo del objeto, el tipo de una superclase o una interfaz que implemente la clase del objeto.
Este código declara una interfaz positionable, una clase abstracta shape que hereda de positionable y dos subclases de shape: triangle y square. A continuación, crea un objeto de tipo square llamado MyShape e intenta convertirlo a otros tres tipos. Aquí tienes un desglose de los resultados.
| square Type Cast To | Resultado |
|---|---|
| es correcto porque |
| es incorrecto porque |
| es correcto porque |
# Class and interface definitions
positionable := interface() {}
shape := class<abstract>(positionable) {}
triangle := class(shape) {}
square := class(shape) {}
# Create a square object referenced using the superclass type shape
MyShape:shape = square{}
# This will succeed since MySquare is a square object
En el último ejemplo, la conversión de tipo funcionará, pero no es necesaria. Este código tendrá el mismo resultado:
MyDrawable:positionable = MyShapeEjemplos de conversión de tipo
Un caso de uso de la conversión de tipo de objetos en UEFN es encontrar actores de un tipo determinado y llamar a funciones basadas en el tipo. Para saber cómo lograrlo, consulta Cómo encontrar actores con una etiqueta de jugabilidad.