@michadimin

Как загрузить нод на сцену в Godot Mono?

В GDScript, например, это выглядело бы вот так:
onready var node = $"../Node"

Но как сделать что-то подобное в C#...?

P.S Клянусь богом, если он существует, я натыкался на решение буквально вчера! Но попытки прогуглить это сейчас - успехом не увенчались...
  • Вопрос задан
  • 502 просмотра
Решения вопроса 1
@michadimin Автор вопроса
Ответ нашёл сам.
Хочу извиниться, ибо сначала неправильно указат строчку кода, которую подразумевал.
Я искал способ сделать аналог вот такому на C#:
var scene = preload("res://myscene.scn")
var node = scene.instance()
add_child(node)


Решение выглядит так:
//Загрузка сцены относительно локального пути проекта
        var scene = (PackedScene)ResourceLoader.Load("res://scenes/Scene.tscn"); 
        
        //Для загруженной сцены мы должны указать тип узла, который мы использовали при создании сцены которую хотим загрузить
        //Возможно, что немного не понятно, но я рассмотрю пример далее
        StaticBody2D newGround = (StaticBody2D)scene.Instance();
        
        //Добавляем дочерний узел в текущуую сцену
        AddChild(newGround);


Пример того, как это применил я:
Я создал сцену, которую назвал Player(чисто плейс-холдер, не более, ибо функции у неё вообще не те, о которых можно подумать)
На это сцене у меня находится узел RigidBody2D, имеющий 2 дочерних элемента: CollisionShape2D и Sprite.
6415756c9b183063641381.png

Далее я перешёл к главной сцене, которая у меня называется World.
641575d8805e8022735672.png
Объяснять что у меня на этой сцене уже находится я не стану, к теме не относится. И так видно, что это просто заготовка карты.

Далее мы привязываем скрипт к узлу World и пишем в него следующее:
public class World : Node2D
{
	
	public override void _Ready()
	{
		
	}

	public override void _Process(float delta)
	{
		if (Input.IsActionJustReleased("leftClick"))
		{
			var newPlayer = (PackedScene)ResourceLoader.Load("res://Assets//Player/Player.tscn");
			RigidBody2D newRigid = (RigidBody2D)newPlayer.Instance();
			newRigid.Position = GetViewport().GetMousePosition();
			AddChild(newRigid);
		}
	}
}

Этот код будет загружать на текущую сцену - сцену Player, с типом RigidBody2D.
Загрузка будет происходить левому клику мышки в позиции курсора внутри окна с игрой.

Для 4-ой версии Godot будет метод Instantiate() вместо Instance()


ВАЖНО!!!
Input.IsActionJustReleased("leftClick") - leftClick - это моё название действия клика левой кнопки мышки!
По умолчанию его не существует и вы должны сами его создать через меню "Проект" >> "Настройки проекта" >> "Список действий".
ВАЖНО!!!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
WNeZRoS
@WNeZRoS
$"..." - синтаксический сахар для get_node("...").

В C# это так будет:
private Node node;

public override void _Ready()
{
    node = GetNode<Node>("../Node");
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы