Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+1

Unity Character controller

Когда хожу по поверхности персонаж через время улетает за карту, что может быть не так?
Видео

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
 { 
    [RequireComponent(typeof(CharacterController))] 
    public class PlayerMovement : MonoBehaviour 
    { 
        [SerializeField] private float _walkSpeed = 5; 
        [SerializeField] private float _runSpeed = 8; 
        [SerializeField] private float _rotateSpeed = 75; 
        [SerializeField] private float _jumpForce = 5; 
        [SerializeField] private float _gravity = -9.81f; 
        
        private CharacterController _characterController; 
        private Collider _playerCollider; 
        private Camera _playerCamera; 
 
        private Vector3 _velocity; 
        private Vector2 _rotation; 
        private Vector2 _direction; 
 
        private Joint _joint; 
        private Rigidbody _currentRigidbodyObject; 
        private Collider _currentColliderObject; 
 
        private void Start() 
        { 
            _characterController = GetComponent<CharacterController>(); 
            _playerCollider = GetComponent<Collider>(); 
            _playerCamera = GetComponentInChildren<Camera>(); 
            _joint = GetComponentInChildren<Joint>(); 
             
            Cursor.lockState = CursorLockMode.Locked; 
        } 
 
        private void Update() 
        { 
            _characterController.Move(_velocity * Time.deltaTime); 
             
            _direction = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")); 
            Vector2 mouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); 
 
            if (_characterController.isGrounded) _velocity.y = Input.GetKeyDown(KeyCode.Space) ? _jumpForce : -0.1f; 
            else _velocity.y += _gravity * Time.deltaTime; 
            
             
            mouseDelta *= _rotateSpeed * Time.deltaTime; 
            _rotation.y += mouseDelta.x; 
            _rotation.x = Mathf.Clamp(_rotation.x - mouseDelta.y, -90, 90); 
            _playerCamera.transform.localEulerAngles = _rotation; 
        } 
 
        private void FixedUpdate() 
        { 
            _direction *= Input.GetKey(KeyCode.LeftShift) ? _runSpeed : _walkSpeed; 
            Vector3 move = Quaternion.Euler(0, _playerCamera.transform.eulerAngles.y, 0) * new Vector3(_direction.x, 0, _direction.y); 
            _velocity = new Vector3(move.x, _velocity.y, move.z); 
        } 
    } 
} 
По дате
По рейтингу
Аватар пользователя
Новичок

Что-то я не наблюдаю создания первоначального _velocity
Update() только ссылается на него
В FixedUpdate есть создание, new Vector3 но одним из параметров требует сам себя же.

Аватар пользователя
Высший разум

Проблема может быть связана с неправильным расчетом или применением силы гравитации, из-за чего персонаж «вылетает» за пределы карты. Попробуйте проверить и корректно рассчитывать гравитацию и движение, особенно в `Update()` и `FixedUpdate()`, чтобы убедиться, что персонаж правильно остается на земле.