コード例 #1
0
ファイル: Flock.cs プロジェクト: simonchauvin/ggj2018
    void Awake()
    {
        navfieldManager = GameObject.FindObjectOfType <NavfieldManager>();

        boids    = new Boid[numberOfBoids];
        boids[0] = GetComponentInChildren <Boid>();
        boids[0].init();
        boids[0].setNeighbors(new Boid[0]);
        leader = boids[0];
        for (int i = 1; i < numberOfBoids; i++)
        {
            boids[i] = Instantiate(boidPrefab, transform.position, Quaternion.identity) as Boid;
            boids[i].transform.parent = transform;
            boids[i].init();
        }
        // Set neighbors
        int index             = 0;
        int neighborIndexLeft = numberOfBoids - 1;

        Boid[]      neighbors;
        List <Boid> neighborsLeft = new List <Boid>(boids);

        for (int i = 1; i < numberOfBoids; i++)
        {
            neighbors = new Boid[1];
            for (int j = 0; j < 1; j++)
            {
                index        = Random.Range(1, neighborIndexLeft);
                neighbors[j] = neighborsLeft[index];
                neighborsLeft.RemoveAt(index);
                neighborIndexLeft--;
            }
            boids[i].setNeighbors(neighbors);
        }

        // Init
        barycenter              = Vector3.zero;
        timeSinceLastCheck      = 0f;
        randomWalkTime          = 0f;
        returnTime              = 0f;
        timeSinceLastRandomWalk = 0f;
        timeSinceLastReturn     = 0f;
        randomWalk              = false;
        returnWalk              = false;
        target = Vector3.zero;
    }
コード例 #2
0
ファイル: Navfield.cs プロジェクト: simonchauvin/ggj2018
    private void Create(NavfieldManager manager, Flock flock, Quaternion orientation, NavFieldPrimitives primitive, float duration)
    {
        this.manager = manager;
        origin       = flock.getBarycenter();
        rotation     = orientation;
        size         = manager.minSize;
        cellSize     = manager.minCellSize;

        int count = 0;

        for (int i = 0; i < flock.numberOfBoids; i++)
        {
            if (isInside(flock.boids[i].transform.position))
            {
                count++;
            }
        }

        float ratio    = (float)count / (float)flock.numberOfBoids,
              minRatio = (manager.minSize * manager.minCellSize) / flock.boundRadius;

        if (ratio >= minRatio)
        {
            cellSize = (float)manager.minCellSize / ratio;
        }
        else
        {
            cellSize = (float)manager.minCellSize / minRatio;
        }

        forces        = new Vector3[size, size, size];
        this.duration = duration;
        time          = 0f;

        switch (primitive)
        {
        case NavFieldPrimitives.dispersal:
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    for (int k = 0; k < size; k++)
                    {
                        forces[i, j, k] = manager.force * new Vector3((i - (size * 0.5f)) / (size * 0.5f), (j - (size * 0.5f)) / (size * 0.5f), (k - (size * 0.5f)) / (size * 0.5f));
                    }
                }
            }
            break;

        case NavFieldPrimitives.gathering:
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    for (int k = 0; k < size; k++)
                    {
                        forces[i, j, k] = manager.force * -new Vector3((i - (size * 0.5f)) / (size * 0.5f), (j - (size * 0.5f)) / (size * 0.5f), (k - (size * 0.5f)) / (size * 0.5f));
                    }
                }
            }
            break;

        case NavFieldPrimitives.horizontal_compressor:
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    for (int k = 0; k < size; k++)
                    {
                        forces[i, j, k] = manager.force * -new Vector3((i - (size * 0.5f)) / (size * 0.5f), 0, 0);
                    }
                }
            }
            break;

        case NavFieldPrimitives.vertical_compressor:
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    for (int k = 0; k < size; k++)
                    {
                        forces[i, j, k] = manager.force * -new Vector3(0, (j - (size * 0.5f)) / (size * 0.5f), 0);
                    }
                }
            }
            break;

        case NavFieldPrimitives.ascension:
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    for (int k = 0; k < size; k++)
                    {
                        forces[i, j, k] = manager.force * new Vector3(0, 1, 0);
                    }
                }
            }
            break;

        case NavFieldPrimitives.descent:
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    for (int k = 0; k < size; k++)
                    {
                        forces[i, j, k] = manager.force * -new Vector3(0, 1, 0);
                    }
                }
            }
            break;

        case NavFieldPrimitives.tube:
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    for (int k = 0; k < size; k++)
                    {
                        if (i - (size * 0.5f) < 0)
                        {
                            forces[i, j, k] = manager.force * new Vector3(1, 1, 0);
                        }
                        else
                        {
                            forces[i, j, k] = manager.force * new Vector3(-1, 1, 0);
                        }
                    }
                }
            }
            break;
        }
    }
コード例 #3
0
ファイル: Navfield.cs プロジェクト: simonchauvin/ggj2018
 public Navfield(NavfieldManager manager, Flock flock, Quaternion orientation, NavFieldPrimitives primitive, float duration)
 {
     Create(manager, flock, orientation, primitive, duration);
 }