eureka713 2024-03-03 14:03 采纳率: 0%
浏览 29

unity第一人称视角抽搐问题

unity第一人称在人物移动时转动视角,会发生轻微抽搐。

单独移动人物或单独移动视角并不会抽搐,一边动一边转头就会抽搐。

private void Start()
    {
        Application.targetFrameRate = 75;
        rb = GetComponent<Rigidbody>();
        rb.freezeRotation = true;

        readyToJump = true;
    }

    private void Update()
    {
        // ground check

    }

void FixedUpdate()
    {
        MovePlayer();
        grounded = Physics.Raycast(transform.position, Vector3.down, playerHeight * 0.5f + 0.3f, whatIsGround);

        MyInput();
        SpeedControl();

        // handle drag
        if (grounded)
            rb.drag = groundDrag;
        else
            rb.drag = 0;

    }
 void LateUpdate()
    {
        yrotate = Input.GetAxis("Mouse X") * Time.deltaTime * rotationspeed;
        yrotation += yrotate;

        transform.rotation = Quaternion.Euler(0, yrotation, 0);

        xrotate = Input.GetAxis("Mouse Y") * Time.deltaTime * rotationspeed;
        xrotation -= xrotate;
        xrotation = Mathf.Clamp(xrotation, -90f, 90f);
        look.transform.localRotation = Quaternion.Euler(xrotation, 0, 0);

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2024-03-03 14:04
    关注

    eureka713 下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    根据你提供的代码,可以看出你在LateUpdate()方法中处理了鼠标移动视角的逻辑。由于LateUpdate()是在Update()之后执行的,所以在这里进行角色的旋转是合理的。

    然而,你的问题是在人物移动时转动视角会发生轻微抽搐。这可能是由于视角的旋转和人物移动的更新时间步长不同步引起的。为了解决这个问题,可以尝试以下方案:

    1. 将视角旋转逻辑移动到FixedUpdate()中:将视角旋转的代码移动到FixedUpdate()方法中,与人物移动的更新时间步长保持一致。这样可以避免视角旋转和人物移动的不同步。

    2. 使用SmoothDamp进行平滑旋转:在LateUpdate()中使用SmoothDamp方法,逐渐将当前旋转角度平滑地过渡到目标旋转角度。这样可以避免突然的旋转导致的抽搐感。

    3. 调整帧率和旋转速度参数:检查帧率和旋转速度参数是否合适。如果帧率过低或旋转速度过高,也可能导致抽搐问题。可以尝试调整帧率和旋转速度参数的值,找到最适合的组合。

    修改后的代码示例:

    private void FixedUpdate()
    {
        MovePlayer();
        grounded = Physics.Raycast(transform.position, Vector3.down, playerHeight * 0.5f + 0.3f, whatIsGround);
    
        MyInput();
        SpeedControl();
    
        // handle drag
        if (grounded)
            rb.drag = groundDrag;
        else
            rb.drag = 0;
    
        RotateCamera();
    }
    
    private void RotateCamera()
    {
        float yrotate = Input.GetAxis("Mouse X") * rotationspeed;
        float xrotate = Input.GetAxis("Mouse Y") * rotationspeed;
    
        // Smooth damp rotation
        float smoothDampTime = 0.1f; // Adjust the smooth damp time according to your preference
        float smoothDampVelocity = 0f;
        yrotation = Mathf.SmoothDamp(yrotation, yrotation + yrotate, ref smoothDampVelocity, smoothDampTime);
        xrotation -= xrotate;
        xrotation = Mathf.Clamp(xrotation, -90f, 90f);
    
        // Apply rotation
        transform.rotation = Quaternion.Euler(0, yrotation, 0);
        look.transform.localRotation = Quaternion.Euler(xrotation, 0, 0);
    }
    

    请注意,这只是一个示例,你可以根据你的需求做出相应的调整。同时,请确保你的游戏摄像机的旋转和移动逻辑是同步进行的,避免产生抽搐效果。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月3日