Пример #1
0
        public void Execute(ref OvertakerComponent overtaker, [ReadOnly] ref CarElementPositionComponent carElementPosition)
        {
            //TODO: Improve this

            var carIndex   = carElementPosition.Value;
            var carElement = CarElements[carIndex];

            // Car in front
            var speed    = CarBufferElement._2PI;
            var distance = CarBufferElement._2PI;

            for (int i = 1; i < CarElements.Length; i++)
            {
                var nextCar = CarElements[(carIndex + i) % CarElements.Length];
                if (nextCar.Lane == carElement.Lane)
                {
                    distance = CarBufferElement.Distance(carElement, nextCar);
                    speed    = nextCar.Speed;
                    break;
                }
            }
            overtaker.DistanceToCarInFront = distance;
            overtaker.CarInFrontSpeed      = speed;

            // Car in right
            speed    = CarBufferElement._2PI;
            distance = CarBufferElement._2PI;
            var prevDistance = CarBufferElement._2PI;

            if (carElement.Lane > 0)
            {
                for (int i = 1; i < CarElements.Length; i++)
                {
                    var nextCar = CarElements[(carIndex + i) % CarElements.Length];
                    var prevCar = CarElements[(CarElements.Length + carIndex - i) % CarElements.Length];
                    if (prevCar.Lane == carElement.Lane - 1 && prevDistance >= CarBufferElement._2PI)
                    {
                        prevDistance = CarBufferElement.Distance(prevCar, carElement);
                    }
                    if (nextCar.Lane == carElement.Lane - 1)
                    {
                        distance = CarBufferElement.Distance(carElement, nextCar);
                        speed    = nextCar.Speed;
                        break;
                    }
                }
            }

            overtaker.DistanceToCarInRight     = distance;
            overtaker.DistanceToCarInRightBack = prevDistance;
            overtaker.CarInRightSpeed          = speed;

            // Car in left
            speed        = CarBufferElement._2PI;
            distance     = CarBufferElement._2PI;
            prevDistance = CarBufferElement._2PI;
            if (carElement.Lane < 3)
            {
                for (int i = 1; i < CarElements.Length; i++)
                {
                    var nextCar = CarElements[(carIndex + i) % CarElements.Length];
                    var prevCar = CarElements[(CarElements.Length + carIndex - i) % CarElements.Length];
                    if (prevCar.Lane == carElement.Lane + 1 && prevDistance >= CarBufferElement._2PI)
                    {
                        prevDistance = CarBufferElement.Distance(prevCar, carElement);
                    }
                    if (nextCar.Lane == carElement.Lane + 1)
                    {
                        distance = CarBufferElement.Distance(carElement, nextCar);
                        speed    = nextCar.Speed;
                        break;
                    }
                }
            }

            overtaker.DistanceToCarInLeft     = distance;
            overtaker.DistanceToCarInLeftBack = prevDistance;
            overtaker.CarInLeftSpeed          = speed;
        }
Пример #2
0
 public void Execute(ref PositionComponent position, ref SpeedComponent speed)
 {
     //position.Position.y=30;
     position.Position.x = CarBufferElement.LoopPosition(position.Position.x + speed.CurrentSpeed * DeltaTime);
 }
Пример #3
0
    private void Start()
    {
        Entity prefab          = GameObjectConversionUtility.ConvertGameObjectHierarchy(carPrefab, World.Active);
        var    entityManager   = World.Active.EntityManager;
        var    carElementArray =
            new NativeArray <CarBufferElement>(carAmount, Allocator.Temp, NativeArrayOptions.UninitializedMemory);


        Unity.Mathematics.Random random = new Unity.Mathematics.Random();
        float3 position  = float3.zero;
        float  distance  = (2 * math.PI) / carAmount;
        float  minRadius = highway.Radius;
        float  radius;
        float  angle = 0;
        int    lane;

        float4 laneRadius = new float4(minRadius + landOffset, minRadius + landSize + landOffset, minRadius + (2 * landSize) + landOffset, minRadius + (3 * landSize) + landOffset);

        for (int i = 0; i < carAmount; i++)
        {
            random.InitState((uint)((System.DateTime.Now.Ticks) * (i + 1)));
            lane   = random.NextInt(0, 4);
            radius = laneRadius[lane];
            var instance = entityManager.Instantiate(prefab);
            position.x = radius * math.cos(angle);
            position.z = radius * math.sin(angle);
            entityManager.SetComponentData(instance, new Translation {
                Value = position
            });
            entityManager.AddComponentData(instance, new PositionComponent {
                Position = new float2(angle, radius)
            });
            float speed = random.NextFloat(rangeSpeed.x, rangeSpeed.y);
            entityManager.AddComponentData(instance, new SpeedComponent {
                CurrentSpeed = speed, DefaultSpeed = speed, OvertakeSpeed = speed + random.NextFloat(rangeOvertakeSpeed.x, rangeOvertakeSpeed.y), TargetSpeed = speed
            });
            entityManager.AddComponentData(instance, new CarElementPositionComponent()
            {
                Value = i
            });
            entityManager.AddComponentData(instance, new OvertakerComponent {
                DistanceToCarInFront = float.MaxValue, CarInFrontSpeed = speed, OvertakeDistance = random.NextFloat(rangeOvertakeDistance.x, rangeOvertakeDistance.y), OvertakeEargerness = random.NextFloat(rangeOvertakeEargerness.x, rangeOvertakeEargerness.y)
            });
            entityManager.AddComponentData(instance, new LaneComponent {
                Lane = lane
            });
            entityManager.AddComponentData(instance, new LaneChangeComponent {
                LastRadius = lane, IsWantToOvertake = false
            });
            entityManager.AddComponentData(instance, new ColorComponent {
                Value = 1
            });
            entityManager.AddComponentData(instance, new OvertakingComponent()
            {
                TimeLeft = 0
            });
            carElementArray[i] = new CarBufferElement()
            {
                Position      = 0,
                previousIndex = i,
                newIndex      = i

                                /*Entity = instance,
                                 * NextInLane = -1,
                                 * NextLeft = -1,
                                 * NextRight = -1,
                                 * PrevLane = -1,
                                 * PrevLeft = -1,
                                 * PrevRight = -1*/
            };

            angle += distance;
        }

        //create the race entity
        var highwayEntity = entityManager.CreateEntity(typeof(HighWayComponent), typeof(CarBufferElement));
        var raceQuery     = entityManager.CreateEntityQuery(typeof(HighWayComponent));

        raceQuery.SetSingleton(new HighWayComponent {
            LaneRadius = laneRadius
        });

        var buffer = entityManager.GetBuffer <CarBufferElement>(highwayEntity);

        buffer.AddRange(carElementArray);
    }