执行System
unity会自己实例化system,system里的方法默认都在主线程执行,可以通过一下几种方式来实现多线程
- Entities.ForEach
- Job.WithCode
- IJobEntity
- IJobEntityBatch
- C# Job System
各部分的创建
下面是一个简单的例子,创建一个CustomSystem,它会在每一帧中更新CustomData的值。ComponentData不一定要和MonoBehaviour一起使用,它可以单独使用,像一些CPU密集性的计算可以使用ComponentData来实现。下面的示例重点是为了说明各部分的创建过程,从LaunchECS中可以发现仅仅使用了World中的EntityManager来创建了一个Entity,系统的创建被注视掉了。这是因为unity会自己实例化system,所以我们不需要手动创建system。
public class Custom : MonoBehaviour
{
private void Awake()
{
LaunchECS();
}
private void LaunchECS()
{
var world = World.DefaultGameObjectInjectionWorld;
world.EntityManager.CreateEntity(typeof(CustomData));
// world.CreateSystem<CustomSystem>();
}
}
public struct CustomData : IComponentData
{
public int Value;
}
public partial class CustomSystem : SystemBase
{
[BurstCompile]
protected override void OnUpdate()
{
var timeElapsedTime = World.Time.ElapsedTime;
Entities.ForEach((ref CustomData customData) =>
{
customData.Value = (int)(100 * math.sin(timeElapsedTime));
}).ScheduleParallel();
}
}
游戏制作
ECS的大致情况我们已经了解了,那如何在项目中应用呢。下面是一个简单的例子,我们创建一个Cube,然后通过ECS来控制它的移动。
- 将下面的代码放到名叫MoveMono的cs文件中,
- 然后在场景中添加一个sub scene
- 在sub scene中添加一个Cube,然后添加一个MoveMono组件,并设置Velocity的值。
运行后,我们会发现Cube会按照我们设置的Velocity的值进行移动。
[GenerateAuthoringComponent]
public struct MoveData : IComponentData
{
public float3 Velocity;
}
public partial class MoveSystem : SystemBase
{
[BurstCompile]
protected override void OnUpdate()
{
var deltaTime = World.Time.DeltaTime;
Entities.ForEach((ref Translation translation, in MoveData moveData) =>
{
translation.Value += moveData.Velocity * deltaTime;
}).ScheduleParallel();
}
}
上面代码中使用了GenerateAuthoringComponent,这个属性将会自动生成一个名为MoveMono的MonoBehaviour,所有虽然我们并没有显示的创建MoveMono,但是我们可以给GameObject添加组件是可以看到MoveMono.
除了GenerateAuthoringComponent属性以外还有其他方式去将ComponentData和MonoBehaviour关联起来,还可以有其他方式。我们将在后面的gameplay文章中介绍。
原文地址:https://blog.csdn.net/scdnshijiemengxiang/article/details/136010213
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_67273.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!