private void Execute(int index, Translation translation, FoodHierarchie hierarchie, ref Condition condition, ref Walker walker) { if (condition.hunger < hungerLimit) { condition.isSet = false; return; } var found = false; var foundPrey = new FoodHierarchieHashMap.MyData(); ForeachAround(translation.Value, condition, walker.direction, hierarchie, ref foundPrey, ref found); if (found) { var foundFood = new EdibleHashMap.MyData { position = foundPrey.position, data = new Edible() { nutrition = foundPrey.data.nutrition, }, entity = foundPrey.entity }; FoundFood(translation, foundFood, index, ref walker, ref condition); } else { condition.isSet = false; } }
private void FoundFood(Translation translation, EdibleHashMap.MyData foundFood, int index, ref Walker walker, ref Condition condition) { if (IsInRadius(translation.Value, condition.eatingRadius, condition.viewAngle, walker.direction, foundFood.position)) { commandBuffer.DestroyEntity(index, foundFood.entity); condition.hunger -= foundFood.data.nutrition; if (condition.hunger < 0) { condition.hunger = 0; } condition.isSet = false; return; } else { condition.goal = foundFood.position; condition.isSet = true; } }
private void Foreach(int key, float3 me, Condition condition, float3 direction, ref EdibleHashMap.MyData foundFood, ref bool found) { if (targetMap.TryGetFirstValue(key, out EdibleHashMap.MyData food, out NativeMultiHashMapIterator <int> iterator)) { do { bool inRadius = IsInRadius(me, condition.viewRadius, condition.viewAngle, direction, food.position); if (!inRadius) { continue; } if (!found) { foundFood = food; found = true; } else { var prev = math.lengthsq(foundFood.position - me); var next = math.lengthsq(food.position - me); if (next < prev) { foundFood = food; } } } while (targetMap.TryGetNextValue(out food, ref iterator)); } }
private void ForeachAround(float3 position, Condition condition, float3 direction, ref EdibleHashMap.MyData foundFood, ref bool found) { var key = QuadrantVariables.GetPositionHashMapKey(position); Foreach(key, position, condition, direction, ref foundFood, ref found); key = QuadrantVariables.GetPositionHashMapKey(position, new float3(1, 0, 0)); Foreach(key, position, condition, direction, ref foundFood, ref found); key = QuadrantVariables.GetPositionHashMapKey(position, new float3(-1, 0, 0)); Foreach(key, position, condition, direction, ref foundFood, ref found); key = QuadrantVariables.GetPositionHashMapKey(position, new float3(0, 0, 1)); Foreach(key, position, condition, direction, ref foundFood, ref found); key = QuadrantVariables.GetPositionHashMapKey(position, new float3(0, 0, -1)); Foreach(key, position, condition, direction, ref foundFood, ref found); }