天天看點

淺嘗Unity ECS的筆記 2020 System and Component(三)

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上之後,運作遊戲可以看到:

淺嘗Unity ECS的筆記 2020 System and Component(三)

這樣我們就把自定義的Component添加到Entity上啦~

接下來我們來做一個System

  • 它可以讓場景裡的Entity在Z軸上前後移動
  • 使用sin的公式
    淺嘗Unity ECS的筆記 2020 System and Component(三)
  • 建立兩個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);
        });
    }
}
           

最終結果!!!

淺嘗Unity ECS的筆記 2020 System and Component(三)