Component可以保存到的fields包括:
- blittable types (type, float, double, int)
- bool
- char
- NativeString, BlobAssetReferences, fixedarray, other structs
- 没有引用!
Component的创建:
-
必须是struct
-
继承IComponentData
using Unity.Entities;
// 添加这句话你就可以把这个script添加到GameObject上
[GenerateAuthoringComponent]
public struct MoveSpeedData : IComponentData
{
public float Value;
}
添加到之前有EntityConverter的GameObject上之后,运行游戏可以看到:
这样我们就把自定义的Component添加到Entity上啦~
接下来我们来做一个System
-
它可以让场景里的Entity在Z轴上前后移动
-
使用sin的公式
-
新建两个Data Component:WaveData,MoveSpeedData
using Unity.Entities;
// 添加这句话你就可以把这个script添加到GameObject上
[GenerateAuthoringComponent]
public struct WaveData : IComponentData
{
public float amplitude, xOffset, yOffset;
}
using Unity.Entities;
// 添加这句话你就可以把这个script添加到GameObject上
[GenerateAuthoringComponent]
public struct MoveSpeedData : IComponentData
{
public float Value;
}
using Unity.Entities;
using Unity.Transforms;
using Unity.Mathematics;
// 这个方法很老了,只会用一个threat (main threat),之后可以使用JOB或者BaseSystem
public class WaveSystem : ComponentSystem
{
// 类似Update();
protected override void OnUpdate()
{
Entities.ForEach((ref Translation trans, ref MoveSpeedData moveSpeed, ref WaveData waveData) =>
{
// 改变Z的位置
float zPosition = waveData.amplitude *
math.sin(
(float)/*由于是个double,需要cast成float*/Time.ElapsedTime *
moveSpeed.Value +
trans.Value.x * waveData.xOffset +
trans.Value.y * waveData.yOffset
);
trans.Value = new float3(trans.Value.x, trans.Value.y, zPosition);
});
}
}
最终结果!!!