我想通过光线投影启用一些游戏对象。
我有一个主要对象,它将一个带有对撞机的儿童加入。这个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);
}
}
}
}
答案 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);}
}
}
但总的来说,我认为如果你先检查一下你碰撞的物体是否是正确的物体,然后确保做你想做的事情,那就更好了
为此,您可以使用tags
或names
或layers
,
首先,如果您想使用标签,则将标签分配给您要指定的对象,例如敌人
if (Physics.Raycast (ray, out hit)) {
if( hit.collider.gameObject.tag == "enemy" )
{
SetHitObjectToActive (hit.collider.gameObject);
}
}
答案 1 :(得分:1)
根据您的评论,我认为您试图以错误的方式接触孩子。
首先使用名称调用每个gameObject。例如:
现在,要访问孩子,请执行以下操作:
public void SetHitObjectToActive(GameObject hitObject)
{
hitObject.transform.Find("ChildCapsule").gameObject.transform.Find("ChildText").gameObject.SetActive (true);
}