Как я могу выбрать юнит в Unity и активировать холст на нем? - PullRequest
0 голосов
/ 14 июля 2020

В настоящее время я работаю над пошаговой стратегией ie, и я хотел бы дать игроку больше информации о каждом отряде, который он получил.

Это Иерархия в Единстве ...

Код выглядит следующим образом:

    public void UnitSelection ()
    {
        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
        RaycastHit hit;
        if (Physics.Raycast (ray, out hit, Mathf.Infinity))
        {
            if (hit.collider.tag == "Unit Player 1")
            {
                // How can I select the Canvas from here + Canvas.SetActive(true)
            }
        }
    }

Я могу выбрать модуль с помощью мыши, но я не знаю, как добраться до холста на этом GameObject. Должен ли я работать с тегом (разве это не плохая практика?) Или другими методами?

Если вам нужна дополнительная информация, просто напишите ее в комментарии. Добавлю все необходимое.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

У вас есть несколько вариантов получения холста.

Первый

Получить холст напрямую (если коллайдер на объекте root), например:

public void UnitSelection ()
{
   Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
   RaycastHit hit;
   if (Physics.Raycast (ray, out hit, Mathf.Infinity))
   {
      if (hit.collider.tag == "Unit Player 1")
      {
         Canvas canv = hit.collider.GetComponentInChildren<Canvas>(true);
         canv.gameObject.SetActive(true);
         //or you can change only canvas state like this canv.enabled = true;
      }
   }
}

Второй:

Или вы можете прикрепить скрипт к своему модулю и изменить внутреннее состояние холста: Часть скрипта бота:

public class Bot : MonoBehaviour
{
    [SerializeField] private GameObject canvasObject;

    public void ChangeStateCanvas(bool state)
    {
        canvasObject.SetActive(state);
    }
}

Скрипт с изменением состояния холста:

public void UnitSelection ()
{
   Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
   RaycastHit hit;
   if (Physics.Raycast (ray, out hit, Mathf.Infinity))
   {
      if (hit.collider.tag == "Unit Player 1")
      {
         hit.collider.GetComponent<Bot>().ChangeStateCanvas(true);
      }
   }
}
1 голос
/ 14 июля 2020

Предполагая, что hit.collider является родительским объектом ArmoredBear_a06 из Canvas, вы можете использовать GetComponentInChildren

public void UnitSelection ()
{
    if (Physics.Raycast (Camera.main.ScreenPointToRay(Input.mousePosition), out var hit, Mathf.Infinity))
    {
        var hitCollider = hit.collider;

        if (hitCollider.CompareTag("Unit Player 1"))
        {
            // pass in true to also get inactive or disabled components
            var canvas = hitCollider.GetComponentInChildren<Canvas>(true);

            if(!canvas)
            {
                Debug.LogWarning($"Hitting {hitCollider.name} but no Canvas found in children"); 
                return;
            }

            canvas.gameObject.SetActive(true);
        }
    }
}

Или, альтернативно, если вы в любом случае знаете, что Canvas всегда является первым дочерним элементом, который вы можете использовать transform.GetChild

public void UnitSelection ()
{
    if (Physics.Raycast (Camera.main.ScreenPointToRay(Input.mousePosition), out var hit, Mathf.Infinity))
    {
        var hitCollider = hit.collider;

        if (hitCollider.CompareTag("Unit Player 1"))
        {
            var canvas = hitCollider.tramsform.GetChild(0);

            canvas.gameObject.SetActive(true);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...