Ваш префаб кнопки может иметь скрипт, уже прикрепленный к объекту кнопки. В этом сценарии у вас будет метод c publi ClickBehaviour()
, который предварительно связан с OnClick.
Этот сценарий должен иметь метод delegate
, который можно установить извне из метода, называемого SetClickBehaviour
.
Делегат - это, в основном, переменная, в которой хранится функция с определенной сигнатурой. Таким образом, делегат void хранит функцию void. Вы можете назначить делегата определенной функцией. Когда вы вызываете делегат, как если бы он был реальной функцией, он фактически вызывает функцию, которую он хранит. Таким образом, вы можете поменять, какая функция на самом деле вызывается во время выполнения, изменив, какая функция хранится в делегате.
Таким образом, вы должны создать экземпляр префаба кнопки, а затем отправить ему поведение для связи с ним, вызвав newButton.SetClickBehaviour(methodToCall);
Так что SetClickBehaviour отвечает за изменение того, что хранится в делегате ..
Затем внутри ClickBehaviour вы вызываете метод делегата, который был установлен извне.
Итак, ClickBehaviour фактически вызывает этот делегат.
Button Spawner
using UnityEngine;
public class ButtonSpawner : MonoBehaviour
{
// Button Prefab
[SerializeField]
RuntimeButton RuntimeButtonPrefab = default;
// Where to create instantiated buttons
[SerializeField]
Canvas ParentCanvas = default;
void Start()
{
//Create Buttons
RuntimeButton newRuntimeButton1 = Instantiate(RuntimeButtonPrefab, ParentCanvas.transform);
newRuntimeButton1.SetClickBehaviour(MethodThatButton1ShouldDo);
RuntimeButton newRuntimeButton2 = Instantiate(RuntimeButtonPrefab, ParentCanvas.transform);
newRuntimeButton2.SetClickBehaviour(MethodThatButton2ShouldDo);
}
//These methods could be anything and from any other scripts
public void MethodThatButton1ShouldDo()
{
Debug.Log("Method for Button1 Worked!");
}
public void MethodThatButton2ShouldDo()
{
Debug.Log("Method for Button2 Worked!");;
}
}
Button Script
using System;
using UnityEngine;
//This class is attached to button
public class RuntimeButton : MonoBehaviour
{
//An action is just a kind of delegate.
Action clickBehaviour;
//This is called from another script to define what method gets called when button is clicked.
public void SetClickBehaviour(Action someMethodFromSomewhereElse)
{
clickBehaviour = someMethodFromSomewhereElse;
}
// This is linked in button inspector to the OnClick event.
public void ClickBehaviour()
{
clickBehaviour.Invoke();
}
}
В действии:
Одна вещь, которую нужно отметить а также: в вашем обновленном вопросе ваш скрипт отвечает за несколько вещей: заставить кнопку слушать, найти часть, прослушать щелчки, переместить камеры и «уйти». Это слишком много для одного сценария! Хорошей идеей будет разделить эти идеи на разные сценарии, каждый из которых несет только одну основную ответственность. Я считаю, что это часто помогает диагностировать проблемы и может предложить возможные решения. В моих примерах сценариев RuntimeButton отвечает только за захват OnClick и вызов его делегата. Неважно, что делает этот делегат.
ButtonSpawner отвечает только за кнопки вызова. В реальной программе два метода, которые передаются кнопкам, будут определенно находиться в отдельных скриптах, так как они не имеют ничего общего с порождающими кнопками. Я просто положил их туда для этого минимального примера.