我想启用一些带有光线投射的游戏对象。
我有一个主要对象,它与对撞机一起重创了一个孩子。这个孩子包含一个文本,我想在孩子的对撞机被光线投射击中时启用该文本。我已经尝试使用下面的代码,但不起作用。如何通过光线投射访问孩子?
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);}
}
}
但总的来说,我认为最好先检查一下你与之碰撞的物体是否是正确的物体,然后确保做你想做的事
为此,您可以使用tags
或names
或layers
, 首先,如果要使用标签,则为要指定的对象分配标签,例如敌人
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);
}