Как мне получить доступ к синглтону, который я создал в сценарии автозагрузки в коде C # сцены? (Годо 3)

Поэтому я использую Mono-версию Godot 3. Мои скрипты написаны на C #. Я пытаюсь следовать этому руководству: http://docs.godotengine.org/en/latest/getting_started/step_by_step/singletons_autoload.html

Но код находится в GDScript, и все мои попытки адаптировать его не увенчались успехом. У меня есть скрипты, скомпилированные правильно (пришлось добавить их в свой .csproj), но я просто не могу получить доступ к объекту PlayerVars, который я установил в Global.cs в TitleScene.cs

Global.cs Настроен как автозагрузка с использованием системы; используя Годо;

public class Global : Node {

  private PlayerVars playerVars;

  public override void _Ready () {
    this.playerVars = new PlayerVars();
    int total = 5;
    Godot.GD.Print(what: "total is " + total);
    this.playerVars.total = total;
    GetNode("/root/").Set("playerVars",this.playerVars);
  }

}

PlayerVars.cs Класс для хранения переменных.

public class PlayerVars {
  public int total;
}

TitleScene.cs - Прикреплено к моей сцене по умолчанию:

using System;
using Godot;

public class TitleScene : Node {

    public override void _Ready () {
        Node playervars = (Node) GetNode("/root/playerVars");
        Godot.GD.Print("total in titlescene is" + playervars.total);
    }
}

Я чувствую, что делаю что-то очевидное неправильно. Любые идеи?


person Jaybill    schedule 02.02.2018    source источник


Ответы (1)


Ладно, разобрался.

Вы ссылаетесь на узел по имени, которое вы даете ему на этом экране в свойствах проекта:

экран свойств

В моем случае это было global.

Итак, теперь мой Global.cs выглядит так:

using System;
using Godot;

public class Global : Node
{

  private PlayerVars playerVars;

  public override void _Ready()
  {
    // Called every time the node is added to the scene.
    // Initialization here
    Summator summator = new Summator();
    playerVars = new PlayerVars();

    playerVars.total = 5;

    Godot.GD.Print(what: "total is " + playerVars.total);

  }

  public PlayerVars GetPlayerVars(){
    return playerVars;
  }

}

А мой TitleScene.cs выглядит так:

using System;
using Godot;

public class TitleScene : Node
{

  public override void _Ready()
  {
    // Must be cast to the Global type we derived from Node earlier to
    // use its custom methods and props
    Global global = (Global) GetNode("/root/global");
    Godot.GD.Print(global.GetPlayerVars().total);
  }

}
person Jaybill    schedule 03.02.2018
comment
Хорошая работа по поиску! Я вижу, что версия C # была добавлена ​​в учебное пособие тем временем, и в основном она это делает (просто используя var для вывода типа). Как ни странно, чтение вашего ответа решило мою проблему, хотя я использую GDScript, поскольку я обращался к / root / Root / global вместо / root / global (но в GDScript это даже проще, поскольку вы можете просто использовать тип, как если бы он был статический вызов: Global.GetPlayerVars()) - person hsandt; 22.01.2020