全站通知:

Entities components

阅读

    

2023-08-26更新

    

最新编辑:TrimesS_

阅读:

  

更新日期:2023-08-26

  

最新编辑:TrimesS_

来自S&boxWIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
页面贡献者 :
-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 中拥有组件。