Kod poniżej dalej wygląda jak kupa, ale przynajmniej trzyma tabulacje
Whatever, bo nie o tym miało być.
Pisząc w Godot, ale używając C# często i gęsto natknie się człowiek na problem jaki to typ obiektu wpadł Ci do metody i czy możesz coś z nim zrobić.
Godot pod tym względem jest... powiedzmy... automagiczny jak każdy słabo typowalny język. Radzi sobie z automatycznym typowaniem węzłów i powiązanych z nimi skryptów i nie robi przeszkód. Czasem zrzuci błąd, ale nie martw się - dowiesz się o nim w runtime gdy twój mozolnie cyzelowany kawałek kodu wyloguje do konsoli tysiące błędów w 10 sec.
W C# zaś jesteśmy skazani na ostrą typowalność zmiennych i takie cuda jak int raz będący Stringiem a jednocześnie Node2D nie przejdą. Stąd trzeba sobie radzić i rzutować.
Poniżej przykład klasy, która w oparciu o generyki zrzutuje obiekt godota na coś sensownego (lub nie ;p )
using Godot;
using System;
public static class VariantTester<T>
{
public static T GetType(Variant unknown)
{
switch (unknown.VariantType)
{
case Variant.Type.Nil:
break;
case Variant.Type.Int:
break;
case Variant.Type.Object:
return CheckIsT(unknown);
}
return default;
}
private static T CheckIsT(Variant unknown)
{
try
{
if (unknown.AsGodotObject() is T matching)
{
return matching;
}
else
{
return (T)Convert.ChangeType(unknown.AsGodotObject(), typeof(T));
}
}
catch (InvalidCastException)
{
return default;
}
}
}
Wywołanie tego kawałka kodu jest proste jak drut - tak jak i późniejsze użycie
// jakas tam klasa gdzie nam wpada Node2D do funkcji
public void OnBodyIn(Node2D node)
{
if (node.IsInGroup("Player")) // ulatwijmy sobie
{
// proba rzutowania // sprawdzenie null-safe w c# i wywolanie metody na znalezionej klasie :)
VariantTester<Player>.GetType(node)?.AddItemToInventory(itemResource);
}
}
Na razie na coś wiele mądrzejszego nie wpadłem (w sumie C# używam jakieś 3 tygodnie także miejcie litość) , a jak macie lepszy pomysł to zapraszam do komentarzy
Brak komentarzy:
Prześlij komentarz
Tu możesz wstawić swój komentarz