Я нахожусь в главе о наследовании, где он создает родительскую сцену ItemContainer и две сцены, которые наследуются от него: туалет и коробка.
Мой код для трех классов такой:
Код: Выделить всё
using Godot;
using System;
public partial class ItemContainer : StaticBody2D
{
public virtual void Hit()
{
GD.Print("Ow");
}
}
Код: Выделить всё
using Godot;
using System;
public partial class toilet : ItemContainer
{
public override void Hit()
{
GD.Print("Toilet");
}
}
Код: Выделить всё
using Godot;
using System;
public partial class box : ItemContainer
{
public override void Hit()
{
GD.Print("Box");
}
}
Метод hit вызывается классом laser, который на данный момент выглядит следующим образом:
Код: Выделить всё
using Godot;
using System;
public partial class laser : Area2D
{
[Export] public float Speed = 750f;
public Vector2 direction;
public override void _Process(double delta)
{
this.Position += direction * (float)delta * Speed;
}
public void onCollision(Node2D body)
{
if (body.HasMethod("Hit")) ((drone)body).Hit();
QueueFree();
}
public void onTimeout()
{
QueueFree();
}
}
Я хотел бы знать, есть ли в C# способ просто запустите метод независимо от класса объекта или даже простой способ привести объект к типу объекта, не зная об этом заранее. Я нашел решение: изменил код лазера на:
Код: Выделить всё
public void onCollision(Node2D body)
{
if (body.HasMethod("Hit"))
{
if (body is drone drn) drn.Hit();
else if (body is ItemContainer itemC) itemC.Hit();
}
QueueFree();
}
Подробнее здесь: https://stackoverflow.com/questions/788 ... f-its-type
Мобильная версия