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); }
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 }