Esempio n. 1
0
        /// <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());
        }
Esempio n. 2
0
    // 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!");
        }
    }