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; }
// 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); } }
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; } }
// 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; } }
// 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)); } }
void Start() { _transform = transform; _flockMember = GetComponent <FlockMember>(); }
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>(); }
// called by FlockMember. Don't call it by hand public void RemoveMember(FlockMember fm) { _members.Remove(fm); }
// called by FlockMember. Don't call it by hand public void AddMember(FlockMember fm) { _members.Add(fm); }