27 października 2024

Czy ten Node2D to na pewno Player.cs?

Sprawdzałem jak szybko ładnie sformatować jakikolwiek kawałek kodu w bloggerze i trzeba przyznać, że bez zewnętrznego wsparcia blogger takiej funkcji nie daje. Stąd, po krótkich poszukiwaniach w celu znalezienia formattera trafił na jakąś stronkę takowy udostępniającą. W sumie to wstyd, że taki portal nie ma tej opcji wbudowanej... Może trzeba poszukać jakiegoś innego miejsca na swoje wpisy? 
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 
Działa też w przypadku gdy szukami interfejsu .

Brak komentarzy:

Prześlij komentarz

Tu możesz wstawić swój komentarz