Entities code
阅读
2023-07-25更新
最新编辑:晨1999
阅读:
更新日期:2023-07-25
最新编辑:晨1999
实体是可以放置在游戏世界中的对象,例如道具、玩家和重生点。它们可以通过 C# API 创建和生成,也可以作为关卡的一部分自动生成。
- Entity 是所有实体的基类。
- RenderEntity 扩展了 Entity ,并可用于自定义渲染。
- ModelEntity 扩展了 Entity ,并增加了对非动画模型的支持。
- AnimatedEntity 扩展了 ModelEntity ,并增加了对动画模型的支持。
生成实体
创建实体类的新实例会自动在世界中生成实体。
Entity myEntity = new MyEntity();
生成实体会调用虚拟方法 Entity.Spawn(),如果在客户端复制实体,则调用 Entity.ClientSpawn()。
[Library("sb_myent", Title = "My Entity")]
class MyEntity : Entity
{
...
}
public void SpawnEntity() {
MyEntity ent = TypeLibrary.Create<MyEntity>("sb_myent");
}
事件 / 重写
当实体被创建以及销毁时,它们会自动注册以接收来自事件系统的事件。
partial class MyEntity : Entity
{
[Event.Tick]
void Tick()
{
Log.Info( $"This is called every tick whilst {this} lives." );
}
}
除了事件系统外,实体还有许多虚拟方法可以重写,你可以使用 Intellisense(代码补全) 找到所有这些方法。
public override void Touch( Entity other )
{
Log.Info( $"{this} says {other} is touching me." );
}
联网 / 复制
实体会根据 Entity.Transmit 的设置从服务器复制到客户端。默认情况下,实体只传送给能看到它们的客户端。
partial class MyEntity : Entity
{
public override void Spawn()
{
// 始终向所有客户端传输该实体
Transmit = TransmitType.Always;
}
}
当实体被复制时,任何标记为 Networked(网络类型) 的属性也会被复制到客户端的实体中。
partial class MyEntity : Entity
{
[Net] public string MyString { get; set; }
}
组件(Components)
实体可以有实体组件,这些组件会自动复制到客户端。
partial class MyEntity : Entity
{
public override Spawn()
{
Components.Create<MyComponent>();
}
}
Hammer 和其他工具
实体可以链接到 Hammer 等工具。有关此过程的更多信息,请参阅此页
删除实体
实体不会像普通 C# 类型那样被垃圾回收,因为它们属于整个世界。通过调用 Entity.Delete(),可以显式地删除实体。这些实体会变为无效,不应再被使用。
任何对已删除实体的引用都会在 Entity.IsValid() 中返回 false,因此应使用此方法来代替对实体的 null 检查。