public void Execute(ArchetypeChunk chunk, int chunkIndex, int firstEntityIndex) { var Velocities = chunk.GetNativeArray(VelocityType); var Entities = chunk.GetNativeArray(EntityType); var Sizes = chunk.GetNativeArray(SizeType); var Timers = chunk.GetNativeArray(TimerType); for (int i = 0; i < chunk.Count; ++i) { var originalVel = Velocities[i].Value; var newVel = new C_Velocity() { Value = Velocities[i].Value }; newVel.Value = PortionOfOriginalVelocity * originalVel + Rand.NextFloat3Direction() * Spread; Velocities[i] = newVel; var timer = new C_DeathTimer() { TimeRemaining = Rand.NextFloat(LifeSpanRange.x, LifeSpanRange.y) }; Timers[i] = timer; var size = new C_Size() { Value = Rand.NextFloat(SizeRange.x, SizeRange.y) }; Sizes[i] = size; ecb.RemoveComponent(chunkIndex, Entities[i], typeof(Tag_Particle_Init)); } }
public void Execute(ArchetypeChunk chunk, int chunkIndex, int firstEntityIndex) { var Velocities = chunk.GetNativeArray(VelocityType); var Translations = chunk.GetNativeArray(TranslationType); var Targets = chunk.GetNativeArray(TargetType); var Entities = chunk.GetNativeArray(EntityType); for (int i = 0; i < chunk.Count; ++i) { var Target = Targets[i]; if (DyingType.Exists(Target.Value))//This code reads: "If Target is dead, stop following it" { ecb.RemoveComponent(chunkIndex, Entities[i], typeof(C_Target)); continue; } var translation = Translations[i]; var velocity = Velocities[i]; float3 targetPos = TranslationData[Target.Value].Value; float3 delta = targetPos - translation.Value; float distanceSquared = delta.x * delta.x + delta.y * delta.y + delta.z * delta.z; if (distanceSquared < HitDistance * HitDistance) { C_DeathTimer timer = new C_DeathTimer() { TimeRemaining = BeeTimeToDeath }; Tag_IsDying tag; ecb.AddComponent(chunkIndex, Target.Value, tag); ecb.SetComponent(chunkIndex, Target.Value, timer); ecb.RemoveComponent(chunkIndex, Entities[i], typeof(C_Target)); //Spawn particles; var bloodVel = new C_Velocity() { Value = velocity.Value * .35f }; for (int particle = 0; particle < 6; ++particle) { var blood = ecb.Instantiate(chunkIndex, BloodPrefab); ecb.SetComponent(chunkIndex, blood, translation); ecb.SetComponent(chunkIndex, blood, bloodVel); } continue; } float force = max(1.0, distanceSquared) < AttackDistance * AttackDistance ? AttackForce : ChaseForce; velocity.Value += delta * (force * dt / sqrt(distanceSquared)); Velocities[i] = velocity; } }