コード例 #1
0
ファイル: Boid3D.cs プロジェクト: vclimpont/boids
    void MoveTowardsCenter(Collider[] closeBoids)
    {
        float   size        = 0f;
        Vector3 avgPosition = Vector3.zero;

        for (int i = 0; i < closeBoids.Length; i++)         // For every close boid
        {
            Boid3D boid = closeBoids[i].GetComponent <Boid3D>();
            if (boid != this)
            {
                avgPosition += boid.GetPosition();          // Calculate average position
                size++;
            }
        }

        if (size > 0)
        {
            avgPosition /= size;

            Vector3 targetPosition = avgPosition - transform.position;        // Get the direction from current position to the average position calculated and normalize it
            targetPosition = targetPosition.normalized;

            rb.velocity += targetPosition * (bfactory.GetCohesionFactor() / 10.0f);   // Add an amount of
        }
    }
コード例 #2
0
ファイル: BoidFactory3D.cs プロジェクト: vclimpont/boids
    void GenerateBoids()
    {
        for (int i = 0; i < numberOfBoids; i++)
        {
            Boid3D boid = Instantiate(boidPrefab, Vector3.zero, Quaternion.identity).GetComponent <Boid3D>(); // Instantiate a new boid

            float rpx = Random.Range(-10f, 10f);                                                              // position x
            float rpy = Random.Range(-10f, 10f);                                                              // position y
            float rpz = Random.Range(-10f, 10f);                                                              // position z
            float rvx = Random.Range(-1f, 1f);                                                                // direction x
            float rvy = Random.Range(-1f, 1f);                                                                // direction y
            float rvz = Random.Range(-1f, 1f);                                                                // direction z
            float rs  = Random.Range(1f, 4f);                                                                 // speed

            boid.Initialize(rs, new Vector3(rpx, rpy, rpz), new Vector3(rvx, rvy, rvz), this);                // Set random position and random velocity
        }
    }
コード例 #3
0
ファイル: Boid3D.cs プロジェクト: vclimpont/boids
    void MoveWith(Collider[] closeBoids)
    {
        float   size        = 0f;
        Vector3 avgVelocity = Vector3.zero;

        for (int i = 0; i < closeBoids.Length; i++)          // For every close boid
        {
            Boid3D boid = closeBoids[i].GetComponent <Boid3D>();
            if (boid != this)
            {
                avgVelocity += boid.GetVelocity();          // Calculate average velocity
                size++;
            }
        }

        if (size > 0)
        {
            avgVelocity /= size;
            rb.velocity += (avgVelocity * (bfactory.GetAlignmentFactor() / 10.0f));     // Add an amount of average velocity calculated to the current velocity
        }
    }
コード例 #4
0
ファイル: Boid3D.cs プロジェクト: vclimpont/boids
    void MoveAway(Collider[] closeBoids)
    {
        float theta = Mathf.Deg2Rad * 45f;

        float cs = Mathf.Cos(theta);
        float sn = Mathf.Sin(theta);

        for (int i = 0; i < closeBoids.Length; i++)
        {
            Boid3D boid = closeBoids[i].GetComponent <Boid3D>();
            if (boid != this)
            {
                Vector3 targetPosition = transform.position - boid.GetPosition();
                targetPosition = targetPosition.normalized;

                float px = targetPosition.x * cs - targetPosition.y * sn;
                float py = targetPosition.x * sn + targetPosition.y * cs;

                Vector3 dir = new Vector3(px, py, 0);
                rb.velocity += dir * (bfactory.GetSeparationFactor() / 10.0f);
            }
        }
    }