角色自动移动时出现卡顿问题

3

我正在尝试让角色自动移动,但当角色向左或向右时会冻结。

视频链接:

https://www.youtube.com/watch?v=Ah4cYdXN8Y8

角色移动脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Movement : MonoBehaviour
{


    public float moveSpeed;
    public float moveDirection;
    public float jumpForce;
    public AudioSource audioSource;

    private Rigidbody2D rb;
    private bool facingRight = true;
    private bool isJumping = false;
    private string direction = "right";



    // Start is called before the first frame update
    void Start()
    {


        // Screen.SetResolution(640, 480, true);

    }

    // Update is called once per frame
    void Update()
    {
        ProcessInputs();



        // FlipCharacter();
        if(direction == "right"){
            MoveRight();
        }

        if(direction == "left"){
            MoveLeft();
        }

    }


    private void FixedUpdate()
    {
        // Move();
    }

    private void OnCollisionEnter2D(Collision2D c)
    {
        if(c.gameObject.tag == "Rightwall"){

            Debug.Log("wall");
            rb.velocity = new Vector2(-1 * moveDirection * moveSpeed, rb.velocity.y);

            direction = "left";
          
        }

        if (c.gameObject.tag == "Leftwall")
        {

            direction = "right";


        }
    }




    private void Awake()
    {
        rb = GetComponent<Rigidbody2D>();

    }


    private void MoveRight()
    {
        rb.velocity = new Vector2(moveDirection * moveSpeed, rb.velocity.y);

        if(isJumping){
            Debug.Log("yep");
            rb.AddForce(new Vector2(0f, jumpForce),ForceMode2D.Impulse);
            audioSource.Play();
        }
        isJumping = false;
    }

    private void MoveLeft()
    {
        rb.velocity = new Vector2(-1* moveDirection * moveSpeed, rb.velocity.y);

        if (isJumping)
        {
            Debug.Log("yep");
            rb.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);
            audioSource.Play();
        }
        isJumping = false;
    }


    private void ProcessInputs()
    {
        moveSpeed = moveSpeed;

        if(Input.GetButtonDown("Jump")){
            isJumping = true;
           // Debug.Log("jump");
        }
    }

    private void FlipCharacter(){
        facingRight = !facingRight;
        transform.Rotate(0f, 180f, 0f);

    }

}

游戏中的角色被放大了6倍。

Character transform values

因此,我该如何解决我的问题?我错在哪里了?

我很努力地解决这个问题,但是我无法解决它。

我该如何解决这个延迟问题?我是Unity的新手。

编辑:我的意思是角色不连续移动。它是以离散的方式移动。我的目的是使移动更加平滑。在计算机编程中,我知道无法使运动%100平滑,但用户不应该注意到“离散”运动。移动应该看起来更加逼真

我不知道真正的问题所在。这可能是FPS问题(Unity问题和显示问题),或者我在脚本中做错了什么。我是Unity的新手。

最后,我该如何解决我的问题?

编辑2: 这是我的FPS。这些值正常还是异常?或者我们能否说,“如果FPS在某些时刻低于60,那么这个游戏的性能真的很差。FPS应始终等于或大于60,以说明其性能良好。”你怎么看? FPS


从视频中可以看出,角色没有冻结。它在左右移动。此外,在ProcessInputs中不要将moveSpeed赋值给自身,并且删除moveDirection,因为你没有使用它。 - jiveturkey
请仔细观看,它不会像这样移动。https://www.youtube.com/watch?v=iigQd5FpWOM在这个视频中,角色向左右移动而没有停顿。它运动平稳,但是我的角色移动不够平滑,如果你仔细观察,就会发现。 - gurkan stack
在视频中很难看清你到底在谈论什么...总的来说:处理刚体时不要使用Transform组件!你正在使用transform.Rotate(0f, 180f, 0f);,这可能会破坏物理效果..而应该使用例如rb.MoveRotation(...)通过物理引擎进行旋转。 - derHugo
请激活“深度分析”并查找分析器底部确切的延迟来源... - derHugo
我不知道这是什么意思?我是新手!!我已经激活了,但似乎没有任何变化!! - gurkan stack
3个回答

3

首先,如果不起作用,请将运动代码放在 FixedUpdate 中。如果仍然无效,请继续阅读...

像运动一样的滞后可能并非来自实际滞后 ,因为这似乎是一个简单的 Unity 项目,但首先,请检查 fps,通过检查 统计信息 和检查 Unity 的 分析器 来确定并找出如何优化游戏。

找出刚体是否有任何阻力,并将其设置为 0,然后测试是否仍存在离散的运动。

接下来检查 Unity 中的所有运动类型,有三种方法可以移动对象而无需使其穿墙而过:

第一种是通过设置速度来移动对象,这是您选择的一种方式。

第二种是使用 AddForce,根据我的经验,没有发现任何滞后问题。因此,请将rb.velocity = new Vector2 (-1* moveDirection * moveSpeed, rb.velocity.y); 替换为 rb.AddForce(moveDirection*moveSpeed);

测试一下。

第三种是使用 MovePosition,但我不建议使用,但是如果您喜欢这种风格的运动,请进行测试。

因此,请将 rb.velocity = new Vector2 (-1* moveDirection * moveSpeed, rb.velocity.y); 替换为 rb.MovePosition(transform.position+(moveDirection*moveSpeed*Time.deltaTime));

测试一下。

这里是有关 Unity 运动的 Youtube 视频:https://www.youtube.com/watch?v=ixM2W2tPn6c

如果所有这些都不起作用,那么很可能是由于 Unity 的帧率/屏幕刷新率或甚至是我们的眼睛在捉弄我们。


这是我的性能分析器。 有时低于60FPS。 https://i.ibb.co/rFtw3V6/Ekran-Resmi-2020-11-11-22-49-47.png 你认为这正常吗? - gurkan stack
@gurkanstack 请激活“深度分析”并查找性能分析器底部,确定您的延迟具体来自哪里... - derHugo

2

Harry在这里给出了一个很好的答案。除了他的提示之外,我建议你执行以下操作:

  1. 进入检查器
  2. 在上方的工具栏中,选择资源 > 创建 > 物理材质 2D
  3. 选择新的物理材质 2D 并将 摩擦力 设置为 0
  4. 将该材料附加到玩家的刚体上

请注意,我们刚刚给出了指令,使玩家的刚体与其他碰撞体没有摩擦力,因此它将永远不会停止,除非有用户输入。但是根据您的代码和视频,这似乎不是问题。


这是我的性能分析器。有时它的帧率低于60FPS。https://i.ibb.co/rFtw3V6/Ekran-Resmi-2020-11-11-22-49-47.png 你认为这正常吗? - gurkan stack
@gurkanstack 请激活“深度分析”并查找性能分析器底部,确定您的延迟具体来自哪里... - derHugo

0

Harry的回答所述,您在帧率相关的Update()函数中应用力量可能会出现问题,您可以尝试将其移动到FixedUpdate()中。

否则,您可以尝试启用刚体的插值以隐藏抖动运动。您可以在检查器中执行此操作(请参见https://docs.unity3d.com/Manual/class-Rigidbody.html),也可以通过代码使用rb.interpolation来实现(请参见https://docs.unity3d.com/ScriptReference/Rigidbody-interpolation.html)。

(此外,编辑器有时会显示在独立构建中不存在的卡顿,但对我来说,这只发生在较大的项目中,并且不会频繁出现。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接