Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

變體

有關 Variant 的一般詳細說明,請參閱 Variant <class_Variant> 檔案頁面。

Godot.Variant 用來表示 Godot 的原生 Variant 型別。任何與 Variant 相容的型別都可以與其進行轉換。我們建議避免使用“Godot.Variant”,除非需要與非型別化引擎 API 互動。盡可能利用 C# 的型別安全性。

任何「Variant.As{TYPE}」方法或通用「Variant.As<T>」方法都可用於將「Godot.Variant」轉換為 C# 型別。由於「Godot.Variant」型別包含為所有支援的型別定義的隱式轉換,因此通常不需要直接呼叫這些方法。

使用 CreateFrom 方法重載或通用 Variant.From<T> 方法將 C# 型別轉換為 Godot.Variant 。

備註

由於 C# 中的 Variant 型別是一個結構體,因此它不能為 null。若要建立“null”變體,請使用“default”關鍵字或無參數建構函式。

自定變數型別

Variant 型別及其等效 C# 型別的完整列表:

變體

型別

Nil

null (不是型別)

Bool

bool

: int

long (Godot 在 Variant 中儲存 64 位元整數)

: float

double (Godot 在 Variant 中儲存 64 位元浮點數)

String[]

: String

Vector2[]

Vector2[]

Vector2[]

Vector2[]

Rect2

Godot.Rect2

Rect2I

Godot.Rect2I

Vector3

Godot.Vector3

Vector3I

Godot.Vector3I

Transform2D

Godot.Transform2D

Vector4

Godot.Vector4

Vector4I

Godot.Vector4I

Plane

Godot.Plane

Quaternion

Godot.Quaternion

Aabb

Godot.Aabb

Basis

Godot.Basis

Transform3D

Godot.Transform3D

Projection

Godot.Projection

Color

Godot.Color

StringName

Godot.StringName

NodePath

Godot.NodePath

Rid

Godot.Rid

Object

Godot.GodotObject or any derived type.

Callable

Godot.Callable

Signal

Godot.Signal

Dictionary

Godot.Collections.Dictionary

Array

Godot.Collections.Array

PoolByteArray

byte[]

PoolIntArray

int[]

PoolIntArray

float[]

PoolFloatArray

float[]

PoolFloatArray

byte[]

PoolStringArray

String[]

PoolVector2Array

Vector2[]

PoolVector3Array

Vector3[]

PoolColorArray

Color[]

警告

Godot 在 Variant 中使用 64 位元整數和浮點數。支援較小的整數和浮點型別,例如“int”、“short”和“float”,因為它們可以適應更大的型別。請注意,執行隱式轉換,因此使用錯誤的型別將導致潛在的精確度損失。

警告

列舉受“Godot.Variant”支援,因為它們的基礎型別是所有相容的整數型別。但是,隱式轉換不存在,列舉必須手動轉換為其基礎整數型別,然後才能與“Godot.Variant”轉換或使用通用“Variant.As<T>”和“ Variant.From<T>`` 方法來轉換它們。

enum MyEnum { A, B, C }

Variant variant1 = (int)MyEnum.A;
MyEnum enum1 = (MyEnum)(int)variant1;

Variant variant2 = Variant.From(MyEnum.A);
MyEnum enum2 = variant2.As<MyEnum>();

在通用本文中使用 Variant

使用泛型時,您可能有興趣將泛型「T」型別限制為 Variant 相容型別之一。這可以使用“[MustBeVariant]”屬性來實作。

public void MethodThatOnlySupportsVariants<[MustBeVariant] T>(T onlyVariant)
{
    // Do something with the Variant-compatible value.
}

與泛型 Variant.From<T> 結合使用,您可以從泛型 T 型別的實例取得 Godot.Variant 實例。然後它可以在任何只支援``Godot.Variant``結構的API中使用。

public void Method1<[MustBeVariant] T>(T variantCompatible)
{
    Variant variant = Variant.From(variantCompatible);
    Method2(variant);
}

public void Method2(Variant variant)
{
    // Do something with variant.
}

為了呼叫具有「[MustBeVariant]」屬性註釋的泛型參數的方法,該值必須是 Variant 相容型別或以「[MustBeVariant]」註釋的泛型「T」型別屬性也是如此。

public class ObjectDerivedClass : GodotObject { }

public class NonObjectDerivedClass { }

public void Main<[MustBeVariant] T1, T2>(T1 someGeneric1, T2 someGeneric2)
{
    MyMethod(42); // Works because `int` is a Variant-compatible type.
    MyMethod(new ObjectDerivedClass()); // Works because any type that derives from `GodotObject` is a Variant-compatible type.
    MyMethod(new NonObjectDerivedClass()); // Does NOT work because the type is not Variant-compatible.
    MyMethod(someGeneric1); // Works because `T1` is annotated with the `[MustBeVariant]` attribute.
    MyMethod(someGeneric2); // Does NOT work because `T2` is NOT annotated with the `[MustBeVariant]` attribute.
}

public void MyMethod<[MustBeVariant] T>(T variant)
{
    // Do something with variant.
}