Beispiel #1
0
    public void UpdateFlockMemberPosition(FlockMember Member)
    {
        float Accel = BaseAcceleration * Time.deltaTime;

        Member.Velocity             += (Accel * Member.Heading) - (Member.Velocity * BaseFrictionCo);
        Member.MyTransform.position += Member.Velocity * Time.deltaTime;
    }
Beispiel #2
0
 // Use this for initialization
 void Start()
 {
     controller   = GetComponent <CharacterController>();
     enemyDetails = GetComponentInChildren <PlayerDetails>();
     fm           = GetComponent <FlockMember>();
     hp           = startHp;
     hit          = false;
     StartCoroutine(UpdatePath());
     explode = GetComponent <Explosion>();
     bt      = GetComponent <BehaviorTree>();
     root    = bt.root;
     ts      = GetComponent <TurretShoot>();
     BuildTree();
 }
    void ApplyRules()
    {
        GameObject[] gos;
        gos = FlockManager.allFish;

        Vector3 vcentre = Vector3.zero;
        Vector3 vavoid  = Vector3.zero;
        float   gSpeed  = 1.3f;

        Vector3 goalPos = FlockManager.goalPos;

        float dist;

        int groupSize = 0;         //Group size is based on neighbor distance. The fish will join the flock if they are with in it.

        foreach (GameObject go in gos)
        {
            if (go != this.gameObject)
            {
                dist = Vector3.Distance(go.transform.position, this.transform.position);
                if (dist <= maxNeighborDistance)
                {
                    vcentre += go.transform.position;
                    groupSize++;

                    if (dist < minNeighborDistance)                     //The fish will turn away from each other if they are within this distance.
                    {
                        vavoid = vavoid + (this.transform.position - go.transform.position);
                    }

                    FlockMember anotherFlock = go.GetComponent <FlockMember>();
                    gSpeed = gSpeed + anotherFlock.speed;
                }
            }
        }
        if (groupSize > 0)
        {
            vcentre = vcentre / groupSize + (goalPos - this.transform.position);
            //speed = gSpeed / groupSize;

            Vector3 direction = (vcentre + vavoid) - transform.position;
            if (direction != Vector3.zero)
            {
                transform.rotation = Quaternion.Slerp(transform.rotation,
                                                      Quaternion.LookRotation(direction),
                                                      rotationSpeed * Time.deltaTime);
            }
        }
    }
 // Use this for initialization
 void Start()
 {
     flock = new List <FlockMember>();
     for (int i = 0; i < numberOfMembers; i++)
     {
         GameObject go = Instantiate(memberPrefab);
         go.transform.position = transform.position + new Vector3(Random.Range(-1f, 1f), Random.Range(-1f, 1f), Random.Range(-1f, 1f));
         go.transform.SetParent(transform);
         FlockMember m = new FlockMember();
         m.instance = go;
         m.velocity = new Vector3();
         m.id       = i;
         flock.Add(m);
     }
 }
Beispiel #5
0
    void Awake()
    {
        Members = new FlockMember[Count];

        for (int i = 0; i < Count; i++)
        {
            GameObject NewMember = GameObject.Instantiate(Prefab_FlockMember);
            NewMember.transform.parent   = this.transform;
            NewMember.transform.position = Random.insideUnitCircle * InitialSpread;

            Members[i]             = new FlockMember();
            Members[i].MyTransform = NewMember.transform;
            Members[i].Velocity    = Vector3.zero;
            Members[i].Heading     = Random.insideUnitCircle;
        }
    }
Beispiel #6
0
    // Use this for initialization
    void Start()
    {
        controller   = GetComponent <CharacterController>();
        enemyDetails = GetComponentInChildren <PlayerDetails>();
        fm           = GetComponent <FlockMember>();
        hp           = startHp;
        hit          = false;
        StartCoroutine(UpdatePath());
        explode = GetComponent <Explosion>();

        isRanger = false;
        TurretShoot rangerTest = GetComponentInChildren <TurretShoot>();

        if (rangerTest != null)
        {
            isRanger = true;
        }
    }
Beispiel #7
0
    // Finds all the FlockMembers in a radius around oneself, and sets a list containing all the FlockMember components, as well as
    // a list of the other colliders in the neighborhoot
    private void GetNeighborhood(float radius, out List <FlockMember> enemies, out List <GameObject> otherCol)
    {
        enemies  = new List <FlockMember>();
        otherCol = new List <GameObject>();

        Collider[] hitColliders = Physics.OverlapSphere(transform.position, radius);
        foreach (Collider c in hitColliders)
        {
            GameObject  g = c.gameObject;
            FlockMember f = g.GetComponent <FlockMember>();
            if (f != null)
            {
                enemies.Add(f);
            }
            else if (g.transform.tag != "Ground")
            {
                otherCol.Add(g);
            }
        }
    }
    // Update is called once per frame
    void Update()
    {
        if (flock.Count != numberOfMembers)
        {
            // add new members if less than max
            for (int i = flock.Count; i < numberOfMembers; i++)
            {
                GameObject go = Instantiate(memberPrefab);
                go.transform.position = transform.position + new Vector3(Random.Range(-1f, 1f), Random.Range(-1f, 1f), Random.Range(-1f, 1f));
                go.transform.SetParent(transform);
                FlockMember m = new FlockMember();
                m.instance = go;
                m.velocity = new Vector3();
                m.id       = i;
                flock.Add(m);
            }

            // delete members if greater than max
            while (flock.Count > numberOfMembers)
            {
                Destroy(flock[flock.Count - 1].instance);
                flock.RemoveAt(flock.Count - 1);
            }
        }

        Vector3 centre = new Vector3(), inertia = new Vector3();
        Vector3 alignment = new Vector3();

        foreach (FlockMember m in flock)
        {
            centre  += m.instance.transform.position;
            inertia += m.velocity;
        }

        centre   /= numberOfMembers;
        inertia  /= numberOfMembers;
        alignment = inertia * inertiaFactor;

        foreach (FlockMember m in flock)
        {
            Vector3 pull = new Vector3(), separation = new Vector3(), swarmForce = new Vector3();

            Vector3 localCentre = new Vector3();
            localCentre += m.instance.transform.position;
            int numNeighbours = 1;

            foreach (FlockMember m2 in flock)
            {
                if (m2.id != m.id && (Vector3.Distance(m2.instance.transform.position, m.instance.transform.position) < neighbourDistance))
                {
                    localCentre += m2.instance.transform.position;
                    numNeighbours++;
                }
            }

            localCentre /= numNeighbours;

            if (followTarget != null)
            {
                swarmForce = (followTarget.transform.position - m.instance.transform.position) * swarmFactor;
            }
            pull       = (centre - m.instance.transform.position) * pullFactor;
            separation = (m.instance.transform.position - localCentre) * separationFactor;
            Vector3 acceleration = alignment + pull + separation + swarmForce;

            m.velocity += acceleration * Time.deltaTime;

            m.velocity = Vector3.ClampMagnitude(m.velocity, maxVelocity);

            m.instance.transform.position += m.velocity * Time.deltaTime;

            // turn the member toward their velocity
            m.instance.transform.LookAt(m.instance.transform.position + Vector3.Normalize(m.velocity));
        }
    }
Beispiel #9
0
 void Start()
 {
     _transform   = transform;
     _flockMember = GetComponent <FlockMember>();
 }
Beispiel #10
0
    public void UpdateFlockMemberHeading(FlockMember Member, FlockMember[] Members, float AwarenessRadius)
    {
        int     AwareOfOthersCount  = 0;
        Vector3 AveragePosition     = Vector3.zero;
        Vector3 AverageHeading      = Vector3.zero;
        Vector3 SeparationDirection = Vector3.zero;
        Vector3 FearDirection       = Vector3.zero;

        for (int m = 0; m < Members.Length; m++)
        {
            FlockMember Other = Members[m];
            if (Other == Member)
            {
                continue;
            }

            float DistanceToOther = Vector3.Distance(Other.MyTransform.position,
                                                     Member.MyTransform.position);
            if (DistanceToOther < AwarenessRadius)
            {
                AwareOfOthersCount++;
                AveragePosition     += Other.MyTransform.position;
                AverageHeading      += Other.Heading;
                SeparationDirection += (Member.MyTransform.position - Other.MyTransform.position);
            }
        }

        for (int f = 0; f < FearSources.Count; f++)
        {
            FearSource Source           = FearSources[f];
            float      DistanceToSource = Vector3.Distance(Member.MyTransform.position,
                                                           Source.transform.position);
            if (DistanceToSource < Source.Radius)
            {
                FearDirection += (Member.MyTransform.position - Source.transform.position).normalized * Source.Strength;
            }
        }

        float XDistanceFromCenter   = Mathf.Abs(Member.MyTransform.position.x);
        float YDistanceFromCenter   = Mathf.Abs(Member.MyTransform.position.y);
        float XDirToCenter          = -1 * Mathf.Sign(Member.MyTransform.position.x);
        float YDirToCenter          = -1 * Mathf.Sign(Member.MyTransform.position.y);
        float ReturnToXCenterWeight = Mathf.Clamp(((XDistanceFromCenter / AreaWidth) * 3) - 2, 0, 1);
        float ReturnToYCenterWeight = Mathf.Clamp(((YDistanceFromCenter / AreaHeight) * 3) - 2, 0, 1);

        Vector3 AwayFromWall = new Vector3(ReturnToXCenterWeight * XDirToCenter,
                                           ReturnToYCenterWeight * YDirToCenter,
                                           0);

        Vector3 TowardsAveragePosition = Vector3.zero;

        if (AwareOfOthersCount > 0)
        {
            AveragePosition        = AveragePosition / AwareOfOthersCount;
            TowardsAveragePosition = AveragePosition - Member.MyTransform.position;

            AverageHeading = AverageHeading / AwareOfOthersCount;
        }

        SeparationDirection = SeparationDirection.normalized;

        if (FearSources.Count > 0)
        {
            FearDirection = FearDirection / FearSources.Count;
        }

        Member.Heading += ((TowardsAveragePosition * CohesionWeight) +
                           (AverageHeading * AlignmentWeight) +
                           (SeparationDirection * SeparationWeight) +
                           (FearDirection * FearWeight) +
                           (AwayFromWall * BoundsWeight)) * .5f;
        Member.Heading   = Member.Heading.normalized;
        Member.Heading.z = 0;
    }
 void Start()
 {
     _transform   = transform;
     _flockMember = GetComponent <FlockMember>();
     _rigidBody   = GetComponent <Rigidbody>();
 }
Beispiel #12
0
 // called by FlockMember. Don't call it by hand
 public void RemoveMember(FlockMember fm)
 {
     _members.Remove(fm);
 }
Beispiel #13
0
 // called by FlockMember. Don't call it by hand
 public void AddMember(FlockMember fm)
 {
     _members.Add(fm);
 }