【问题标题】:Character freezes when it moves automatically角色自动移动时冻结
【发布时间】:2020-09-30 12:17:35
【问题描述】:

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

视频:

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 倍。

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

我努力解决我的问题,但我无法解决。

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

编辑:我的意思是角色不会连续移动。它离散移动。我的目的是让运动更顺畅。在计算机编程中,我知道不可能顺利地进行 %100 的运动,但是,用户不应该注意到“离散”运动。运动应该看起来更现实

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

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

EDIT2: 这是我的FPS。数值是正常还是异常?或者我们是否可以说“如果某些时候 FPS 低于 60,那么这个游戏的性能真的很差。FPS 应该总是等于或大于 60 才能说它的性能很好”?您认为?

【问题讨论】:

  • 从视频中,角色没有冻结。它在左右移动。还有,不要在ProcessInputs中给自己赋值moveSpeed而去掉moveDirection,你不要用。
  • 请仔细看,它不会这样移动。 youtube.com/watch?v=iigQd5FpWOM 在这段视频中,角色不停地左右移动。很顺利,但我的角色动作不顺畅,仔细看,你会看到的。
  • 很难在视频中看到您到底在说什么……一般来说:在处理刚体时,不要不要使用Transform 组件!您正在使用 transform.Rotate(0f, 180f, 0f); 这可能会破坏物理..而不是使用例如rb.MoveRotation(...) 通过物理引擎
  • 请激活Deep profile 并在分析器的底部找出您的滞后究竟来自哪里...
  • 不知道什么意思?我是新手!!我激活了,但似乎没有任何改变!

标签: c# android visual-studio unity3d


【解决方案1】:

首先,如果不起作用,请将移动代码放入 FixedUpdate 中继续阅读...

像运动这样的滞后可能不是来自实际滞后,因为这似乎是一个简单的统一项目,但首先,通过检查 stats 检查 fps 并检查统一的 profiler 如果你想要确定并了解如何优化游戏。

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

接下来统一检查所有类型的移动,有三种方法可以移动一个对象,而不会使其穿过墙壁:

第一个是通过设置速度,这是您选择的。

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

测试一下。

第三个是使用MovePosition,我不推荐,但你应该测试你是否喜欢这种运动方式。

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

测试一下。

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

如果这一切都不起作用,很可能与 Unity 的帧率/屏幕刷新率有关,甚至可能是我们的眼睛在欺骗我们。

【讨论】:

【解决方案2】:

Harry 在这里给出了很好的答案。除了他的提示,我建议你这样做:

  1. 去找检查员
  2. 在上面的工具栏上,转到 Assets > Create > Physics Material 2D
  3. 选择新的 Physics Material 2D 并将 Friction 设置为 0
  4. 将此材质附加到玩家的刚体上

请注意,我们只是给出了玩家的刚体与其他碰撞器没有摩擦的指令,因此它不会在没有用户输入的情况下停止。但是看看你的代码和视频,这不是问题

【讨论】:

【解决方案3】:

Harry's answer 中所述,您在依赖帧率的Update() 函数中施加力可能是个问题,您可以尝试将其移至FixedUpdate()

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

(此外,编辑器有时会显示在独立构建中不存在的口吃,但对我来说,这种情况只发生在较大的项目中,而且频率不高。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多