unity3d 在Unity中对角移动平台时,如何防止物体滑动?

agyaoht7  于 2022-12-13  发布在  其他
关注(0)|答案(3)|浏览(239)

我尝试在Unity中实现一个简单的叉车。向左、向右、向上和向下移动都很好:Box stays in place
同时向左/右和上/下移动(箱子对角移动),箱子从货叉上滑落:Box is sliding off
有人有什么想法吗?
我已经试过了

  • 当拾取箱子时,使其成为叉车的子件
  • 为货叉和货箱添加具有高摩擦力的Physics Material 2D
  • 将箱子的x速度设置为叉车的x速度
  • 降低叉车的移动和提升速度
  • 减少项目设置中的固定时间临时值
  • 增加盒子的质量和重力比例

叉车和货箱都有一个附加了Body Type Dynamic和Collision Detection Continuous的刚体2D。
目前我正在移动叉车,代码如下:

private void FixedUpdate()
    {
        //Moving Left/Right
        if (moveRight)
        {
            timeElapsedDeceleration = 0;
            rb.velocity = new Vector2(Mathf.Lerp(rb.velocity.x, drivingSpeed, timeElapsedAcceleration / 2), rb.velocity.y);
            timeElapsedAcceleration += Time.fixedDeltaTime;
        }
        else if (moveLeft)
        {
            timeElapsedDeceleration = 0;
            rb.velocity = new Vector2(Mathf.Lerp(rb.velocity.x, -drivingSpeed, timeElapsedAcceleration / 2), rb.velocity.y);
            timeElapsedAcceleration += Time.fixedDeltaTime;
        }
        else
        {
            timeElapsedAcceleration = 0;
            rb.velocity = new Vector2(Mathf.Lerp(rb.velocity.x, 0, timeElapsedDeceleration / 2), rb.velocity.y);
            timeElapsedDeceleration += Time.fixedDeltaTime;
        }

        //Lifting
        if (moveForksUp && forks.transform.localPosition.y <= maxLiftHeight)
        {
            forks.transform.localPosition = new Vector2(forks.transform.localPosition.x, forks.transform.localPosition.y + liftingSpeed * Time.fixedDeltaTime);
            liftableMast.transform.localPosition = new Vector2(liftableMast.transform.localPosition.x, liftableMast.transform.localPosition.y + liftingSpeed / 1.5f * Time.fixedDeltaTime);
        }
        else if (moveForksDown && forks.transform.localPosition.y >= minLiftHeight)
        {
            forks.transform.localPosition = new Vector2(forks.transform.localPosition.x, forks.transform.localPosition.y - liftingSpeed * Time.fixedDeltaTime);
            liftableMast.transform.localPosition = new Vector2(liftableMast.transform.localPosition.x, liftableMast.transform.localPosition.y - liftingSpeed / 1.5f * Time.fixedDeltaTime);
        }
    }

在向左和向上同时移动时, Package 盒不应滑落。

x3naxklr

x3naxklr1#

我找到了一个解决方案,它是如何工作的。我现在正在用物理学上下移动叉子。
1.将Rigidbody 2D添加到Forks,将Type设置为“Dynamic”,使用非常高的质量(如100000),并将重力比例设置为0,这样它就不会受到质量为2的盒子的影响
1.如果你拿起盒子,把它放在叉子上。
1.如果箱子从叉子上福尔斯下来,请再次取出
左移/右移是相同的。对于上移/下移,请使用以下代码:

//Forks Up/Down
    if (moveUp)
    {
        rbForks.velocity = new Vector2(0, 100 * Time.deltaTime * liftingSpeed);

    }
    else if (moveDown)
    {
        rbForks.velocity = new Vector2(0, -100 * Time.deltaTime * liftingSpeed);
    }
9bfwbjaz

9bfwbjaz2#

在移动时,尝试将箱子设置为叉车前部的父对象,并禁用刚体,如下所示

if (isMoving)
      {
          box.trasform.parent = Lifter; 
          box.GetComponent<Rigidbody2D>().isKinematic = true;
      }
      else 
      {
          box.trasform.parent = null; 
          box.GetComponent<Rigidbody2D>().isKinematic = false;
      }
unftdfkk

unftdfkk3#

只需添加一个固定的关节2D组件到框,并连接到播放器,只要你想。
如果不起作用,则增加两个固定接头

相关问题