C# Unity-Raycast on child不';行不通

C# Unity-Raycast on child不';行不通,c#,unity3d,C#,Unity3d,我想启用一些带有光线投射的游戏对象 我有一个主要的物体,它把一个孩子和一个对撞机结合在一起。该子对象包含一个文本,我希望在子对象的碰撞器被光线投射击中时启用该文本。我试过下面的代码,但不起作用。如何使用光线投射访问孩子 public class SeleccionarTesoro_LIST : MonoBehaviour { void Start() { GameObject[] hitObject = GameObject.FindGameObjectsWith

我想启用一些带有光线投射的游戏对象

我有一个主要的物体,它把一个孩子和一个对撞机结合在一起。该子对象包含一个文本,我希望在子对象的碰撞器被光线投射击中时启用该文本。我试过下面的代码,但不起作用。如何使用光线投射访问孩子

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);
            } 
        }
    }

}

根据你的评论,我认为你试图以错误的方式接近孩子

首先调用每个游戏对象的名称。例如:

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);} 
     }
}
  • 主要游戏对象
  • 儿童胶囊
  • 儿童文本
现在,要访问子对象,请执行以下操作:

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

您正试图像这样获取
hitObject
的子对象
hitObject.transform.GetChild(0)
,但是如果
hitObject
没有子对象,那么您的程序将抛出一个
null异常
,因此首先必须检查您要访问的对象是否存在,然后再访问它。 例如:

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);} 
     }
}
但总的来说,我认为最好先检查你碰撞的物体是否是正确的物体,然后确定你想做什么

为此,您可以使用
标记
名称
, 首先,如果要使用标记,请将标记指定给要指定的对象,例如:

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

如果我理解正确,请告诉我。您有一个带有子gameObject的gameObject。父游戏对象被禁用,并且您希望当光线投射击中子游戏时,父游戏对象被启用?如果我是对的,则问题可能是,如果父游戏对象未处于活动状态,您可能也无法检测到子游戏对象。@IgnacioLorre否,我有一个包含子游戏对象的父游戏对象。父对象启用了一个球体碰撞器,我可以使用lo增益点,而子对象启用了一个更大的胶囊碰撞器,可以用手指通过光线投射来触摸它以显示文本消息。上面的脚本放置在camera.Ok中。那么您想要的是,当孩子接触到光线投射时,您想要启用文本消息吗?或者你想启用什么?是的,当我接触到光线投射时,我想启用SetHitObjects以激活它。我是在父游戏对象而不是子游戏对象中访问文本消息的。我已经把它们按正确的顺序放好了,现在它可以正常工作了。谢谢你,伊格纳西奥!!!!嗨,伊格纳西奥!我发布了一个新问题。这是您可以帮助我的链接:。非常感谢@Angelsm我稍后再查