mirror of
https://github.com/hanzoai/ProjectTinySamples.git
synced 2026-09-24 00:01:34 +00:00
73 lines
3.2 KiB
C#
73 lines
3.2 KiB
C#
using Unity.Entities;
|
|
using Unity.Transforms;
|
|
using Unity.Mathematics;
|
|
using Unity.Tiny;
|
|
|
|
namespace Unity.TinyGems
|
|
{
|
|
public class SparkleSystem : SystemBase
|
|
{
|
|
private const float k_SparkleDuration = 0.7f;
|
|
private const float k_DelayMin = 3f;
|
|
private const float k_DelayMax = 7f;
|
|
|
|
private uint m_LastSeed = 1234;
|
|
|
|
protected override void OnUpdate()
|
|
{
|
|
var ecbSystem = World.GetOrCreateSystem<EndSimulationEntityCommandBufferSystem>();
|
|
var cmdBuffer = ecbSystem.CreateCommandBuffer().AsParallelWriter();
|
|
|
|
var random = new Random(m_LastSeed);
|
|
m_LastSeed = random.NextUInt();
|
|
|
|
var currentTime = Time.ElapsedTime;
|
|
Dependency = Entities
|
|
.ForEach((
|
|
Entity entity,
|
|
int entityInQueryIndex,
|
|
ref SpriteRenderer spriteRenderer,
|
|
ref NonUniformScale nonUniformScale,
|
|
ref SparkleObject sparkleObject,
|
|
ref Rotation rotation) =>
|
|
{
|
|
if (sparkleObject.StartTime == 0f)
|
|
{
|
|
sparkleObject.StartTime = random.NextFloat(0.5f, 3.5f);
|
|
sparkleObject.Delay = random.NextFloat(k_DelayMin, k_DelayMax);
|
|
cmdBuffer.SetComponent(entityInQueryIndex, entity, sparkleObject);
|
|
}
|
|
else if ((currentTime - sparkleObject.StartTime) < k_SparkleDuration)
|
|
{
|
|
var time = currentTime - sparkleObject.StartTime;
|
|
var currentValue = math.sin(time * (2.0f * math.PI) * k_SparkleDuration);
|
|
|
|
nonUniformScale.Value = (float)currentValue;
|
|
cmdBuffer.SetComponent(entityInQueryIndex, entity, nonUniformScale);
|
|
|
|
spriteRenderer.Color.w = (float)currentValue;
|
|
cmdBuffer.SetComponent(entityInQueryIndex, entity, spriteRenderer);
|
|
|
|
sparkleObject.Delay = random.NextFloat(k_DelayMin, k_DelayMax);
|
|
cmdBuffer.SetComponent(entityInQueryIndex, entity, sparkleObject);
|
|
}
|
|
else if ((currentTime - (sparkleObject.StartTime) + k_SparkleDuration) > sparkleObject.Delay)
|
|
{
|
|
nonUniformScale.Value = 0f;
|
|
cmdBuffer.SetComponent(entityInQueryIndex, entity, nonUniformScale);
|
|
|
|
spriteRenderer.Color.w = 0f;
|
|
cmdBuffer.SetComponent(entityInQueryIndex, entity, spriteRenderer);
|
|
|
|
rotation.Value = quaternion.RotateZ(random.NextFloat(0f, 180f));
|
|
cmdBuffer.SetComponent(entityInQueryIndex, entity, rotation);
|
|
|
|
sparkleObject.StartTime = (float)currentTime;
|
|
cmdBuffer.SetComponent(entityInQueryIndex, entity, sparkleObject);
|
|
}
|
|
}).Schedule(Dependency);
|
|
|
|
ecbSystem.AddJobHandleForProducer(Dependency);
|
|
}
|
|
}
|
|
} |