Размещение ссылок на кнопку unity, чтобы я мог использовать функцию из другого скрипта

#c# #unity3d

#c# #unity3d

Вопрос:

Я создал сборную версию кнопки, которую хочу использовать для увеличения работоспособности моего плеера. С чем у меня проблема, так это с тем, что моя функция gainHealth находится в моем скрипте Player, и я пытался ссылаться на нее в моих addListeners. Я просто хочу, чтобы кнопка to Health при нажатии показывала работоспособность моего плеера, проблема в том, что эта кнопка является сборкой.

 void AddListeners()    
{
    itemButton.onClick.AddListener(() => GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerHealth>().GainHealth(50));
}

void OnTriggerEnter(Collider other)
{
    if(other.CompareTag("Player"))
    {
        for (int i = 0; i < inventory.slots.Length; i  )
        {
            if (inventory.isFull[i] == false)
            {
                inventory.isFull[i] = true;
                Instantiate(itemButton, inventory.slots[i].transform, false);
                AddListeners ();
                Destroy(gameObject);
                break;
            }
        }
    }
}
  

Ответ №1:

Вы можете поместить скрипт в свой сборный файл button и выглядеть примерно так.

 public PlayerHealth P_Health;

void Start()
{
    P_Health = GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerHealth>();
}
//Reference this action as Onclickevent through the Inspector inside your button
void OnMyClick()
{
    P_Health.GainHealth(50);
}
  

После создания экземпляра кнопки она сохранит ссылку на объект playerHealth и вызовет функцию «GainHealth» после нажатия кнопки.

Вы должны поместить функцию «OnMyClick()» (или как вам нравится называть ее) в событие нажатия кнопки в вашем сборном редакторе.

Ответ №2:

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

Пример, который должен сработать:

 public GameObject itemButtonPrefab; // drag your Prefab to this field in the inspector
public Button itemButton;  // the "real" instance of your prefab in the scene

void AddListeners()    
{
    itemButton.onClick.AddListener(() => GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerHealth>().GainHealth(50));
}

void OnTriggerEnter(Collider other)
{
    if(other.CompareTag("Player"))
    {
        for (int i = 0; i < inventory.slots.Length; i  )
        {
            if (inventory.isFull[i] == false)
            {
                inventory.isFull[i] = true;
                itemButton = Instantiate(itemButtonPrefab, inventory.slots[i].transform, false).GetComponent<Button>();
                AddListeners ();
                Destroy(gameObject);
                break;
            }
        }
    }
}
  

PS: Этот пример также должен сработать и является немного более производительным из-за того, что вам не нужно вызывать GetComponent-метод:

 public Button itemButtonPrefab; // drag your Prefab to this field in the inspector
public Button itemButton;  // the "real" instance of your prefab in the scene

void AddListeners()    
{
    itemButton.onClick.AddListener(() => GameObject.FindGameObjectWithTag("Player").GetComponent<PlayerHealth>().GainHealth(50));
}

void OnTriggerEnter(Collider other)
{
    if(other.CompareTag("Player"))
    {
        for (int i = 0; i < inventory.slots.Length; i  )
        {
            if (inventory.isFull[i] == false)
            {
                inventory.isFull[i] = true;
                itemButton = Instantiate(itemButtonPrefab, inventory.slots[i].transform, false);
                AddListeners ();
                Destroy(gameObject);
                break;
            }
        }
    }
}