全站通知:

Entities code

阅读

    

2023-07-25更新

    

最新编辑:晨1999

阅读:

  

更新日期:2023-07-25

  

最新编辑:晨1999

来自S&boxWIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
页面贡献者 :
晨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 检查。