Показать сообщение отдельно
Старый 21.09.2020, 10:07   #9
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Вызов гуя, есть проблемы.

Сорян, что с запозданием, я вижу примерно такой алгоритм работы (пишу прям в браузере, могут быть ошибки):


using UnityEngine;

//Скрипт, контролирующий ввод. Например можно повесить на камеру
public class InputManagerMonoBehaviour
{
      
// ссылка на скрипт, контролирующий UI юнита
      
public UnitUIController unitUI;

      
// юнит, выделенный последний раз 
      
private Unit selectedUnit;


      
void Start()
      {
           
unitUI.gameObject.SetActive(false);
      }

      
void Update()
      {
             
// ловим клик левой кнопкой мыши
             
if(Input.GetMouseButtonDown(0))
             {
                   
// рейкаст из точки клика
                   
Ray ray Camera.main.ScreenPointToRay(Input.mousePosition);
                   
RaycastHit hit;

                   
Unit unit null;

                   if (
Physics.Raycast(rayout hitfloat.MaxValue))
                   {
                           
// если кликнули по юниту, то должен быть компонент Unit
                           // иначе функция поиска вернет null
                           
unit hit.collider.gameObject.GetComponentInParent<Unit>();
                   }
                   
// обработка клика (нашли или не нашли юнита)
                   
OnMouseClicked(unit);
             }

      }


      
void OnMouseClicked(Unit unit)
      {
           
// если кликнули в пустоту или по тому же юниту, скрываем UI
           
if(unit == null || unit == selectedUnit)
           {
                 
selectedUnit null;
                 
HideUI();
           }
           else
           {
                 
// кликнули по новому юниту
                 
selectedUnit unit;
                 
ShowOrUpdateUI(unit);
           }
      }

       
// Скрываем интерфейс
       
void HideUI()
       {
             
unitUI.gameObject.SetActive(false);
       }


       
// отображаем или обновляем интерфейс
       
void ShowOrUpdateUI(Unit unit)
       {
              
unitUI.gameObject.SetActive(true);
              
unitUI.UpdateUI(unit);
       }
       


using UnityEngine;
using UnityEngine.UI;

//Скрипт, обновляющий UI на экране, в зависимости от того, какой юнит выбран.
// повесить на корневой объект диалога, отображаемого по клику на юнита
public class UnitUIControllerMonoBehaviour
{
       public 
Text unitName;

       private 
void Uint unit;

       public 
void UpdateUI(Unit unit)
       {
              
// сохраняем ссылку на выделенного юнита, для которого показывается UI, чтобы потом выполнять его функции
              
this.unit unit
              
// отображаем имя выделенного юнита
              
unitName.text unit.displayName;
              
// и другие свойства юнита
       
}

using UnityEngine;

// скрипт юнита (должен висеть на каждом юните)
public class UnitMonoBehaviour
{
       public 
string displayName;


       
// другая логика и параметры юнита

__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Crystal (21.09.2020), Randomize (21.09.2020)