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 string(cadena).
Toda conversión de tipo dentro de Verse es explícita, lo que significa que debes utilizar una función como ToString() o utilizar un operador como multiplicar (*) para convertir un objeto a un tipo de datos diferente. La conversión explícita de un tipo a otro también se denomina proyección de tipo.
Conversión de Float a Int
Convertir de float a int requiere una función que especifique explícitamente cómo convertirá de un número de punto flotante a un número entero. Las siguientes funciones se encargan de la conversión, pero todas trabajan de forma diferente. Depende de ti decidir cuál funciona mejor en cada situación.
En este ejemplo, diferentes funciones convierten cuatro valores literales de float en valores int mediante 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
Conversión de Int a Float
El operador multiplicar (*) convierte el entero en un número de punto flotante antes de realizar la multiplicación. La forma de convertir un tipo de dato int a un tipo de dato float es multiplicar el entero por 1.0.
Este código convierte la variable StartingPositionX de int en float mediante multiplicación para que pueda utilizarse 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}")Conversión a cadena
Puedes convertir varios tipos de datos a una string mediante una función ToString() o interpolación de cadenas, que llame a una función ToString(). Actualmente, los siguientes tipos tienen funciones ToString() integradas en Verse.
float
int
[]char
char (carácter)
vector2
vector3
rotación
En este ejemplo, puedes ver variables que se convierten en una cadena a través de la interpolación de cadenas y las funciones 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
Conversión de un tipo de datos personalizado a una cadena
Los tipos de datos personalizados también pueden convertirse en cadenas mediante la implementación de 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 usará para convertir automáticamente tipos de datos en cadenas.
Este es un ejemplo de una 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"
Este es un ejemplo de una función ToString() personalizada para una clase personalizada. Observa que la función ToString() está declarada 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 =
Conversión de una referencia de objeto a un tipo diferente
Puedes convertir explícitamente referencias a objetos (o conversión de tipo) a diferentes clases o interfaces mediante 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 se intenta convertir la referencia. Esta es 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 realizar una conversión de tipo a otros tres tipos. Este es un desglose de los resultados.
| conversión de tipo square a | Resultado |
|---|---|
| es correcto porque |
| falla 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, el casting de tipo funcionará pero no es necesario. Este código tendrá el mismo resultado:
MyDrawable:positionable = MyShapeEjemplos de conversión de tipos
Un caso de uso para el casting de tipo de objeto en UEFN es encontrar actores de un cierto tipo y llamar a funciones basadas en el tipo. Para saber cómo hacerlo, consulta Cómo buscar actores con una etiqueta de juego.