コード例 #1
0
        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));
            }
        }
コード例 #2
0
        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;
            }
        }