团结 - 对孩子进行光线投射不起作用



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

我有一个主要对象,它与对撞机一起重创了一个孩子。这个孩子包含一个文本,我想在孩子的对撞机被光线投射击中时启用该文本。我已经尝试使用下面的代码,但不起作用。如何通过光线投射访问孩子?

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

您正在尝试像这样hitObject.transform.GetChild(0)获取hitObject的孩子,但是如果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);
} 
}

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

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

  • 主游戏对象
  • 儿童胶囊
  • 儿童文本

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

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

最新更新