C# 如何使车轮网格渲染器位于车轮碰撞器位置

C# 如何使车轮网格渲染器位于车轮碰撞器位置,c#,unity3d,C#,Unity3d,我在弄清楚如何使车轮网格渲染器对象与车轮碰撞器对象匹配时遇到了一点困难。我在网上搜索了一下,找到了一些不同版本unity的简短答案 这是我目前的代码: 使用UnityEngine; 使用系统集合 public class Position : MonoBehaviour { public WheelCollider wc; public Transform tf; // Use this for initialization void Start () {

我在弄清楚如何使车轮网格渲染器对象与车轮碰撞器对象匹配时遇到了一点困难。我在网上搜索了一下,找到了一些不同版本unity的简短答案

这是我目前的代码:

使用UnityEngine; 使用系统集合

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);
公共类职位:单一行为{
公共车轮对撞机;
公共交通设施;
//用于初始化
无效开始(){
wc=GetComponent();
tf=GetComponent();
}
//每帧调用一次更新
无效更新(){
transform.position=新矢量3(tf.transform.position.x+(wc.suspensionDistance*100),tf.transform.position.y);

我知道如何实现这一点,请帮助!

我不认为您需要编写此解决方案,并在层次结构中正确设置组件

例如,在默认变换下,车轮碰撞器的半径为1(表示直径为2),以距离为单位。比例为1,1,1

我们还假设您有一个要使用的轮子的3d网格。例如,我们将说您以一定的比例导入了此模型,以便在使用默认变换放置到场景中时使用。比例为1,1,1-其半径为0.5距离单位(表示直径为2)

在这种情况下,您只需将WheelCollider放置在游戏对象上,并使该对象成为附加网格的另一个游戏对象的父对象。该子游戏对象的Transform.scale可以为2,2,2,并将视觉上与WheelCollider的半径gizmo匹配

对于您的解决方案,这些数字会有所不同。首先在场景中(视觉上)确定车轮碰撞器半径的大小,然后将其设置为车轮网格的父对象,并按该顺序应用变换。缩放


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

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

OP的代码是不好的,因为它把轮子放在了错误的位置(有时是对的,但通常是错的);而被接受的答案是错误的,因为它说你不需要代码来实现这一点

根据,您需要调用
GetWorldPose
,以获取轮子的姿势,然后您需要将该姿势转移到每个帧渲染轮子的对象上。(这意味着网格渲染器和碰撞器需要位于不同的对象上。)--层次结构本身不起作用,因为父对象的变换不会被车轮碰撞器修改(即,即使车轮正在反弹和旋转,它也将永远保持在0,0,0)

尽管如此,我还是建议采用公认答案中提出的相同层次结构,因为它使事情更易于管理:

  • 车辆
    • 车轮碰撞器1
      • 轮网渲染器1
    • 车轮碰撞器2
      • 车轮网格渲染器2
    • 等等
下面是一个单行为脚本示例,如果将其附加到每个
WheelMeshRenderer 35;
对象(根据上面的层次结构),该脚本将起作用:

私人车轮对撞机车轮对撞机;
私有void Start()
{
//一旦启动,在树上搜索最近的车轮碰撞机,
//并获取它的引用。
wheelCollider=GetComponentParent();
}
私有void FixedUpdate()
{
//每次物理更新,都会获得轮子在世界空间坐标中的姿势。
车轮对撞机。GetWorldPose(输出var pos,输出var rot);
//将该姿势应用于该对象的变换。
transform.position=pos;
旋转=旋转;
}

这个描述非常糟糕。我已经读了十几遍了,但我仍然不知道你想做什么。问题是什么"视觉非物理对象-模型?游戏对象的位置?为什么它需要匹配轮子悬挂距离的一个因子而不是半径?为什么位置偏移应用于任意变换而不是轮子的中心属性?@HappyApple我会改进它对不起:)@HappyApple你用过轮子碰撞器吗对撞机的位置是任意移动的——它不会更新对象的变换或对撞机的中心。如果能够使轮子的图形真实反映对撞机的位置,那就太好了。:-/谢谢,请附上一张层次结构的照片,我是unity的新手:)完成,请随意询问其他任何问题这似乎不正确。车轮碰撞器(以及儿童)的Y位置从未改变。悬架会导致车轮碰撞器四处弹跳,但不会在任何地方反射。
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;
}