Bei der Arbeit mit Daten ist es oft notwendig, Variablen von einem Daten Typ in einen anderen zu konvertieren. Die Anzeige des Ergebnisses einer Berechnung erfordert zum Beispiel die Konvertierung von float in einen string.
Alle Typkonverierungen in Verse sind explizit, d. h. du musst eine Funktion wie ToString() oder einen Operator wie multiplizieren (*) verwenden, um ein Objekt in einen anderen Datentyp zu konvertieren. Die explizite Konvertierung eines Typs in einen anderen wird auch Typ-Casting genannt.
Konvertieren von Float zu Int
Die Konvertierung von einer float in einen Int erfordert eine Funktion, die ausdrücklich angibt, wie sie von einer Fließkommazahl in eine Ganzzahl konvertiert. Die folgenden Funktionen dienen alle der Konvertierung, arbeiten aber alle unterschiedlich. Es liegt an dir, zu entscheiden, was in einer bestimmten Situation am besten funktioniert.
In diesem Beispiel konvertieren verschiedene Funktionen vier Float-Literalwerte mithilfe des „or“-Operators in Int-Werte, um einen Fehlerkontext zu erstellen. Als Nächstes weist set die Werte Variablen vom Typ int zu.
# 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
In diesem Beispiel erstellt der if-Ausdruck den Fehlerkontext für diese fehlbaren Funktionen und set weist die Werte den Variablen des Typs int zu.
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
Konvertieren von Int zu Float
Der Multiplikationsoperator (*) konvertiert die Ganzzahl in eine Fließkommazahl, bevor die Multiplikation durchgeführt wird. Die Konvertierung von einem int zu einem float-Datentyp erfolgt durch Multiplikation der Ganzzahl mit 1,0.
Dieser Code wandelt die int Variable StartingPositionX durch Multiplikation in ein float, so dass sie in der Deklaration einer vector3 Variable verwendet werden kann. Für den Datentyp vector3 sind Werte vom Typ float für die Felder X, Y und Z erforderlich.
# 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}")Konvertieren in einen String
Du kannst mehrere Datentypen zu einem string konvertieren, indem du entweder eine ToString() Funktion oder string interpolation benutzt, die eine ToString() Funktion aufruft. Derzeit haben die folgenden Typen eingebaute ToString() Funktionen in Verse.
float
int
[]char
Zeichen
vector2
vector3
Drehung
In diesem Beispiel wird gezeigt, wie Variablen durch String Interpolation und ToString() Funktionen zu einem String konvertiert werden. Beide Methoden haben das gleiche Ergebnis, da die String-Interpolation ToString() aufruft.
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
Konvertieren eines benutzerdefinierten Datentyps in einen String
Benutzerdefinierte Datentypen können auch in Strings umgewandelt werden, indem eine Funktion ToString(custom_type) für den Datentyp implementiert wird. Wenn eine ToString(custom_type)-Funktion existiert, verwendet die String-Interpolation diese, um Datentypen automatisch in Strings zu konvertieren.
Hier ist ein Beispiel für eine benutzerdefinierte ToString()-Funktion für eine enum von Früchten.
fruit := enum:
Apple
Banana
Strawberry
ToString(Fruit: fruit):string =
case(Fruit):
fruit.Apple => "Apple"
fruit.Banana => "Banana"
fruit.Strawberry => "Strawberry"
Hier ist ein Beispiel für eine benutzerdefinierte ToString()-Funktion für eine benutzerdefinierte Klasse. Beachte, dass die Funktion ToString() außerhalb der Klasse waypoint deklariert ist. In der Funktion SetDestination() ruft die String-Interpolation von Destination die benutzerdefinierte Funktion ToString() auf.
# 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 =
Konvertieren einer Objektreferenz in einem anderen Typ
Du kannst Referenzen auf Objekte (oder type cast) explizit in verschiedene classes oder interfaces konvertieren, indem du die folgende Syntax verwendest:
if (NewObjectReference := object_type_to_cast_to[ObjectReference]) {}Der object_type_to_cast_to steht für die Klasse oder Interface, zu der du die Referenz zu konvertieren versuchst. Dies ist ein fehlbarer Ausdruck, da das Typ-Casting fehlschlägt, wenn das Objekt nicht zum angegebenen Typ konvertiert werden kann. Der Versuch, eine Objekt-Referenz zu einer Klasse zu konvertieren, schlägt fehl, wenn die Klasse nicht mit dem Typ des Objekts, dem Typ einer Oberklasse oder eines Interface übereinstimmt, das von der Klasse des Objekts implementiert wird.
Dieser Code deklariert ein Interface positionable, eine abstract class shape, die von positionable übernimmt, und zwei Subklassen von shape: triangle und square. Dann wird ein Objekt vom Typ Quadrat mit dem Namen MyShape erstellt und versucht, einen Typ-Cast für drei andere Typen durchzuführen. Hier ist eine Aufschlüsselung der Ergebnisse.
| quadratischer Typ-Cast zu | Ergebnis |
|---|---|
| erfolgreich, weil |
| schlägt fehl, weil |
| erfolgreich, weil |
# 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
Im letzten Beispiel ist ein Typ-Casting möglich, aber nicht notwendig. Dieser Code führt zu demselben Ergebnis:
MyDrawable:positionable = MyShapeBeispiele für die Verwendung der Typkonvertierung
Ein Anwendungsfall für das Typ-Casting von Objekten in UEFN ist die Suche nach Actors eines bestimmten Typs und der Aufruf von Funktionen auf der Grundlage des Typs. Um herauszufinden, wie man das macht, siehe Finding Actors with a Gameplay Tag in Gameplay Tags.