Поместить ссылки на кнопку единства, чтобы я мог использовать функцию из другого скрипта - PullRequest
0 голосов
/ 28 марта 2019

Я сделал кнопочный префаб, который хочу использовать для улучшения здоровья моего игрока.У меня проблема с тем, что моя функция gainHealth находится в моем скрипте игрока, и я попытался сослаться на нее в моих addListeners.Я просто хочу, чтобы кнопка «Здоровье» давала игроку здоровье при нажатии, проблема в том, что эта кнопка является сборной.

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

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

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

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

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;
            }
        }
    }
}
0 голосов
/ 28 марта 2019

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

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 ()» (или как вы хотите ее назвать) в событие «При нажатии» кнопки в редакторе префабов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...