如何在 Unity 中访问子对象中的轮对撞机

问题描述

在 Unity 中,我的玩家游戏对象有 4 个轮子,并且所有轮子都包含轮对撞机。我想获得这些的转速。

我写了这段代码,但在第 33 行,它抛出了索引/参数越界异常,这意味着它试图用 'GetChild(i)' 访问的索引不可访问。 第 33 行是

 wColliders[i] = gameObject.transform.GetChild(i).gameObject.GetComponent<WheelCollider>();

我的播放器有 5 个子对象,其中 4 个有轮对撞机。怎么解决?

```
public class PlayerController : MonoBehaviour
 {

    //[SerializeField] private float speed = 10f;
    [SerializeField] private float speed;
    [SerializeField] private float rpm;
    private float totalRpm;
    [SerializeField] private float horsePower;
    [SerializeField] private float turnSpeed;
     public float horizontalInput;
     public float forwardInput;

    [SerializeField] private GameObject centerOfMass;
    [SerializeField] TextMeshProUGUI speedometerText;
    [SerializeField] TextMeshProUGUI rpmText;
    
    List<WheelCollider> wColliders;
    private Rigidbody playerRb;
    // Start is called before the first frame update
    void Start()
    {
        playerRb = GetComponent<Rigidbody>();

        playerRb.centerOfMass = centerOfMass.transform.position;

        wColliders = new List<WheelCollider>();
        for(int i = 0; i < 4; i++)
        {
            wColliders[i] = gameObject.transform.GetChild(i).gameObject.GetComponent<WheelCollider>();
        }
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        horizontalInput = Input.GetAxis("Horizontal");
        forwardInput = Input.GetAxis("Vertical");

        playerRb.AddRelativeForce(Vector3.forward * horsePower * forwardInput);
       
        transform.Rotate(Vector3.up,Time.deltaTime * turnSpeed * horizontalInput);

        speed = playerRb.velocity.magnitude;
        speed = Mathf.RoundToInt(speed);
        speedometerText.SetText("Speed: " + speed);

        for(int i = 0; i < wColliders.Count; i++)
        {
            totalRpm += wColliders[i].rpm;
        }

        rpm = Mathf.Round(totalRpm / wColliders.Count);

        rpmText.SetText("RPM: " + rpm);
    }
}

解决方法

你得到 IndexOutOfBoundsException 不是因为 Unity 没有找到孩子,而是因为你试图访问/设置

wColliders[i]

列表。尚未添加任何项目,因此您无法通过索引访问它们。


您宁愿使用 List<T>.Add

for(var i = 0; i < 4; i++)
{
    wColliders.Add(transform.GetChild(i).GetComponent<WheelCollider>());
}

或者实际上只是简单地使用 GetComponentsInChildren

wColliders = GetComponentsInChildren<WheelCollider>(true).ToList();

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...