【问题标题】:Unity 2D C# weird movement behaviourUnity 2D C# 奇怪的运动行为
【发布时间】:2016-04-13 06:39:27
【问题描述】:

我正在用 C# 统一制作一个自上而下的 2D 游戏。目前刚刚开始设置运动,但我已经遇到了一个我无法解决的问题。游戏设置在一个网格中,我只是使用箭头键上下左右移动。这是我的脚本:

public class Player : MonoBehaviour 
{

    public float playerSpeed;

    void FixedUpdate()
    {
        // Movement
        if (transform.position.x < 0.25)
        {
            if (Input.GetKeyUp(KeyCode.RightArrow))
            {
                transform.position += new Vector3(playerSpeed, 0, 0);
            }         
        }
        if (transform.position.x > -0.3)
        {
            if (Input.GetKeyUp(KeyCode.LeftArrow))
            {
                transform.position += new Vector3(-playerSpeed, 0, 0);
            }
        }
        if (transform.position.y < 0.15)
        {
            if (Input.GetKeyUp(KeyCode.UpArrow))
            {
                transform.position += new Vector3(0, playerSpeed, 0);
            }
        }
        if (transform.position.y > -0.10)
        {
            if (Input.GetKeyUp(KeyCode.DownArrow))
            {
                transform.position += new Vector3(0, -playerSpeed, 0);
            }
        }
    }
}

每个方向的第一个 if 语句是确保玩家不会离开房间的边界。正在发生的烦人的事情是,在移动时,它以漂亮的平方数开始,如 0.050.10.15 等,但随后不知何故偏离了轨道并给出了像 -0.05000001、@987654326 这样的数字@、0.04999999,与想要的数字很接近,但不够准确。有任何想法吗?所有建议都表示赞赏。

【问题讨论】:

  • 不是因为浮点数的精度吗?我的意思是,0.0f 是否等于 0.000000001f ?
  • 双倍会更好吗?
  • 使用整数制作网格可能会更好。另外,Update 也可以。
  • @oscaro 这可能是因为统一的物理学。但是你为什么介意呢?
  • @DRKblade 有点烦人,因为我处理碰撞和其他事情的方式既愚蠢又低效。将对其进行更改以使其不愚蠢。

标签: c# unity3d 2d


【解决方案1】:
static void Main(string[] args)
{
  float wMyFloat = 1.5f;
  for(int i = 0; i < 100; i++)
  {
    wMyFloat += 0.1f;
  }


  Console.WriteLine(wMyFloat.ToString());
  Console.ReadLine();
}

除此之外,您会等于 11.5,但打印告诉您它等于 11.50001

+= float 和 float(或 double),你最终会得到一个偏移量。你也不能执行==11.5 != 11.50001

【讨论】:

    【解决方案2】:
    void FixedUpdate(){
            // Check to see if bounds left right
            if(transform.position.x < 0.25f && tranform.position.x > -0.3f){
                if (Input.GetKeyUp(KeyCode.RightArrow))
                {
                    transform.position += new Vector3(playerSpeed, 0, 0);
                }    
    
                else if (Input.GetKeyUp(KeyCode.LeftArrow))
                {
                    transform.position += new Vector3(-playerSpeed, 0, 0);
                }
            }
            // Check to see if bounds up and down
            if(transform.position.y < 0.15f && tranform.position.y > -0.1f){
                if (Input.GetKeyUp(KeyCode.UpArrow))
                {
                    transform.position += new Vector3(0, playerSpeed, 0);
                }
    
                else if (Input.GetKeyUp(KeyCode.DownArrow))
                {
                    transform.position += new Vector3(0, -playerSpeed, 0);
                }
    
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多