Unity Character ControllerПопробовать плавные движения и прыжки - PullRequest
0 голосов
/ 08 июня 2019

Когда игрок падает на землю, камера дрожит, а когда он прыгает, он просто телепортируется негладким образом

public class PlayerController : MonoBehaviour {

    CharacterController controller;
    Vector3 motion = Vector3.zero;

    #region Movement Variables
    public float walkingSpeed = 4f;
    public float runningSpeed = 6f;
    public float jumpSpeed = 5f;
    public float gravity = 9.8f;
    #endregion Movement Variables

    void Start () {
        controller = GetComponent<CharacterController>();
    }

    void Update () {
        motion = Vector3.zero;

        motion.x = Input.GetAxis("Horizontal");
        if (controller.isGrounded && Input.GetAxis("Vertical")>0) motion.y += jumpSpeed;
        if (Input.GetKey(KeyCode.LeftShift))
        {
            motion.x *= runningSpeed;
        }
        else
        {
            motion.x *= walkingSpeed;
        }
        motion.y -= gravity;
    }

    void FixedUpdate()
    {
        controller.Move(motion * Time.deltaTime);
    }
}

Character Controller Settings

Я пытаюсь создать плавное движение, и в настоящее время оно вообще ненадежно. спасибо за любые помощники

1 Ответ

0 голосов
/ 13 июня 2019

Возьмите controller.Move(motion * Time.deltaTime); из FixedUpdate и поместите его в самый конец метода обновления.

В случае, если у вас также есть какой-то скрипт на камере, например, какая-то реализация последующей камеры, где вы работаете с компонентом преобразования этой камеры в цикле обновления, вместо этого следует использовать LateUpdate.

Смотрите это https://learn.unity.com/tutorial/update-and-fixedupdate#5c8a4242edbc2a001f47cd63 и https://docs.unity3d.com/ScriptReference/MonoBehaviour.LateUpdate.html

Эта реализация контроллера игрока для GameObject с компонентом Character Controller также может вам помочь.

void Update()
    {
        if (isDead) return;

        isWalking = Input.GetButton("Walk");
        isGrounded = characterController.isGrounded;

        if (isGrounded)
        {
            // Move
            float verticalAxis = Input.GetAxis("Vertical");

            moveDirection = new Vector3(0, 0, verticalAxis);
            moveDirection = transform.TransformDirection(moveDirection);

            if (verticalAxis > 0 && isWalking)
            {
                moveDirection *= walkingSpeed;
            }
            else if (verticalAxis > 0)
            {
                moveDirection *= runningSpeed;
            }

            // Jump
            if (Input.GetButtonDown("Jump"))
            {
                moveDirection.y = jumpSpeed;
                //moveDirection.z = jumpDistance; in case some forward boost is required
                moveDirection = transform.TransformDirection(moveDirection);
            }
        }
        // Gravity
        moveDirection.y -= gravity * Time.deltaTime;
        characterController.Move(moveDirection * Time.deltaTime);

        // Rotation
        float horizontalAxis = Input.GetAxis("Horizontal");
        transform.Rotate(0, horizontalAxis, 0);
        transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.FromToRotation(transform.up, GetHitNormal()) * transform.rotation, yRotationSpeed * Time.deltaTime);
    }

// To keep local up aligned with global up on a slope ground
    private Vector3 GetHitNormal()
    {
        RaycastHit hit;
        if (Physics.Raycast(transform.position, Vector3.down, out hit))
            return hit.normal;
        else
            return Vector3.zero;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...