Unity - 关于孩子的Raycast不起作用

时间:2018-05-29 08:51:59

标签: c# unity3d

我想通过光线投影启用一些游戏对象。

我有一个主要对象,它将一个带有对撞机的儿童加入。这个Child包含一个文本,我希望在光线投射击中Child的对撞机时启用该文本​​。我试过下面的代码,但不起作用。如何通过光线投射访问孩子?

public class SeleccionarTesoro_LIST : MonoBehaviour {
    void Start()
    {
        GameObject[] hitObject = GameObject.FindGameObjectsWithTag("TESOROS");
    }

    public void SetHitObjectToActive(GameObject hitObject)
    {
        hitObject.transform.GetChild(0).GetChild(0).gameObject.SetActive (true);
        hitObject.transform.GetChild(0).GetChild(2).gameObject.SetActive (true);
    }

    void Update() {

        if (Input.GetMouseButtonDown (0)) 
        {
            RaycastHit hit;
            Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);

            if (Physics.Raycast (ray, out hit)) {
                SetHitObjectToActive (hit.collider.gameObject);
            } 
        }
    }

}

2 个答案:

答案 0 :(得分:2)

您正试图让hitObject的孩子像这样hitObject.transform.GetChild(0),但如果hitObject没有孩子,那么您的程序会抛出null exception,所以首先你必须检查你想要访问的是否存在,然后访问它。 例如:

public void SetHitObjectToActive(GameObject hitObject)
{
     if(hitObject.transform.childCount>0){
           GameObjectchild = child hitObject.transform.GetChild(0);
           if(GameObjectchild.childCount>0 ){
             GameObjectchild.GetChild(0).gameObject.SetActive (true);} 
     }
}

但总的来说,我认为如果你先检查一下你碰撞的物体是否是正确的物体,然后确保做你想做的事情,那就更好了

为此,您可以使用tagsnameslayers, 首先,如果您想使用标签,则将标签分配给您要指定的对象,例如敌人

 if (Physics.Raycast (ray, out hit)) {
    if( hit.collider.gameObject.tag  == "enemy" )
         {
            SetHitObjectToActive (hit.collider.gameObject);
        } 
 }

答案 1 :(得分:1)

根据您的评论,我认为您试图以错误的方式接触孩子。

首先使用名称调用每个gameObject。例如:

  • MainGameObject
  • ChildCapsule
  • ChildText

现在,要访问孩子,请执行以下操作:

public void SetHitObjectToActive(GameObject hitObject)
{
     hitObject.transform.Find("ChildCapsule").gameObject.transform.Find("ChildText").gameObject.SetActive (true);
}