Единство - Raycast на ребенка не работает - PullRequest
0 голосов
/ 29 мая 2018

Я хочу включить некоторые игровые объекты с raycast.

У меня есть главный объект, который содержит ребенка с коллайдером.Этот дочерний элемент содержит текст, который я хочу включить, когда коллайдер дочернего элемента поражен радиопередачей.Я пробовал с кодом ниже, но не работает.Как я могу получить доступ к ребенку с помощью raycast?

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 голосов
/ 29 мая 2018

Вы пытаетесь получить дочернего элемента 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);
        } 
 }
0 голосов
/ 29 мая 2018

Исходя из ваших комментариев, я полагаю, что вы пытаетесь связаться с ребенком неправильно.

Начните с того, что называете каждый игровой объект именем.Например:

  • MainGameObject
  • ChildCapsule
  • ChildText

Теперь, чтобы получить доступ к ребенку, сделайте так:

public void SetHitObjectToActive(GameObject hitObject)
{
     hitObject.transform.Find("ChildCapsule").gameObject.transform.Find("ChildText").gameObject.SetActive (true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...