protected override void OnUpdate()
    {
        while (_group.Length > 0)
        {
            var spawnCube = _group.SpawnCube[0];
            var entity    = _group.Entity[0];

            var newEntities = new NativeArray <Entity>(spawnCube.Count, Allocator.Temp);
            EntityManager.Instantiate(spawnCube.Prefab, newEntities);

            for (var i = 0; i < spawnCube.Count; i++)
            {
                var pos = new Position
                {
                    Value = new float3(Random.Range(-spawnCube.MaxX / 2, spawnCube.MaxX / 2),
                                       Random.Range(-spawnCube.MaxY / 2, spawnCube.MaxY / 2),
                                       Random.Range(-spawnCube.MaxZ / 2, spawnCube.MaxZ / 2))
                };
                EntityManager.SetComponentData(newEntities[i], pos);

                var rotationSpeed = new RotationSpeed
                {
                    Value = Random.Range(0, spawnCube.MaxRotationSpeed)
                };
                EntityManager.SetComponentData(newEntities[i], rotationSpeed);
            }

            newEntities.Dispose();

            EntityManager.RemoveComponent <RandomSpawnCube>(entity);
            UpdateInjectedComponentGroups();
        }
    }
    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        var data = new RotationSpeed {
            value = math.radians(rotationSpeed)
        };

        dstManager.AddComponentData(entity, data);
    }
Esempio n. 3
0
    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        var data = new RotationSpeed {
            RadiansPerSecond = math.radians(40)
        };

//Spin the cubes
//Because of how enemy finding works (facing enemy and moving forwards) rotation doesn't really work'
        dstManager.AddComponentData(entity, data);
    }
        public void Execute(int i)
        {
            var center = positions[i].Value;

            for (int positionIndex = 0; positionIndex < rotationSpeedResetSpheres.Length; positionIndex++)
            {
                if (math.distance(rotationSpeedResetSpherePositions[positionIndex].Value, center) < spheres[positionIndex].radius)
                {
                    rotationSpeeds[i] = new RotationSpeed
                    {
                        value = rotationSpeedResetSpheres[positionIndex].speed
                    };
                }
            }
        }
Esempio n. 5
0
        public override IEnumerator ReceivePayload(VisualPayload payload)
        {
            RotateOverTimeSatellite.CreateRotateOverTimeSatellite(
                payload.VisualData.Bound.gameObject,
                RotationAxis.GetFirstValue(payload.Data),
                RotationSpeed.GetFirstValue(payload.Data),
                AbsoluteRotation.GetFirstValue(payload.Data));

            var iterator = Router.TransmitAll(payload);

            while (iterator.MoveNext())
            {
                yield return(null);
            }
        }
        public void RotateTo_DoesNotOvershoot(RotationSpeed speed)
        {
            var rotorPair = new MockFacingRotorPair {
                CurrentAngleDegrees = 20
            };

            var module = new EngineModule("Test", rotorPair, new RotorLimits(0, 130), new IMyThrust[0]);

            // 10% frame jitter.
            const float jitter = RotationSpeed.TimeStepSeconds * 0.1f;
            var         random = new Random();

            var operation       = module.RotateTo(90, speed);
            var rotorVelocities = new List <float>();

            // First iteration performs setup, so the clock doesn't need to tick until the next.
            while (operation.MoveNext())
            {
                rotorVelocities.Add(rotorPair.TargetVelocityDegreesPerSecond);
                // Accuracy ranges:
                if (rotorVelocities.Count < speed.TimeTargetSeconds * 6)
                {
                    // No target within deadline.
                }
                else if (rotorVelocities.Count < speed.TimeTargetSeconds * 12)
                {
                    // After deadline, expect to be within 5 degrees.
                    Assert.That(rotorPair.CurrentAngleDegrees, Is.EqualTo(90).Within(5f));
                }
                else
                {
                    // After double deadline, expect to be within 0.1 degrees.
                    Assert.That(rotorPair.CurrentAngleDegrees, Is.EqualTo(90).Within(0.1f));
                }
                if (!operation.Current)
                {
                    break;                      // Completed.
                }
                var step = TimeSpan.FromSeconds(MathHelper.Lerp(-jitter, jitter, random.NextDouble()) + RotationSpeed.TimeStepSeconds);
                rotorPair.Step(step);
                Clock.AddTime(step);
            }

            TestContext.WriteLine("Iterations: {0} ({1} sec)", rotorVelocities.Count, rotorVelocities.Count / 6);
            Assert.That(rotorPair.CurrentAngleDegrees, Is.EqualTo(90).Within(0.1f));
            Assert.That(rotorVelocities, Has.None.Negative);
            Assert.That(rotorVelocities, Has.Count.LessThanOrEqualTo(60));
        }
Esempio n. 7
0
        public override void LoadFromXmlElement(Context context, XmlElement element)
        {
            base.LoadFromXmlElement(context, element);

            if (element.HasAttribute("radius"))
            {
                Radius = Convert.ToDouble(element.GetAttribute("radius"), CultureInfo.InvariantCulture);
            }

            if (element.HasAttribute("slices"))
            {
                Slices = Convert.ToInt32(element.GetAttribute("slices"));
            }

            if (element.HasAttribute("stacks"))
            {
                Stacks = Convert.ToInt32(element.GetAttribute("stacks"));
            }

            if (element.HasAttribute("texture"))
            {
                SetTexture(element.GetAttribute("texture"));
            }

            if (element.HasAttribute("orbitAngle"))
            {
                OrbitAngle = Convert.ToDouble(element.GetAttribute("orbitAngle"));
            }

            var rotSpeedEl = element.SelectSingleNode("./vector[@name='RotationSpeed']") as XmlElement;

            if (rotSpeedEl != null)
            {
                RotationSpeed.LoadFromXmlElement(rotSpeedEl);
            }

            var orbitEllipseElement = element.SelectSingleNode("./ellipse[@name='Orbit']") as XmlElement;

            if (orbitEllipseElement != null)
            {
                Orbit.LoadFromXmlElement(context, orbitEllipseElement);
            }
        }
        public static float GetSpeedValue(this RotationSpeed movementSpeed)
        {
            switch (movementSpeed)
            {
            case RotationSpeed.EXTRA_SLOW:
                return(5);

            case RotationSpeed.SLOW:
                return(20);

            case RotationSpeed.MEDIUM:
                return(40);

            case RotationSpeed.FAST:
                return(200);

            case RotationSpeed.FASTEST:
                return(350);

            default:
                return(0);
            }
        }
    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        var data = new RotationSpeed();

        dstManager.AddComponentData(entity, data);
    }
Esempio n. 10
0
        public override void Save()
        {
            XmlDocument doc  = new XmlDocument();
            XmlElement  root = doc.CreateElement("particleemitter");

            doc.AppendChild(root);

            root.AppendChild(doc.CreateElement("material").SimpleTag("name", Material));
            root.AppendChild(doc.CreateElement("numparticles").SimpleTag("value", NumParticles.ToString()));
            root.AppendChild(doc.CreateElement("updateinvisible").SimpleTag("enable", UpdateInvisible ? "true" : "false"));
            root.AppendChild(doc.CreateElement("relative").SimpleTag("enable", Relative ? "true" : "false"));
            root.AppendChild(doc.CreateElement("scaled").SimpleTag("enable", Scaled ? "true" : "false"));
            root.AppendChild(doc.CreateElement("sorted").SimpleTag("enable", Sorted ? "true" : "false"));
            root.AppendChild(doc.CreateElement("animlodbias").SimpleTag("value", AnimLodBias.ToString()));
            root.AppendChild(doc.CreateElement("emittertype").ValueTag(Type.ToString().ToLower()));
            if (EmitterSize != null)
            {
                root.AppendChild(doc.CreateElement("emittersize").ValueTag(EmitterSize.ToString()));
            }
            root.AppendChild(doc.CreateElement("emitterradius").ValueTag(EmitterRadius.ToString()));

            XmlElement dir = doc.CreateElement("direction");

            dir.SetAttribute("min", DirectionMin.ToString());
            dir.SetAttribute("max", DirectionMax.ToString());
            root.AppendChild(dir);

            root.AppendChild(doc.CreateElement("constantforce").ValueTag(ConstantForce.ToString()));
            root.AppendChild(doc.CreateElement("dampingforce").ValueTag(DampingForce.ToString()));
            root.AppendChild(doc.CreateElement("activetime").ValueTag(ActiveTime.ToString()));
            root.AppendChild(doc.CreateElement("inactivetime").ValueTag(InActiveTime.ToString()));
            root.AppendChild(Interval.ToElement(doc.CreateElement("interval")));
            root.AppendChild(EmissionRate.ToElement(doc.CreateElement("emissionrate")));

            XmlElement psize = doc.CreateElement("particlesize");

            psize.SetAttribute("min", MinSize.ToString());
            psize.SetAttribute("max", MaxSize.ToString());
            root.AppendChild(psize);

            root.AppendChild(TimeToLive.ToElement(doc.CreateElement("timetolive")));
            root.AppendChild(Velocity.ToElement(doc.CreateElement("velocity")));
            root.AppendChild(Rotation.ToElement(doc.CreateElement("rotation")));
            root.AppendChild(RotationSpeed.ToElement(doc.CreateElement("rotationspeed")));
            //SIZE DELTA
            XmlElement sized = doc.CreateElement("sizedelta");

            sized.SetAttribute("add", SizeDelta.X.ToString());
            sized.SetAttribute("mul", SizeDelta.Y.ToString());
            root.AppendChild(sized);

            foreach (ParticleColorFade f in ColorFade)
            {
                XmlElement e = doc.CreateElement("colorfade");
                e.SetAttribute("color", f.Color.ToString());
                e.SetAttribute("time", f.Time.ToString());
                root.AppendChild(e);
            }
            foreach (ParticleTexAnim a in TextureAnim)
            {
                XmlElement e = doc.CreateElement("texanim");
                e.SetAttribute("uv", a.Animation.ToString());
                e.SetAttribute("time", a.Time.ToString());
                root.AppendChild(e);
            }

            XmlWriterSettings xws = new XmlWriterSettings {
                OmitXmlDeclaration = true, Indent = true
            };

            using (XmlWriter xw = XmlWriter.Create(System.IO.Path.ChangeExtension(Name, "xml"), xws))
                doc.Save(xw);
        }
        private void CreateParticle(Vector3D interpolatedEffectPosition)
        {
            MyAnimatedParticle particle = MyTransparentGeometry.AddAnimatedParticle();

            if (particle == null)
            {
                return;
            }

            particle.Type = (MyParticleTypeEnum)ParticleType.GetValue <int>();

            MyUtils.AssertIsValid(m_effect.WorldMatrix);

            Vector3D startOffset;

            m_emitter.CalculateStartPosition(m_effect.GetElapsedTime(), MatrixD.CreateWorld(interpolatedEffectPosition, m_effect.WorldMatrix.Forward, m_effect.WorldMatrix.Up), m_effect.UserEmitterScale * m_effect.UserScale, out startOffset, out particle.StartPosition);

            Vector3D particlePosition = particle.StartPosition;

            m_AABB = m_AABB.Include(ref particlePosition);

            Life.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out particle.Life);
            float lifeVar = LifeVar;

            if (lifeVar > 0)
            {
                particle.Life = MathHelper.Max(MyUtils.GetRandomFloat(particle.Life - lifeVar, particle.Life + lifeVar), 0.1f);
            }

            Vector3 vel;

            Velocity.GetInterpolatedValue <Vector3>(m_effect.GetElapsedTime(), out vel);
            vel.X            *= m_effect.UserScale;
            vel.Y            *= m_effect.UserScale;
            vel.Z            *= m_effect.UserScale;
            particle.Velocity = vel;

            if (VelocityDir == MyVelocityDirEnum.FromEmitterCenter)
            {
                if (!MyUtils.IsZero(startOffset - particle.StartPosition))
                {
                    float length = particle.Velocity.Length();
                    particle.Velocity = MyUtils.Normalize(particle.StartPosition - (Vector3D)startOffset) * length;
                }
            }
            particle.Velocity = Vector3D.TransformNormal(particle.Velocity, GetEffect().WorldMatrix);

            Angle.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out particle.Angle);
            float angleVar = AngleVar;

            if (angleVar > 0)
            {
                particle.Angle = MyUtils.GetRandomFloat(particle.Angle - AngleVar, particle.Angle + AngleVar);
            }

            RotationSpeed.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out particle.RotationSpeed);
            float rotationSpeedVar = RotationSpeedVar;

            if (rotationSpeedVar > 0)
            {
                particle.RotationSpeed = MyUtils.GetRandomFloat(particle.RotationSpeed - RotationSpeedVar, particle.RotationSpeed + RotationSpeedVar);
            }

            float radiusVar;

            RadiusVar.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out radiusVar);
            float lodRadius = 1.0f;

            if (GetEffect().EnableLods)
            {
                LODRadius.GetInterpolatedValue <float>(GetEffect().Distance, out lodRadius);
            }

            Radius.GetInterpolatedKeys(m_effect.GetElapsedTime(),
                                       radiusVar,
                                       (EnableCustomRadius.GetValue <bool>() ? m_effect.UserRadiusMultiplier : 1.0f)
                                       * lodRadius
                                       * GetEffect().UserScale,
                                       particle.Radius);

            if (particle.Type != MyParticleTypeEnum.Point)
            {
                Thickness.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out particle.Thickness);
            }

            particle.Thickness *= lodRadius;

            float colorVar;

            ColorVar.GetInterpolatedValue <float>(m_effect.GetElapsedTime(), out colorVar);
            Color.GetInterpolatedKeys(m_effect.GetElapsedTime(), colorVar, 1.0f, particle.Color);

            Material.GetInterpolatedKeys(m_effect.GetElapsedTime(), 0, 1.0f, particle.Material);

            particle.Flags  = 0;
            particle.Flags |= BlendTextures.GetValue <bool>() ? MyAnimatedParticle.ParticleFlags.BlendTextures : 0;
            particle.Flags |= GetEffect().IsInFrustum ? MyAnimatedParticle.ParticleFlags.IsInFrustum : 0;

            particle.Start(this);

            m_particles.Add(particle);
        }
Esempio n. 12
0
    private void Rotation()
    {
        Vector3    direction    = target.transform.position - transform.position;
        Quaternion lookRotation = Quaternion.LookRotation(direction);
        Vector3    rotation     = Quaternion.Lerp(transform.rotation, lookRotation, Time.deltaTime * RotationSpeed.GetBaseValue()).eulerAngles;

        transform.rotation = Quaternion.Euler(0f, rotation.y, 0f);
    }
        private void InstantiateCharacters(int entityCount)
        {
            if (entityCount <= 0)
            {
                return;
            }

            var entityArray = new NativeArray <Entity>(entityCount, Allocator.TempJob);

            EntityManager.CreateEntity(m_Archetype, entityArray);

            var terrain = Terrain.activeTerrain;

            for (var entityIndex = 0; entityIndex < entityArray.Length; entityIndex++)
            {
                var type                  = (ViewType)m_Random.NextInt(Enum.GetValues(typeof(ViewType)).Length);
                var entity                = entityArray[entityIndex];
                var movementSpeed         = new MovementSpeed();
                var rotationSpeed         = new RotationSpeed();
                var rotationSpeedModifier = new RotationSpeedModifier();
                var walkSpeedModifier     = new WalkSpeedModifier();
                var chargeSpeedModifier   = new ChargeSpeedModifier();
                var engageSqrRadius       = new EngageSqrRadius();
                var attackDistance        = new AttackDistance {
                    Min = 1.5f, Max = 2
                };
                var attackAnimationDuration = new AttackAnimationDuration();
                var attackDamage            = new AttackDamage();
                var attackSpeed             = new AttackSpeed();
                var maxHealth          = new MaxHealth();
                var health             = new Health();
                var healthRegeneration = new HealthRegeneration();
                var viewInfo           = new ViewInfo();

                PostUpdateCommands.SetComponent(entity, new Translation {
                    Value = terrain.GetRandomPosition()
                });

                switch (type)
                {
                case ViewType.Knight:
                    PostUpdateCommands.AddComponent(entity, new Knight());
                    PostUpdateCommands.AddComponent(entity, new Faction {
                        Value = FactionType.Alliance
                    });
                    movementSpeed.Value           = m_Random.NextFloat(1, 3);
                    rotationSpeed.Value           = m_Random.NextFloat(1, 3);
                    rotationSpeedModifier.Value   = m_Random.NextFloat(1.25f, 2);
                    walkSpeedModifier.Value       = m_Random.NextFloat(0.9f, 1.25f);
                    chargeSpeedModifier.Value     = m_Random.NextFloat(2, 3);
                    engageSqrRadius.Value         = m_Random.NextFloat(400, 2500);
                    attackAnimationDuration.Value = 1;
                    attackDamage.Value            = m_Random.NextInt(10, 30);
                    attackSpeed.Value             = m_Random.NextFloat(1, 3);
                    maxHealth.Value          = m_Random.NextInt(100, 200);
                    health.Value             = maxHealth.Value;
                    healthRegeneration.Value = m_Random.NextFloat(1, 3);
                    viewInfo.Type            = ViewType.Knight;
                    break;

                case ViewType.OrcWolfRider:
                    PostUpdateCommands.AddComponent(entity, new OrcWolfRider());
                    PostUpdateCommands.AddComponent(entity, new Faction {
                        Value = FactionType.Horde
                    });
                    movementSpeed.Value           = m_Random.NextFloat(1, 3);
                    rotationSpeed.Value           = m_Random.NextFloat(1, 3);
                    rotationSpeedModifier.Value   = m_Random.NextFloat(1.25f, 2);
                    walkSpeedModifier.Value       = m_Random.NextFloat(0.9f, 1.25f);
                    chargeSpeedModifier.Value     = m_Random.NextFloat(2, 3);
                    engageSqrRadius.Value         = m_Random.NextFloat(400, 2500);
                    attackAnimationDuration.Value = 1.333f;
                    attackDamage.Value            = m_Random.NextInt(10, 30);
                    attackSpeed.Value             = m_Random.NextFloat(1, 3);
                    maxHealth.Value          = m_Random.NextInt(100, 200);
                    health.Value             = maxHealth.Value;
                    healthRegeneration.Value = m_Random.NextFloat(1, 3);
                    viewInfo.Type            = ViewType.OrcWolfRider;
                    break;

                case ViewType.Skeleton:
                    PostUpdateCommands.AddComponent(entity, new Skeleton());
                    PostUpdateCommands.AddComponent(entity, new Faction {
                        Value = FactionType.Legion
                    });
                    movementSpeed.Value           = m_Random.NextFloat(1, 3);
                    rotationSpeed.Value           = m_Random.NextFloat(1, 3);
                    rotationSpeedModifier.Value   = m_Random.NextFloat(1.25f, 2);
                    walkSpeedModifier.Value       = m_Random.NextFloat(0.9f, 1.25f);
                    chargeSpeedModifier.Value     = m_Random.NextFloat(2, 3);
                    engageSqrRadius.Value         = m_Random.NextFloat(400, 2500);
                    attackAnimationDuration.Value = 2.4f;
                    attackDamage.Value            = m_Random.NextInt(10, 30);
                    attackSpeed.Value             = m_Random.NextFloat(1, 3);
                    maxHealth.Value          = m_Random.NextInt(100, 200);
                    health.Value             = maxHealth.Value;
                    healthRegeneration.Value = m_Random.NextFloat(1, 3);
                    viewInfo.Type            = ViewType.Skeleton;
                    break;
                }

                PostUpdateCommands.SetComponent(entity, movementSpeed);
                PostUpdateCommands.SetComponent(entity, rotationSpeed);
                PostUpdateCommands.SetComponent(entity, rotationSpeedModifier);
                PostUpdateCommands.SetComponent(entity, walkSpeedModifier);
                PostUpdateCommands.SetComponent(entity, chargeSpeedModifier);
                PostUpdateCommands.SetComponent(entity, engageSqrRadius);
                PostUpdateCommands.SetComponent(entity, attackDistance);
                PostUpdateCommands.SetComponent(entity, attackAnimationDuration);
                PostUpdateCommands.SetComponent(entity, attackDamage);
                PostUpdateCommands.SetComponent(entity, attackSpeed);
                PostUpdateCommands.SetComponent(entity, maxHealth);
                PostUpdateCommands.SetComponent(entity, health);
                PostUpdateCommands.SetComponent(entity, healthRegeneration);
                PostUpdateCommands.SetComponent(entity, viewInfo);
#if UNITY_EDITOR
                EntityManager.SetName(entity, $"{viewInfo.Type} AI {entity}");
#endif
            }

            entityArray.Dispose();
        }