/// <summary> /// Calculates Cohesive movement for flock agent by averaging the distances between it /// and its neighbors. /// </summary> /// <param name="flockAgent"></param> /// <param name="context"></param> /// <param name="contextCount"></param> /// <param name="flock"></param> /// <returns></returns> public override Vector2 CalculateMove(FlockAgent flockAgent, Transform[] context, int contextCount, Flock flock) { if (contextCount == 0) { return(Vector2.zero); } _cohesionMove = Vector2.zero; for (int i = 0; i < contextCount; ++i) { _cohesionMove += (Vector2)context[i].position; } _cohesionMove /= contextCount; _cohesionMove -= flockAgent.Position; return(_cohesionMove); }
/// <summary> /// Instantiates all flocking agents and populates the agents list. /// </summary> private void InstantiateAgents() { Agents = new FlockAgent[_numberOfAgents]; for (int i = 0; i < _numberOfAgents; ++i) { _tempAgentPosition = Random.insideUnitSphere * _numberOfAgents * AgentsDensityInverse; _tempAgentRotation = Quaternion.Euler(transform.forward * Random.Range(0, 360)); _tempFlockAgent = Instantiate( _agentPrefab.gameObject, _tempAgentPosition, _tempAgentRotation, _transform ).GetComponent <FlockAgent>(); _tempFlockAgent.Name = "Agent " + i; Agents[i] = _tempFlockAgent; } }
/// <summary> /// Calculates movement for flocking agents. /// </summary> /// <param name="flockAgent"></param> /// <param name="context"></param> /// <param name="flock"></param> /// <returns></returns> public abstract Vector2 CalculateMove(FlockAgent flockAgent, Transform[] context, int contextCount, Flock flock);