/// <summary> /// Gets the current acceleration vector of the behavior. /// </summary> /// <returns> /// The acceleration <see cref="Vector" />. /// </returns> public override Vector GetAccelerationVector() { // we are working in local space (Player heading = x-coordinate) var diff = new Vector((FsmAI.Random.NextDouble() - 0.5), (FsmAI.Random.NextDouble() - 0.5), WanderJitter); WanderTarget = Vector.GetSum(WanderTarget, diff); WanderTarget.Resize(WanderRadius); WanderTarget = Vector.GetSum(WanderTarget, new Vector(WanderDistance, 0)); // change to world space var target = new Vector(WanderTarget.X, WanderTarget.Y); if (Player.CurrentSpeed > 0.001) { var m = Player.Movement.Normalized; target.X = WanderTarget.X * m.X - WanderTarget.Y * m.Y; target.Y = WanderTarget.X * m.Y + WanderTarget.Y * m.X; } target = Vector.GetSum(Player.Position, target); Seek.Target = target; return(Seek.GetAccelerationVector()); }
// Use this for initialization void Start() { gameObject.tag = "Scarab"; scarabAudio = GetComponent <AudioSource> (); eventManager = FindObjectOfType <EventManager>(); navAgent = GetComponent <NavMeshAgent>(); player = FindObjectOfType <Player>(); body = GetComponent <Rigidbody>(); triggerTag = "Player"; m_sphereCollider = GetComponent <SphereCollider>(); if (!animator) { animator = GetComponentInChildren <Animator>(); } //m_animator = GetComponent<Animator>(); //// Setting layers for Dr Leben's parts //foreach (Transform child in transform) // child.gameObject.layer = gameObject.layer; // --------------------------------------------------- // The Death Sequence // Set up the IsScarabAttacked deathCheck = new IsScarabAttacked(); Sequence deathSequence = new Sequence(); deathSequence.addBehaviour(deathCheck); //---------------------------------------------------- // The Attack Sequence //// Set up condition for the attack sequence //Triggered attackCondition = new Triggered(); // Set up within range condition for chase sequence WithinRange withinAttack = new WithinRange(); withinAttack.SetParameters(player.gameObject, m_attackRange); // Set Up Continue attack condition ContinueAttack continueAttackCondition = new ContinueAttack(); // Set up the attack behaviour ScarabAttack attackBehaviour = new ScarabAttack(); attackBehaviour.SetParameters(player, m_damage, m_attackTimer, m_rotationSpeed, onAttack); // Set up line of sight condition for chase sequence LineOfSight inSight = new LineOfSight(); inSight.SetParameters(player.gameObject, m_sightRange, m_eyeLocation); //// Set up component check enabled //ComponentEnabled navAgentCheck = new ComponentEnabled(); //navAgentCheck.SetParameters(navMesh); // Set up attack sequence Sequence attackSequence = new Sequence(); attackSequence.addBehaviour(continueAttackCondition); //attackSequence.addBehaviour(navAgentCheck); //attackSequence.addBehaviour(attackCondition); attackSequence.addBehaviour(withinAttack); attackSequence.addBehaviour(inSight); //attackSequence.addBehaviour(facePlayer); attackSequence.addBehaviour(attackBehaviour); //---------------------------------------------------- // The Face Target Sequence // Set up face target behaviour FaceTarget facePlayer = new FaceTarget(); facePlayer.SetParameters(player.gameObject, m_rotationSpeed); // Set up attack sequence Sequence faceTargetSequence = new Sequence(); faceTargetSequence.addBehaviour(continueAttackCondition); faceTargetSequence.addBehaviour(withinAttack); faceTargetSequence.addBehaviour(facePlayer); //---------------------------------------------------- // The Chase Sequence // Set up the chase behaviour SetTargetBehaviour chasePlayer = new SetTargetBehaviour(); chasePlayer.SetParameters(player.gameObject, m_chaseSpeed, "", chasing); // Set up within range condition for chase sequence WithinRange withinChase = new WithinRange(); withinChase.SetParameters(player.gameObject, m_chaseRange); // Set up chase sequence Sequence chaseSequence = new Sequence(); chaseSequence.addBehaviour(continueAttackCondition); //chaseSequence.addBehaviour(navAgentCheck); chaseSequence.addBehaviour(withinChase); chaseSequence.addBehaviour(chasePlayer); //---------------------------------------------------- // The Wander Sequence WanderTarget wanderSetter = new WanderTarget(); SetTargetBehaviour wanderBehaviour = new SetTargetBehaviour(); wanderBehaviour.SetParameters(wanderSetter, m_wanderSpeed, "", wandering); // Set up wander sequence Sequence wanderSequence = new Sequence(); //wanderSequence.addBehaviour(navAgentCheck); wanderSequence.addBehaviour(wanderBehaviour); ////---------------------------------------------------- //// The Attack Selector //// Set up main selector //Selector attackSelector = new Selector(); //attackSelector.addBehaviour(attackSequence); //attackSelector.addBehaviour(chaseSequence); //---------------------------------------------------- // The Sequence Selector // Set up main sequence Selector mainSelector = new Selector(); mainSelector.addBehaviour(deathSequence); mainSelector.addBehaviour(attackSequence); mainSelector.addBehaviour(chaseSequence); mainSelector.addBehaviour(wanderSequence); // Add all sequences to the behaviour list m_behaviours.Add(mainSelector); // correct position so it always sits on navmesh NavMeshHit closestHit; if (NavMesh.SamplePosition(gameObject.transform.position, out closestHit, 500f, NavMesh.AllAreas)) { gameObject.transform.position = closestHit.position; } else { Debug.LogError("Could not find position on NavMesh!"); } }