Exemple #1
0
    private void Update()
    {
        _direction += SteeringBehaviour.Seek(TargetPosition, _rb.velocity, this) * Time.deltaTime;
        _direction  = SteeringBehaviour.Arriving(this, _direction, TargetPosition, distanceToArriveAtTargetLocation, 0.6f);
        //_movement.MoveTowards(_rb, TargetPosition, Time.deltaTime);

        _movement.AssignVelocity(_rb, Vector3.ClampMagnitude(_direction, _maxSpeed));

        if (rotateForwardToDirection)
        {
            //var rotation = Quaternion.identity;
            _rb.transform.LookAt(_movement.LastDirectionFacing + _rb.position, Vector3.up);
            var newRotation = _rb.transform.rotation;
            if (lockRotationX)
            {
                newRotation.x = 0;
            }
            if (lockRotationY)
            {
                newRotation.y = 0;
            }
            if (lockRotationZ)
            {
                newRotation.z = 0;
            }

            _rb.transform.rotation = newRotation;
        }

        Debug.DrawLine(_rb.transform.position, _movement.LastDirectionFacing + _rb.transform.position, Color.blue);
    }
Exemple #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
    }