#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;
}
}
}
}