Untitled
unknown
plain_text
9 months ago
3.8 kB
3
Indexable
[BurstCompile]
[WithPresent(typeof(AnimalStateEatFood))]
[WithDisabled(typeof(OnStateExit), typeof(OnStateEnter))]
partial struct FindFoodJob : IJobEntity
{
[ReadOnly] public NativeArray<LocalTransform> foodTransforms;
[ReadOnly] public NativeArray<Entity> foodEntities;
[NativeDisableParallelForRestriction]
public NativeArray<Food> foodComponents;
[NativeDisableContainerSafetyRestriction]
public NativeList<int> foodTakenList;
[NativeDisableContainerSafetyRestriction]
public NativeArray<Unity.Mathematics.Random> randoms;
[NativeSetThreadIndex] private int _threadId;
[ReadOnly] public NavMeshQuery query;
public float deltaTime;
void Execute(Entity entity, ref LocalTransform transform, in Sensor sensor, ref AnimalStateFindFood findFood, ref NavAgentComponent agent
, ref AnimalStateEatFood stateEatFood, in AnimalStateTypes states, ref OnStateExit stateExit, EnabledRefRW<OnStateExit> stateExitEnabled
, [EntityIndexInQuery] int entityIndex)
{
if (findFood.FoodTarget == Entity.Null)
{
findFood.searchTime += deltaTime;
int closestIndex = -1;
float closestDistance = Mathf.Infinity;
for (int i = 0; i < foodComponents.Length; i++)
{
Entity foodEntity = foodEntities[i];
float dst = math.distancesq(transform.Position, foodTransforms[i].Position);
if (dst <= sensor.detectionDistance && dst < closestDistance && foodComponents[i].targetedBy == Entity.Null)
{
closestDistance = dst;
closestIndex = i;
}
}
if (closestIndex >= 0)
{
var exchangeResult = Interlocked.CompareExchange(ref foodTakenList.ElementAt(closestIndex), entityIndex, 0);
if (exchangeResult == entityIndex)
{
Food food = foodComponents[closestIndex];
Entity closest = foodEntities[closestIndex];
findFood.searchTime = 0;
agent.targetEntity = closest;
findFood.FoodTarget = closest;
food.targetedBy = entity;
foodComponents[closestIndex] = food;
}
}
else if (!agent.useTargetPosition)
{
float3 extents = new float3(0.5f, 1, 0.5f);
var rnd = randoms[_threadId];
float3 rndOffset = rnd.NextFloat3(new float3(-5, 0, -5), new float3(5, 0, 5));
randoms[_threadId] = rnd;
float3 dst = transform.Position + rndOffset;
NavMeshLocation fromLocation = query.MapLocation(dst, extents, 0);
NavMeshHit hit;
var res = query.Raycast(out hit, fromLocation, dst - new float3(0, 100, 0));
if (res == PathQueryStatus.Success)
{
agent.useTargetPosition = true;
agent.targetPosition = dst;
}
}
}
else
{
if (agent.targetEntity == Entity.Null)
{
stateEatFood.FoodTarget = findFood.FoodTarget;
findFood.FoodTarget = Entity.Null;
TransitionStateExitSystem.SwitchState(ref stateExit, ref stateExitEnabled, in states.eatFood);
}
}
}
}
}Editor is loading...
Leave a Comment