【问题标题】:Trying to make a Rigidbody2D face a target using AddTorque尝试使用 AddTorque 使 Rigidbody2D 面向目标
【发布时间】:2019-03-28 05:35:57
【问题描述】:

假设我在一个 2D 统一游戏中有一个玩家飞船和一个星球。我想让船的旋转相对于它正下方的表面下降(例如,如果船下面的表面部分是 80 度,那么船在该点上方时应该倾向于下降到 80 度)。

我目前有一个可以工作的代码:

    Vector2 direction = planet.position - transform.GetChild(0).position;
    float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg + 90;
    rig[0].AddTorque(-rig[0].rotation + angle);

它做我想要的,除了船的旋转从 360 过渡到 0 的地方,它会突然 360 翻转。我正在尝试弄清楚如何避免这种情况发生。

我不想为此使用LookAt(),因为这应该是趋向于目标方向的扭矩,而不是指向该方向的快速设置。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    我过去使用的一个粗略的解决方法是:

    创建 2 个对象并将它们设为玩家对象的子对象。

    将其中一个定位在本地 (-1,0,0) 并将其命名为 LeftObj。将另一个定位在 (1,0,0) 并将其命名为 RightObj。

    现在您可以简单地检查哪个更接近目标,以确定哪个是最有效的转弯方式。

    float LDist = Vector3.Distance(LeftObj.transform.position, target.transform.position);
    
    float RDist = Vector3.Distance(RightObj.transform.position, target.transform.position);
    
    if (LDist < RDist){
    
        // Turn left
    
    }else{
    
        // Turn right
    
    }
    

    不是最有效的方法,但设置起来简单快捷,无论旋转值如何,都能清楚地告诉您“左或右”。

    明显的缺点是当您靠近目标时,您无法获得旋转值来缩放扭矩,因此您可能需要增加播放器刚体上的“angularDrag”以消除一些卡顿。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 2012-09-11
      • 2021-08-12
      • 1970-01-01
      相关资源
      最近更新 更多