【问题标题】:How to prevent characters to overlap如何防止字符重叠
【发布时间】:2018-07-03 19:58:29
【问题描述】:

我真的在为一些我认为很简单的事情苦苦挣扎:我有两个从同一个预制件实例化的网格(战斗机),我希望它们不重叠。预制件设置有一个盒子碰撞器。理想情况下,我让动画师处理这个位置。我尝试了几种方法:

  1. 将动画师配置为“Animate Physics”。未检测到碰撞
  2. 取消选中根运动并使用游戏对象的变换位置移动角色。未检测到碰撞
  3. 取消选中根运动,为每个角色添加一个刚体并使用游戏对象的位置移动角色。检测到碰撞,但反应受物理控制,这使得它看起来不自然,因为我想要的只是避免角色相互穿过,即只是希望角色被推回,直到它们不再发生碰撞

我真的很想避免使用手动方法。我将如何防止这种重叠?

编辑:在盒子碰撞器上未设置 isTrigger

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    刚体是高度可配置的,您希望它可以提供一组有限的物理功能。使用您列举的第三个解决方案并冻结刚体中的旋转。详情请见the rigidbody page

    作为旁注,您可以考虑使用胶囊对撞机,以便角色更轻松地相互“滑动”。

    【讨论】:

    • 谢谢!我认为这让我更接近我的目标。所以我限制了旋转,现在感觉更自然了。但是,我仍然感觉物理引擎正在前进。在推动另一个角色时,我得到了一些意想不到的“跳跃”。我限制了 Y 位置,但我想这在执行跳跃时会很麻烦。此外,我似乎找不到避免不断推动另一个角色的方法,这也是我不想要的。
    • 另一件会引起问题的事情是如果您手动控制变换的位置。而不是做 transform.position= 你应该设置刚体的速度值以使它们移动(rigidbody.velocity=)。
    【解决方案2】:

    虽然不一定能防止重叠,但您可以为字符创建一个边界。这将是相当简单的取决于你在做什么。

    如果您想设置一个距离周长以防止字符彼此靠得太近,您可以使用以下等式

    Vector3 focalPOne = focalPointOfCharacterOne();
    Vector3 focalPTwo = focalPointOfCharacterTwo();
    
    float dx = focalPOne.x - focalPTwo.x;
    float dy = focalPOne.y - focalPTwo.y;
    float dz = focalPOne.z - focalPTwo.z;
    
    // calc distance along z plane
    if (Math.Sqrt((dx * dx) + (dy * dy)) < minDistance)
    {
        // person is too close to the others head.
        if (Math.abs(dz) < minHeightAbove)
        {
            // go to previous position.
        }
    
        // if there is no vertical elivation, you can go
        // straight to moving them back to previous position
    }
    enter code here
    

    如果这不是您要查找的内容,请告诉我,以便我编辑或删除它。

    创建的边界看起来像这样。

    【讨论】:

      【解决方案3】:

      为了让你的角色和他们各自的盒子碰撞器注册碰撞,两者都需要有一个 RigidBody 组件。考虑到角色共享一个预制件,这是确保角色不会相互穿过的唯一方法。

      您不必通过物理引擎处理角色的分离/拒绝。只需触发框碰撞器,然后使用 onTiggerEnter 通过 C# 脚本中的代码处理分离。

      有一个可以帮助您的碰撞检测矩阵,可在此处找到:https://docs.unity3d.com/Manual/CollidersOverview.html。这张图片也很好地总结了它(在文档中它出于某种原因在两个单独的表格中):

      【讨论】:

      • 感谢分享。这是非常有用的信息。
      • @mdonati 谢谢!请问我有没有机会获得赞成票或正确答案?
      • 考虑到我想避免手动操作,我需要尝试一下。给出我目前看到的选项,恐怕这是实现我想要的游戏玩法的唯一途径。您将如何通过代码处理分离?有什么可以指点我的参考吗?如果这两个不共享一个预制件也会有什么不同吗?
      • @mdonati,比较简单。您可以使用反复试验来获得您想要的确切行为,但基本是:使用选中 isTrigger 的框碰撞器,然后将带有 OnTriggerEnter 函数的脚本添加到游戏对象:docs.unity3d.com/ScriptReference/Collider.OnTriggerEnter.html 您在输入中获得另一个碰撞器。另一个碰撞器可能是另一个角色的盒子碰撞器(值得在预制件上添加标签,或使用层碰撞)。一旦你检测到另一个对撞机是另一个角色,你可以移动你自己的位置或另一个。
      • 真的很感谢你和我在一起。我最终使用了带约束的刚体,因为我真的不想弄乱碰撞分辨率,因为我将来可能需要添加更复杂的游戏玩法,比如角色跳过另一个角色之类的东西。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 2013-01-15
      • 2010-12-26
      • 2018-05-03
      • 1970-01-01
      相关资源
      最近更新 更多