void Start() { Separation separate = new Separation(); separate.character = this; GameObject[] goBirds = GameObject.FindGameObjectsWithTag("bird"); kBirds = new Kinematic[goBirds.Length - 1]; int j = 0; for (int i = 0; i < goBirds.Length - 1; i++) { if (goBirds[i] == this) { continue; } kBirds[j++] = goBirds[i].GetComponent <Kinematic>(); } separate.targets = kBirds; Arrive cohere = new Arrive(); cohere.character = this; cohere.target = myCohereTarget; LookWhereGoing myRotateType = new LookWhereGoing(); myRotateType.character = this; mySteering = new BlendedSteering(); mySteering.behaviors = new BehaviorAndWeight[3]; mySteering.behaviors[0] = new BehaviorAndWeight(); mySteering.behaviors[0].behavior = separate; mySteering.behaviors[0].weight = 1f; mySteering.behaviors[1] = new BehaviorAndWeight(); mySteering.behaviors[1].behavior = cohere; mySteering.behaviors[1].weight = 1f; mySteering.behaviors[2] = new BehaviorAndWeight(); mySteering.behaviors[2].behavior = myRotateType; mySteering.behaviors[2].weight = 1f; ObstacleAvoidance myAvoid = new ObstacleAvoidance(); myAvoid.character = this; myAvoid.target = myCohereTarget; myAvoid.flee = true; BlendedSteering myHighPrioritySteering = new BlendedSteering(); myHighPrioritySteering.behaviors = new BehaviorAndWeight[1]; myHighPrioritySteering.behaviors[0] = new BehaviorAndWeight(); myHighPrioritySteering.behaviors[0].behavior = myAvoid; myHighPrioritySteering.behaviors[0].weight = 1f; myAdvancedSteering = new PrioritySteering(); myAdvancedSteering.groups = new BlendedSteering[2]; myAdvancedSteering.groups[0] = new BlendedSteering(); myAdvancedSteering.groups[0] = myHighPrioritySteering; myAdvancedSteering.groups[1] = new BlendedSteering(); myAdvancedSteering.groups[1] = mySteering; }
// Start is called before the first frame update void Start() { //DATOS DE PERSONAJE kineticsAgent = agent.kineticsAgent; steeringAgent = agent.steeringAgent; //ARRIVE INITIALIZATION enemy = new GameObject();//creamos un enemigo ficticio que sera el mouse enemy.transform.position = Vector3.zero; kineticsEnemy = new Kinetics(0f, Vector3.zero, enemy.transform); arrive = new Arrive(kineticsAgent, kineticsEnemy, maxAccelerationArrive, agent.maxspeed, targetRadiusArrive, slowRadiusArrive, timeTotargetArrive); arrive.weigth = 1f; //AVOID INITIALIZATION obstacles = GameObject.FindGameObjectsWithTag("Obstacle"); for (int i = 0; i < obstacles.Length; i++) { obs_trans.Add(obstacles[i].transform); } Transform[] obstacles_transforms = obs_trans.ToArray(); obstacleAvoidance = new ObstacleAvoidance(kineticsAgent, obstacles_transforms, avoidDistance, lookAheadAvoid, steeringAgent); obstacleAvoidance.weigth = 1f; //FACE INITIALIZATION face = new Face(kineticsAgent, kineticsEnemy); face.weigth = 1f; //BLEND INITIALIZATION behaviorsArrive[0] = arrive; behaviorsArrive[1] = face; behaviorsAvoid[0] = obstacleAvoidance; blendArrive = new BlendedSteering(behaviorsArrive, maxAccelBlend, maxAngularBlend); blendAvoid = new BlendedSteering(behaviorsAvoid, maxAccelBlend, maxAngularBlend); //PRIORITY INITIALIZATION groups[0] = blendAvoid;//OJO avoid tiene prioridad por eso va primero groups[1] = blendArrive; priority = new PrioritySteering(groups, steeringAgent); }
private void Start() { //Separate Separation separation = new Separation(); separation.character = this; GameObject[] goBirds = GameObject.FindGameObjectsWithTag("Bee"); kBirds = new Kinematic[goBirds.Length - 1]; int a = 0; for (int i = 0; i < goBirds.Length - 1; i++) { if (goBirds[i] == this) { continue; } kBirds[a++] = goBirds[i].GetComponent <Kinematic>(); } separation.targets = kBirds; //Cohere Arrive cohere = new Arrive(); cohere.character = this; cohere.target = myCohereTarget; //Rotate LookWhereGoing myRotateType = new LookWhereGoing(); myRotateType.character = this; blendedSteering = new BlendedSteering(); blendedSteering.behaviors = new WeightedBehavior[3]; blendedSteering.behaviors[0] = new WeightedBehavior(); blendedSteering.behaviors[0].behavior = separation; blendedSteering.behaviors[0].weight = 1f; blendedSteering.behaviors[1] = new WeightedBehavior(); blendedSteering.behaviors[1].behavior = cohere; blendedSteering.behaviors[1].weight = 1f; blendedSteering.behaviors[2] = new WeightedBehavior(); blendedSteering.behaviors[2].behavior = myRotateType; blendedSteering.behaviors[2].weight = 1f; //Priority Arbitration AvoidObstacle avoid = new AvoidObstacle(); avoid.character = this; avoid.target = myCohereTarget; avoid.flee = false; BlendedSteering prioritySteering = new BlendedSteering(); prioritySteering.behaviors = new WeightedBehavior[1]; prioritySteering.behaviors[0] = new WeightedBehavior(); prioritySteering.behaviors[0].behavior = avoid; prioritySteering.behaviors[0].weight = 1f; advancedSteering = new PrioritySteering(); advancedSteering.myGroups = new BlendedSteering[2]; advancedSteering.myGroups[0] = new BlendedSteering(); advancedSteering.myGroups[0] = prioritySteering; advancedSteering.myGroups[1] = new BlendedSteering(); advancedSteering.myGroups[1] = blendedSteering; }
void Start() { steering = new PrioritySteering(); //Make 2 groups, one for flocking, and one for avoiding obstacles steering.groups = new BlendedSteering[2]; //Initialize them steering.groups[0] = new BlendedSteering(); steering.groups[1] = new BlendedSteering(); //Put obstacle avoidance into its own group ObstacleAvoidance avoidAI = new ObstacleAvoidance(); avoidAI.character = GetComponent <Kinematic>(); //Initialize array, only 1 behavior needed in this group's consideration steering.groups[0].behaviors = new BehaviorAndWeight[1]; steering.groups[0].behaviors[0] = new BehaviorAndWeight(); //Assign specific behavior steering.groups[0].behaviors[0].behavior = avoidAI; //Set weight steering.groups[0].behaviors[0].weight = 4f; //Create behaviors to go into the bird Arrive arriveAI = new Arrive(); arriveAI.character = GetComponent <Kinematic>(); arriveAI.target = arriveTarget; Seperation seperateAI = new Seperation(); seperateAI.character = GetComponent <Kinematic>(); GameObject[] allBirds = GameObject.FindGameObjectsWithTag("bird"); Kinematic[] allOtherBirdKinematics = new Kinematic[allBirds.Length]; int j = 0; foreach (GameObject bird in allBirds) { if (bird != this) { allOtherBirdKinematics[j] = bird.GetComponent <Kinematic>(); j++; } else { Debug.Log("caught myself"); } } seperateAI.targets = allOtherBirdKinematics; LookWhereGoing lookAI = new LookWhereGoing(); lookAI.character = GetComponent <Kinematic>(); //Set up flocking group in priority steering steering.groups[1].behaviors = new BehaviorAndWeight[3]; steering.groups[1].behaviors[0] = new BehaviorAndWeight(); steering.groups[1].behaviors[1] = new BehaviorAndWeight(); steering.groups[1].behaviors[2] = new BehaviorAndWeight(); //Assign specific behaviors steering.groups[1].behaviors[0].behavior = arriveAI; steering.groups[1].behaviors[1].behavior = seperateAI; steering.groups[1].behaviors[2].behavior = lookAI; //Set weight of each behavior steering.groups[1].behaviors[0].weight = 1f; steering.groups[1].behaviors[1].weight = 20f; steering.groups[1].behaviors[2].weight = 4f; }
void Start() { ///Setup behaviours and BlendSteer for general flocking #region General Flocking ///Start Separation //Separate from others and not self Separation _separate = new Separation(); _separate.character = this; GameObject[] _goBirds = GameObject.FindGameObjectsWithTag("birds"); relevantBirds = new GameObject[_goBirds.Length - 1]; int _relevantBirdCount = 0; for (int _bird = 0; _bird < _goBirds.Length - 1; _bird++) { if (_goBirds[_bird] == this) { //Ignore self for separation continue; } ///Else separate from them relevantBirds[_relevantBirdCount++] = _goBirds[_bird]; } _separate.neighborhood = relevantBirds; ///End Separation ///Start Cohere Arrive _cohere = new Arrive(); _cohere.character = this; _cohere.target = flockCoMTarget; ///End Cohere ///Start LWYG LookWhereGoing _lWYG = new LookWhereGoing(); _lWYG.character = this; ///End LWYG ///Start Blending for general flocking _generalFlockSteering = new BlendedSteering(); _generalFlockSteering.behaviours = new BehaviourAndWeight[3]; //Separation _generalFlockSteering.behaviours[0] = new BehaviourAndWeight(); _generalFlockSteering.behaviours[0].behaviour = _separate; _generalFlockSteering.behaviours[0].weight = 1f; //Weights are still not great, but functional //Cohere _generalFlockSteering.behaviours[1] = new BehaviourAndWeight(); _generalFlockSteering.behaviours[1].behaviour = _cohere; _generalFlockSteering.behaviours[1].weight = .4f; //Look Where Going _generalFlockSteering.behaviours[2] = new BehaviourAndWeight(); _generalFlockSteering.behaviours[2].behaviour = _lWYG; _generalFlockSteering.behaviours[2].weight = 20f; ///End Blending #endregion General Flocking #region Obst Avoid ///Start ObstAvoid ObstAvoid _obstAvoid = new ObstAvoid(); _obstAvoid.character = this; _obstAvoid.lookAheadDist = 5f; //_obstAvoid.target = flockCoMTarget; ///End ObstAvoid ///Start Blending for obstacle avoidance _obstAvoidSteering = new BlendedSteering(); _obstAvoidSteering.behaviours = new BehaviourAndWeight[1]; //ObstAvoid _obstAvoidSteering.behaviours[0] = new BehaviourAndWeight(); _obstAvoidSteering.behaviours[0].behaviour = _obstAvoid; _obstAvoidSteering.behaviours[0].weight = 1f; //Priority handles this ///End Blending #endregion Obst Avoid #region Priority Blending ///Start Prioritization _prioritySteering = new PrioritySteering(); _prioritySteering.blends = new BlendedSteering[2]; //General Flocking _prioritySteering.blends[0] = new BlendedSteering(); _prioritySteering.blends[0] = _obstAvoidSteering; //Obst Avoid _prioritySteering.blends[1] = new BlendedSteering(); _prioritySteering.blends[1] = _generalFlockSteering; ///End Prioritization #endregion Priority Blending }
// Failed attempt to add observer pattern to allow for adding // or deleting boids //private void OnEnable() //{ // DestroyerAngel.OnKillBoid += killBoids; // //PriorityGame.OnAddBoid += addBoids; //} //private void OnDisable() //{ // DestroyerAngel.OnKillBoid -= killBoids; // //PriorityGame.OnAddBoid -= addBoids; //} // Start is called before the first frame update protected override void Start() { // personal space for the boidies separate = new Separation(); separate.character = this; GameObject[] goBoids = GameObject.FindGameObjectsWithTag("boid"); kBoids = new Kinematic[goBoids.Length - 1]; int j = 0; for (int i = 0; i < goBoids.Length - 1; i++) { if (goBoids[i] == this) { continue; } kBoids[j++] = goBoids[i].GetComponent <Kinematic>(); } separate.targets = kBoids; // cohere to center of mass Arrive cohere = new Arrive(); cohere.character = this; cohere.target = cohereTarget; // and look where center of mass is going Face rotateType = new Face(); rotateType.character = this; rotateType.target = cohereTarget; // m_Steering = new BlendedSteering(); m_Steering = gameObject.AddComponent <BlendedSteering>(); m_Steering.behaviors = new BehaviorAndWeight[3]; m_Steering.behaviors[0] = new BehaviorAndWeight(); m_Steering.behaviors[0].behavior = separate; m_Steering.behaviors[0].weight = 1f; m_Steering.behaviors[1] = new BehaviorAndWeight(); m_Steering.behaviors[1].behavior = cohere; m_Steering.behaviors[1].weight = 1f; m_Steering.behaviors[2] = new BehaviorAndWeight(); m_Steering.behaviors[2].behavior = rotateType; m_Steering.behaviors[2].weight = 1f; // add prioritysteering ObstacleAvoidance avoid = new ObstacleAvoidance(); avoid.character = this; avoid.target = avoidThis; avoid.lookAhead = 200f; avoid.avoidDistance = 100f; avoid.flee = true; // blend the priority steering with the original blended steering BlendedSteering highPriority = gameObject.AddComponent <BlendedSteering>(); highPriority.behaviors = new BehaviorAndWeight[1]; highPriority.behaviors[0] = new BehaviorAndWeight(); highPriority.behaviors[0].behavior = avoid; highPriority.behaviors[0].weight = 100f; prioritySteering = gameObject.AddComponent <PrioritySteering>(); prioritySteering.groups = new BlendedSteering[2]; prioritySteering.groups[0] = gameObject.AddComponent <BlendedSteering>(); prioritySteering.groups[0] = highPriority; prioritySteering.groups[1] = gameObject.AddComponent <BlendedSteering>(); prioritySteering.groups[1] = m_Steering; }
void Start() { // Separate from other birds Separation separate = new Separation(); separate.character = this; GameObject[] goBirds = GameObject.FindGameObjectsWithTag("bird"); kBirds = new Kinematic[goBirds.Length - 1]; int j = 0; for (int i = 0; i < goBirds.Length - 1; i++) { if (goBirds[i] == this) { continue; } kBirds[j++] = goBirds[i].GetComponent <Kinematic>(); } separate.targets = kBirds; // Cohere to center of mass - ez mode Arrive cohere = new Arrive(); cohere.character = this; cohere.target = myCohereTarget; // look where center of mass is going - ez mode LookWhereGoing myRotateType = new LookWhereGoing(); myRotateType.character = this; mySteering = new BlendedSteering(); mySteering.behaviors = new BehaviorAndWeight[3]; mySteering.behaviors[0] = new BehaviorAndWeight(); mySteering.behaviors[0].behavior = separate; mySteering.behaviors[0].weight = 1f; //3 mySteering.behaviors[1] = new BehaviorAndWeight(); mySteering.behaviors[1].behavior = cohere; mySteering.behaviors[1].weight = 1f; //.5 mySteering.behaviors[2] = new BehaviorAndWeight(); mySteering.behaviors[2].behavior = myRotateType; mySteering.behaviors[2].weight = 1f; // set up prioritysteering ObstacleAvoidance myAvoid = new ObstacleAvoidance(); myAvoid.character = this; myAvoid.target = myCohereTarget; myAvoid.flee = true; // otherwise I seek to the obstacle BlendedSteering myHighPrioritySteering = new BlendedSteering(); myHighPrioritySteering.behaviors = new BehaviorAndWeight[1]; myHighPrioritySteering.behaviors[0] = new BehaviorAndWeight(); myHighPrioritySteering.behaviors[0].behavior = myAvoid; myHighPrioritySteering.behaviors[0].weight = 1f; myAdvancedSteering = new PrioritySteering(); myAdvancedSteering.groups = new BlendedSteering[2]; myAdvancedSteering.groups[0] = new BlendedSteering(); myAdvancedSteering.groups[0] = myHighPrioritySteering; myAdvancedSteering.groups[1] = new BlendedSteering(); myAdvancedSteering.groups[1] = mySteering; }