如何将轮子网格渲染器放置在Unity的WheelCollider位置

3
我有点难以弄清如何让轮子网格渲染对象与Wheelcollider对象相匹配。我在互联网上进行了搜索,并找到了几个针对不同版本的Unity的简短答案。
以下是我的当前代码: using UnityEngine; using System.Collections;
public class Position : MonoBehaviour {

    public WheelCollider wc;
    public Transform tf;

    // Use this for initialization
    void Start () {

        wc = GetComponent<WheelCollider> ();
        tf = GetComponent<Transform> ();

    }

    // Update is called once per frame
    void Update () {

        transform.position = new Vector3 (tf.transform.position.x + (wc.suspensionDistance * 100), tf.transform.position.y);

我不知道如何使它工作,请帮忙!


这个描述太糟糕了。我已经读了十几遍,但仍然不知道你想做什么。什么是“视觉非物理对象——模型?游戏对象的位置?为什么它需要匹配轮子悬架距离的因素而不是半径?为什么位置偏移被应用于任意变换而不是轮子的中心属性? - Happy Apple
1
@HappyApple 我会改进它,抱歉 :) - J.Clarke
@HappyApple,你有使用过轮子碰撞器吗?碰撞器的位置是任意移动的——它不会更新对象的变换或碰撞器的中心。能够使轮子的图形实际反映碰撞器的位置将是很好的。 :-/ - BrainSlugs83
2个回答

1

OP 的代码和被接受的答案都不正确。

OP 的代码有问题,因为它将车轮放在了错误的位置(有时是正确的,但通常是错误的);而被接受的答案是错误的,因为它说你不需要代码来实现这个。

根据Unity官方车轮碰撞器教程,你需要调用GetWorldPose来获取车轮的姿态,然后你需要每一帧将该姿态传递到呈现车轮的对象中。(这意味着 MeshRenderer 和 Collider 必须放在不同的对象上。)-- 仅仅使用层次结构是行不通的,因为父级的变换不会被车轮碰撞器修改(即使车轮在弹跳和旋转等情况下也会保持在0,0,0处)。

虽然我建议采用被接受答案中提出的相同层次结构,因为这样可以更容易地管理:

  • 车辆
    • 轮子碰撞器1
      • 轮子网格渲染器1
    • 轮子碰撞器2
      • 轮子网格渲染器2
    • 等等...

这是一个示例MonoBehavior脚本,如果您将其附加到每个WheelMeshRenderer#对象上(根据上面的层次结构),它将起作用:

private WheelCollider wheelCollider;
private void Start()
{
    // Once, at startup, search up the tree for the nearest wheel collider,
    // and grab a reference to it.
    wheelCollider = GetComponentInParent<WheelCollider>();
}

private void FixedUpdate()
{
    // Each physics update, get the pose of the wheel in World space coordinates.
    wheelCollider.GetWorldPose(out var pos, out var rot);

    // Apply that pose to this object's transform.
    transform.position = pos;
    transform.rotation = rot;
}

-1

我认为你不需要编写代码来解决这个问题,只需在层次结构中正确设置组件即可。WheelCollider-MeshRenderer Hierarchy

例如,假设你的WheelCollider半径为1(意味着直径为2),默认Transform.Scale为1,1,1。

还假设你有一个3D轮子网格模型,你想使用它。为了举例说明,我们假设你以一种比例导入了这个模型,使得当它与默认的Transform.Scale为1,1,1放置在场景中时,它占据了0.5距离单位的半径(意味着直径为2)。

在这种情况下,你可以简单地将WheelCollider放在一个游戏对象上并将该对象作为父对象的另一个游戏对象上附加网格。该子游戏对象可以具有2,2,2的Transform.scale,并且在视觉上与WheelCollider的半径图标匹配。

对于您的解决方案,这些数字将是不同的。首先在场景中(视觉上)决定WheelCollider半径的大小,然后将其作为父对象与您的车轮网格进行关联,并按照Transform.Scale的顺序应用。

请注意,之后更改WheelCollider的半径将不会缩放子游戏对象。


谢谢。你能否附上层级结构的照片,我对Unity还不熟悉 :) - J.Clarke
完成,如有其他问题,请随时提出 - Happy Apple
1
这似乎不正确。轮子碰撞器(以及其子物体)的Y位置从未改变。悬挂会导致轮子碰撞器四处弹跳,但这并没有反映在任何地方。 - BrainSlugs83

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接