簡體   English   中英

如何在 Unity 中訪問兒童 object 中的車輪對撞機

[英]How to access wheel collider in a child object in Unity

在 Unity 中,我的玩家游戲對象有 4 個輪子,它們都包含輪子對撞機。 我想得到這些的rpm。

我編寫了這段代碼,但在第 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM