Exemple #1
0
    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);
        }
    }
Exemple #2
0
    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
                }
            }
        }
    }