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; }
public void Execute(ref PositionComponent position, ref SpeedComponent speed) { //position.Position.y=30; position.Position.x = CarBufferElement.LoopPosition(position.Position.x + speed.CurrentSpeed * DeltaTime); }
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); }