ebSkola

3.4 Custom C# klases editorā redzamas

Stundas uzdevums: Padarīt savu C# klasi pilnvērtīgi izmantojamu Godot editor (ar Inspector īpašībām).

SR 2.4.7. UI SR 2.4.18. OOP

80 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~20 min) - padari klasi redzamu editorā · 2. uzdevums (~25 min) - pievieno rediģējamas īpašības · 3. uzdevums (~20 min) - iestati vērtības Inspector un pārbaudi · Iesniegšana (~5 min).

Pirms sāc: atver savu projektu. Šodien tavu C# klasi varēs noregulēt bez koda maiņas - tieši Godot editorā, kā jebkuru citu mezglu.

Teorija: GlobalClass un Export īpašības

Lai C# klase parādītos Godot Add Node dialogā, tai pievieno atribūtu [GlobalClass]. Lai laukus varētu rediģēt Inspector panelī, tiem pievieno [Export]. Pēc C# izmaiņām projekts ir jāuzbūvē ar Godot Build pogu.

using Godot;
using System;

[GlobalClass]
public partial class Obstacle : CharacterBody2D
{
    private int energy = 50;
    private float speed = 100.0f;

    [Export]
    public string ObstacleName { get; set; } = "PrinterQueue";

    [Export(PropertyHint.Range, "0,500")]
    public int Energy
    {
        get => energy;
        set => energy = Math.Max(0, value);
    }

    [Export(PropertyHint.Range, "0,500,0.1")]
    public float Speed
    {
        get => speed;
        set => speed = Math.Max(0.0f, value);
    }
}

Kā šo izmantot projektā

Atceries: ar redzamu efektu editorā nepietiek. Paskaidro, kura C# klase glabā stāvokli, kura metode to maina un kā Godot node struktūra izmanto šo kodu.

Pārbaudi: katrai būtiskai turnīra lomai ir C# klase vienā .cs failā, ar konstruktoriem, metodēm, signāliem vai mantošanu.

public class OopCheckpoint
{
    public string Lesson = "3.4 Custom C# klases editorā redzamas";
    public bool UsesCSharp = true;
    public bool HasScriptFile = true;
    public bool HasSingleResponsibility = true;
    public bool UsesGodotInspector = true;
}

Praktiskie uzdevumi

1. uzdevums -

Padari klasi redzamu editorā

Beigās tavu C# klasi varēs pievienot scēnai kā parastu mezglu.

  1. Izveido failu Obstacle.cs ar klasi Obstacle, kas manto no CharacterBody2D.
  2. Pievieno virs klases atribūtu [GlobalClass].
  3. Pievieno privātus laukus private int energy = 50; un private float speed = 100.0f;.
  4. Pārbaudi, ka faila nosaukums ir tieši Obstacle.cs, jo C# global class ir reģistrjutīgs.
  5. Būvē projektu ar Godot Build pogu.
  6. Pievieno mezglu scēnai, meklējot Obstacle.
  7. Pieraksti, kas notiek, ja [GlobalClass] rindu izdzēš un būvē vēlreiz.

Gatavs, kad: mezglu meklētājā parādās tips Obstacle, un to var pievienot scēnai.

2. uzdevums -

Pievieno rediģējamas īpašības

Beigās laukus varēs mainīt Inspector panelī.

  1. Uzraksti īpašību [Export] public int Energy { get; set; } = 50;.
  2. Pievieno ātrumam diapazonu ar [Export(PropertyHint.Range, "0,500,0.1")] public float Speed { get; set; } = 100.0f;.
  3. Pievieno tekstam [Export] public string ObstacleName { get; set; } = "PrinterQueue";.
  4. Pievieno setter ar pārbaudi, ja vēlies neļaut negatīvu enerģiju.
  5. Būvē un atver mezgla Inspector paneli.
  6. Pārbaudi, ka tur redzami abi lauki.

Gatavs, kad: Inspector panelī pie tava mezgla ir redzami lauki energy un speed.

3. uzdevums -

Iestati vērtības Inspector un pārbaudi

Beigās viena klase apkalpos vairākus dažādus šķēršļus.

  1. Ievelc scēnā trīs Obstacle mezglus.
  2. Iestati katram Inspector panelī citu energy un speed vērtību.
  3. Izdrukā _Ready() metodē abus laukus.
  4. Palaid spēli un pārbaudi, vai izdrukā ir tavas ievadītās vērtības.
  5. Mēģini Inspector panelī ievadīt negatīvu enerģiju.
  6. Pieraksti, vai tava pārbaude to noķēra.
  7. Saglabā scēnu un veic commit.

Gatavs, kad: trīs mezgli izdrukā trīs dažādas vērtības, un negatīva enerģija tiek automātiski salabota.

Papildu uzdevums - Pievieno izvēlni ar variantiem

Ja pamatdarbs ir gatavs, ļauj Inspector panelī izvēlēties šķēršļa veidu.

  1. Pievieno lauku [Export(PropertyHint.Enum, "PrinterQueue,WifiDrop,MissingMarker")] public string ObstacleType { get; set; } = "PrinterQueue";.
  2. Būvē un atver Inspector paneli.
  3. Izvēlies nolaižamajā sarakstā vienu variantu.
  4. Izdrukā izvēlēto veidu, palaižot spēli.

Gatavs, kad: Inspector panelī ir nolaižams saraksts ar trim šķēršļu veidiem.

Ko sagatavo

Stundas mērķis: Tava C# klase parādās Godot editorā kā mezgla tips, tās lauki ir rediģējami Inspector panelī, un vairāki viena tipa mezgli var strādāt ar dažādām vērtībām bez koda maiņas.

GitHub krātuvē jābūt:

  1. Fails Obstacle.cs ar [GlobalClass] un [Export] īpašībām.
  2. Ekrānuzņēmums ar Inspector paneli, kurā redzami tavi lauki.
  3. Ekrānuzņēmums ar Output paneli, kurā trīs mezgli izdrukā trīs dažādas vērtības.
  4. README.md: kāpēc noderīgi, ka vērtību var mainīt editorā, nevis kodā.

Kā iesniedz: Veic commit un push. Skolotāja norādītajā vietā ievieto tikai GitHub krātuves saiti; visiem prasītajiem failiem, README.md pierakstiem un pierādījumiem jābūt pašā krātuvē.

Biežākās kļūdas

  • Inspector lauks neparādās: pēc [Export] pievienošanas nospied Godot Build.
  • Klase neparādās Add Node: pārbaudi [GlobalClass] un to, ka fails saucas Obstacle.cs.
  • Export hint kļūda: pārbaudi PropertyHint.Range vai PropertyHint.Enum sintaksi.

Godot ekrānuzņēmumi

Godot Inspector ar Participant node, redzamas grupas 'Stats' (ENERGY slider 0-200), 'Turnīrs' (Focus, Calm) un 'Identity' (Name).
Godot Inspector ar Participant node, redzamas grupas 'Stats' (ENERGY slider 0-200), 'Turnīrs' (Focus, Calm) un 'Identity' (Name).

Koda piemērs (paplašināts)

using Godot;
using System;

public partial class Obstacle : CharacterBody2D
{
    private int energy = 50;
    private float speed = 100.0f;

    [Export]
    public string ObstacleName { get; set; } = "PrinterQueue";

    [Export(PropertyHint.Range, "0,500")]
    public int Energy
    {
        get => energy;
        set => energy = Math.Max(0, value);
    }

    [Export(PropertyHint.Range, "0,500,0.1")]
    public float Speed
    {
        get => speed;
        set => speed = Math.Max(0.0f, value);
    }
}
Inspector rāda Participant ar Stats grupu, kurā ir ENERGY slider 0-200, FOCUS skaitlis, CALM skaitlis.