Entities components
阅读
2023-08-26更新
最新编辑:TrimesS_
阅读:
更新日期:2023-08-26
最新编辑:TrimesS_
实体可以有组件,组件是代码类,可以在游戏过程中通过代码与实体连接或分离。由于实体组件是无限制的,它们几乎可以用于任何用途,从为玩家提供power-ups,到处理高级 NPC AI 行为。
实体组件也是网络化的,因此一旦添加到实体上,客户端和服务器端都可以使用。
许多其他游戏引擎都使用类似的组件模型,包括 Unity 和 Unreal。
定义组件
public partial class MyComponent : EntityComponent
{
[Net] public string MyVariable { get; set; }
// 组件也支持 [Predicted]
[Net, Predicted] public int MyPredictedVariable { get; set; }
}
组件也可以拥有事件。
public partial class FlyingComponent : EntityComponent
{
[GameEvent.Tick]
public void OnTick()
{
Entity.Velocity += Vector3.Up * 16.0f;
}
}
创建组件
您可以随时从实体中创建、获取和删除组件,在这个例子中,我们只是在生成时分配他们。
public partial class MyEntity : Entity
{
public override void Spawn()
{
var c = Components.Create<MyComponent>();
var c = Components.GetOrCreate<MyComponent>();
var c = Components.Get<MyComponent>();
var c = new MyComponent();
Components.Add( c );
Components.Remove( c );
Components.RemoveAll();
foreach ( var c in Components.GetAll<MyComponent>() )
{
}
foreach ( var c in Components.GetAll<EntityComponent>() )
{
}
}
}
绑定组件
如果需要经常访问某个组件,并希望在服务器和客户端之间建立网络引用,可以使用 BindComponent
属性(attribute)将组件设置为属性(property)。
public partial class MyEntity : Entity
{
[BindComponent] public MyComponent Component { get; }
public override void Spawn()
{
Components.Create<MyComponent>();
base.Spawn();
}
}
现在,"组件 "在客户端和服务器上都将指向同一个网络组件。
- 请注意,您仍然需要创建组件,而且只能在服务器上创建。
- 您也不需要将组件分配给属性,因为该属性不应该有设置器。
脚注
- 客户端也是实体,可以在 Client.Components 中拥有组件。