void Start() { componentes = new List <Fish3D>(numFishes); //we generate the lookup directions for the collision checks once if (collCheckDir == null) { collCheckDir = new List <Vector3>(numDirections); for (int i = 0; i < numDirections; i++) { float phi = Mathf.Acos(1.0f - 2.0f * (float)i / numDirections); float theta = Mathf.PI * (1 + Mathf.Sqrt(5)) * i; collCheckDir.Add(new Vector3(Mathf.Cos(theta) * Mathf.Sin(phi), Mathf.Sin(theta) * Mathf.Sin(phi), Mathf.Cos(phi))); } } //we generate the fishes for (int i = 0; i < numFishes; i++) { GameObject fish = Instantiate(fishPrefab, transform); Fish3D fishComp = fish.GetComponent <Fish3D>(); fishComp.id = componentes.Count; fishComp.settings = settings; fishComp.Init(collCheckDir, spawnSize); componentes.Add(fishComp); } }
void CalculateFishData(Fish3D aFish) { //RESET aFish.flockCenter = Vector3.zero; aFish.flockDirection = Vector3.zero; aFish.avoidanceDirection = Vector3.zero; aFish.numFlockMates = 0; foreach (Fish3D otherFish in componentes) { if (aFish.id != otherFish.id) { //position checking Vector3 otherFishPos = otherFish.transform.position; Vector3 diference = aFish.transform.position - otherFishPos; float distance = diference.magnitude; //data calculation if (distance < settings.sightRadius) { aFish.flockCenter += -otherFishPos; aFish.flockDirection += otherFish.transform.forward; if (distance < settings.avoidRadius) { aFish.avoidanceDirection += diference / distance; } aFish.numFlockMates++; #if UNITY_EDITOR if (aFish.drawGizmo) { Debug.DrawLine(aFish.transform.position, otherFishPos); } #endif } } } }