Up to date
This page is up to date for Godot 4.2
.
If you still find outdated information, please open an issue.
C#-Sprachfeatures¶
Diese Seite bietet einen Überblick über die häufig verwendeten Features von C# und Godot und wie sie zusammen verwendet werden.
Typumwandlung und Casting¶
C# ist eine statisch typisierte Programmiersprache, daher ist dies hier nicht möglich:
var mySprite = GetNode("MySprite");
mySprite.SetFrame(0);
Die Methode GetNode()
gibt eine Node
-Instanz zurück. Sie müssen sie explizit in den gewünschten abgeleiteten Typ konvertieren, in diesem Fall Sprite2D
.
Hierfür gibt es verschiedene Möglichkeiten in C#.
Casting und Typprüfung
Wirft InvalidCastException
, wenn der zurückgegebene Node nicht in Sprite2D gecastet werden kann. Sie sollten ihn anstelle des as
-Operators verwenden, wenn Sie ziemlich sicher sind, dass er nicht fehlschlagen wird.
Sprite2D mySprite = (Sprite2D)GetNode("MySprite");
mySprite.SetFrame(0);
Nutzen des AS-Operators
Der as
-Operator gibt null
zurück, wenn der Node nicht in Sprite2D gecastet werden kann, und aus diesem Grund kann er nicht mit Wertetypen verwendet werden.
Sprite2D mySprite = GetNode("MySprite") as Sprite2D;
// Only call SetFrame() if mySprite is not null
mySprite?.SetFrame(0);
Nutzen der generischen Methoden
Es werden auch generische Methoden bereitgestellt, um diese Typkonvertierung transparent zu machen.
GetNode<T>()
castet den Node, bevor er zurückgegeben wird. Es wird eine InvalidCastException
ausgelöst, wenn der Node nicht in den gewünschten Typ gecastet werden kann.
Sprite2D mySprite = GetNode<Sprite2D>("MySprite");
mySprite.SetFrame(0);
GetNodeOrNull<T>()
verwendet den Operator as
und gibt null
zurück, wenn der Node nicht in den gewünschten Typ gecastet werden kann.
Sprite2D mySprite = GetNodeOrNull<Sprite2D>("MySprite");
// Only call SetFrame() if mySprite is not null
mySprite?.SetFrame(0);
Typprüfung mit dem IS-Operator
Um zu prüfen, ob der Node in Sprite2D umgewandelt werden kann, können Sie den Operator is
verwenden. Der is
-Operator gibt false zurück, wenn der Node nicht in Sprite2D gecastet werden kann, andernfalls gibt er true zurück. Beachten Sie, dass das Ergebnis des Operators is
immer false
ist, wenn er gegen null
verwendet wird.
if (GetNode("MySprite") is Sprite2D)
{
// Yup, it's a Sprite2D!
}
if (null is Sprite2D)
{
// This block can never happen.
}
Sie können auch eine neue Variable deklarieren, um das Ergebnis des Casts bedingt zu speichern, wenn der Operator is
den Wert true
liefert.
if (GetNode("MySprite") is Sprite2D mySprite)
{
// The mySprite variable only exists inside this block, and it's never null.
mySprite.SetFrame(0);
}
Weitere Informationen zur Typprüfung finden Sie unter Pattern Matching.
Präprozessor-Defines¶
Godot verfügt über eine Reihe von Defines, mit denen Sie Ihren C#-Code ändern können, je nach Umgebung, in die Sie kompilieren.
Bemerkung
Wenn Sie Ihr Projekt vor Godot 3.2 erstellt haben, müssen Sie Ihre csproj-Datei ändern oder neu generieren, um dieses Feature zu verwenden (vergleichen Sie <DefineConstants>
mit einem neuen 3.2+ -Projekt).
Beispiele¶
Sie können beispielsweise den Code basierend auf der Plattform ändern:
public override void _Ready()
{
#if GODOT_SERVER
// Don't try to load meshes or anything, this is a server!
LaunchServer();
#elif GODOT_32 || GODOT_MOBILE || GODOT_WEB
// Use simple objects when running on less powerful systems.
SpawnSimpleObjects();
#else
SpawnComplexObjects();
#endif
}
Oder Sie können detektieren, in welcher Engine sich Ihr Code befindet, was für die Erstellung von Cross-Engine-Bibliotheken hilfreich ist:
public void MyPlatformPrinter()
{
#if GODOT
GD.Print("This is Godot.");
#elif UNITY_5_3_OR_NEWER
print("This is Unity.");
#else
throw new NotSupportedException("Only Godot and Unity are supported.");
#endif
}
Oder Sie können Skripte schreiben, die auf mehrere Godot-Versionen abzielen und die Vorteile von Funktionen nutzen, die nur in einigen dieser Versionen verfügbar sind:
public void UseCoolFeature()
{
#if GODOT4_3_OR_GREATER || GODOT4_2_2_OR_GREATER
// Use CoolFeature, that was added to Godot in 4.3 and cherry-picked into 4.2.2, here.
#else
// Use a workaround for the absence of CoolFeature here.
#endif
}
Vollständige Liste von Definitionen¶
GODOT
ist immer für Godot-Projekte definiert.TOOLS
ist beim Build mit der Debug-Konfiguration (Editor und Editor-Player) definiert.GODOT_REAL_T_IS_DOUBLE
ist definiert, wenn die PropertyGodotFloat64
auftrue
gesetzt ist.Eine von
GODOT_64
oderGODOT_32
ist definiert, je nachdem ob die Architektur 64-bit oder 32-bit ist.Eine von
GODOT_LINUXBSD
,GODOT_WINDOWS
,GODOT_OSX
,GODOT_ANDROID
,GODOT_IOS
,GODOT_HTML5
oderGODOT_SERVER
, abhängig vom Betriebssystem. Diese Namen können sich in Zukunft ändern. Sie werden von der Methodeget_name()
des Singletons OS erzeugt, aber nicht jedes mögliche Betriebssystem, das die Methode zurückgibt, ist ein Betriebssystem, auf dem Godot mit .NET läuft.GODOTX
,GODOTX_Y
,GODOTX_Y_Z
,GODOTx_OR_GREATER
,GODOTX_y_OR_GREATER
undGODOTX_Y_z_OR_GREATER
, wobeiX
,Y
undZ
durch die aktuelle Major-, Minor- und Patch-Version von Godot ersetzt werden.x
,y
undz
werden durch alle Werte von 0 bis zur aktuellen Versionsnummer für diese Komponente ersetzt.Bemerkung
Diese Defines wurden erstmals in Godot 4.0.4 und 4.1 hinzugefügt. Versions-Defines für frühere Versionen gibt es nicht, unabhängig von der aktuellen Godot-Version.
Zum Beispiel: Godot 4.0.5 definiert
GODOT4
,GODOT4_OR_GREATER
,GODOT4_0
,GODOT4_0_OR_GREATER
,GODOT4_0_5
,GODOT4_0_4_OR_GREATER
, undGODOT4_0_5_OR_GREATER
. Godot 4.3. 2 definiertGODOT4
,GODOT4_OR_GREATER
,GODOT4_3
,GODOT4_0_OR_GREATER
,GODOT4_1_OR_GREATER
,GODOT4_2_OR_GREATER
,GODOT4_3_OR_GREATER
,GODOT4_3_2
,GODOT4_3_0_OR_GREATER
,GODOT4_3_1_OR_GREATER
, undGODOT4_3_2_OR_GREATER
.
Beim Exportieren kann Folgendes auch abhängig von den Exportfunktionen definiert werden:
Eine von
GODOT_PC
,GODOT_MOBILE
oderGODOT_WEB
, abhängig vom Plattformtyp.Eine von
GODOT_WINDOWS
,GODOT_LINUXBSD
,GODOT_MACOS
,GODOT_ANDROID
,GODOT_IOS
, oderGODOT_WEB
, abhängig von der Plattform.
Ein Beispielprojekt finden Sie in der Betriebssystem-Testdemo: https://github.com/godotengine/godot-demo-projects/tree/master/misc/os_test