// Update is called once per frame
    void Update()
    {
        if (seekOn)
        {
            obj1.SeekAndArrive(obj2.transform.position);
        }

        if (fleeOn)
        {
            obj1.Flee(obj3.transform.position);
        }

        if (wanderOn)
        {
            obj1.Wander();
        }

        if (pursuitOn)
        {
            obj1.Pursuit(obj2.transform.position, obj2script.velocity);
        }

        if (evadeOn)
        {
            obj1.Evade(obj3.transform.position, obj3script.velocity);
        }

        /* if (leaderFollowOn)
         * {
         *   obj1.LeaderFollow(obj2script.velocity, obj2.transform.position);
         * }*/
    }
Ejemplo n.º 2
0
    private void Reposition(GameObject targetObject, IAiStateMachine stateMachine, float deltaTime)
    {
        var   targetPosition = targetObject.transform.position;
        float distance       = Vector3.Distance(targetPosition, stateMachine.MoverComponent.CurrentPosition);

        bool isInAttackRange = distance <= attackDistance;
        bool canAttack       = _attackTimer > attackInterval;
        bool isClose         = distance < minDistanceToMaintain;
        bool isFar           = distance > maxDistanceToMaintain;
        bool isTooFar        = distance > stateMachine.FieldOfViewComponent.Radius;
        bool canSeeTarget    = stateMachine.FieldOfViewComponent.GameObjectsInView.Contains(TargetObject);

        if (isTooFar || !canSeeTarget)
        {
            TargetObject = null;
        }

        //if low on life go to flee state

        if (canAttack && isInAttackRange)
        {
            //go to attack state
            Attack(TargetObject);
        }

        if (isClose)
        {
            _direction += SteeringBehaviour.Flee(targetPosition, _direction, stateMachine.MoverComponent) * deltaTime;
        }
        else if (isFar)
        {
            _direction += SteeringBehaviour.Seek(targetPosition, _direction, stateMachine.MoverComponent) * deltaTime;
        }
        else
        {
            var direction = SteeringBehaviour.Seek(targetPosition, _direction, stateMachine.MoverComponent).normalized;
            stateMachine.MoverComponent.MoveDirection(direction);
            _direction = SteeringBehaviour.Arriving(stateMachine.MoverComponent, _direction, targetPosition, maxDistanceToMaintain, .05f);
        }
        //arrival behaviour
        //attack
        //roam around
    }