public void InitializeFlock_ECS(int flockManagerN, float zPos, int flockLayer) //inicializar cena/flocks { for (int i = 0; i < startingCount; i++) //para cada flock { int index = i + (flockManagerN) * startingCount; Vector2 flockPosition = UnityEngine.Random.insideUnitCircle * startingCount * agentDensity; //posicao "aleatoria" dentro do range especificado para o novo flock Quaternion flockRotation = Quaternion.Euler(Vector3.forward * UnityEngine.Random.Range(0f, 360f)); //rotacao "aleatoria" para o novo flock (de 0 a 360) Translation newT = new Translation { Value = new float3(flockPosition.x, flockPosition.y, gameObject.transform.position.z + zPos) }; entityManager.SetComponentData(flockAgents_ECS[index], newT); //setar a posicao Rotation newR = new Rotation { Value = flockRotation }; entityManager.SetComponentData(flockAgents_ECS[index], newR); //setar a rotacao FlockWho newFW = new FlockWho { flockValue = i, flockManagerValue = flockManagerN, flockLayerValue = flockLayer, flockCollisionCount = 0, objectCollisionCount = 0 }; entityManager.AddComponentData(flockAgents_ECS[index], newFW); //setar a numeracao do flock e do respectivo manager //newFlockAgent.flockManager = this; //ajustar quem criou o flock flockAgents_ECS_T[index] = newT; //setar arrays auxiliares flockAgents_ECS_R[index] = newR; flockAgents_ECS_FW[index] = newFW; } }
public void RestartFlocks() { for (int i = 0; i < qtdFlocksInFlock; i++) //para cada flock { Vector2 flockPosition = UnityEngine.Random.insideUnitCircle * startingCount * agentDensity; //posicao "aleatoria" dentro do range especificado para o novo flock Quaternion flockRotation = Quaternion.Euler(Vector3.forward * UnityEngine.Random.Range(0f, 360f)); //rotacao "aleatoria" para o novo flock (de 0 a 360) Translation newT = new Translation { Value = new float3(flockPosition.x, flockPosition.y, flockAgents_ECS_T[i].Value.z) }; entityManager.SetComponentData(flockAgents_ECS[i], newT); //setar a posicao Rotation newR = new Rotation { Value = flockRotation }; entityManager.SetComponentData(flockAgents_ECS[i], newR); //setar a rotacao FlockWho newFW = new FlockWho { flockValue = flockAgents_ECS_FW[i].flockValue, flockManagerValue = flockAgents_ECS_FW[i].flockManagerValue, flockLayerValue = flockAgents_ECS_FW[i].flockLayerValue, flockCollisionCount = 0, objectCollisionCount = 0 }; entityManager.SetComponentData(flockAgents_ECS[i], newFW); //setar a numeracao do flock e do respectivo manager //newFlockAgent.flockManager = this; //ajustar quem criou o flock flockAgents_ECS_T[i] = newT; //setar arrays auxiliares flockAgents_ECS_R[i] = newR; flockAgents_ECS_FW[i] = newFW; } for (int i = 0; i < qtdFlocks; i++) { squareNeighborRadiusNArray[i] = neighborRadiusNArray[i] * neighborRadiusNArray[i]; squareAvoidanceRadiusNArray[i] = squareNeighborRadiusNArray[i] * avoidanceRadiusMultiplierNArray[i] * avoidanceRadiusMultiplierNArray[i]; } }
void EvaluateRun() { List <int> numFlockColision = new List <int>(); List <int> numObjectColision = new List <int>(); //Initialize values for (int i = 0; i < generationSize; i++) { numFlockColision.Add(0); numObjectColision.Add(0); } //Find number of colisions per flock int numAgents = flockManager.flockAgents_ECS_FW.Length; int numAgentsOnSwarm = numAgents / generationSize; for (int i = 0; i < numAgents; i++) { FlockWho agent = flockManager.flockAgents_ECS_FW[i]; numFlockColision[agent.flockManagerValue] += agent.flockCollisionCount; numObjectColision[agent.flockManagerValue] += agent.objectCollisionCount; } // Make the score for (int i = 0; i < generationSize; i++) { float meanFlockColision = (float)numFlockColision[i] / (float)numAgentsOnSwarm; float meanObjectColision = (float)numObjectColision[i] / (float)numAgentsOnSwarm; float score = meanFlockColision + meanObjectColision; scoreSum[i] += score; } currentEvaluation++; flockManager.RestartFlocks(); }