Я столкнулся с неожиданным поведением в c #.Я в основном пытаюсь назначить действие для ref элемента другого действия, чтобы впоследствии я мог подписать / отписать методы для указанного действия .Я не хочу знать класс, который реализует упомянутое действие.
Проблема в том, что действие, которое должно указывать на действие, которое я хочу прослушать, похоже, на самом деле не указывает на него,Я думал, что он будет подниматься всякий раз, когда упоминается упомянутое действие, но, видимо, это не так.Может кто-нибудь сказать мне, что я делаю не так?Есть ли решение того, чего я пытаюсь достичь?
Я ценю любые ответы!
public class WaitForActionProcess : IProcess
{
public Action Finished { get; set; }
Action actionHandler;
public WaitForActionProcess(ref Action action)
{
actionHandler = action;
}
public void Play()
{
actionHandler += RaiseFinished;
}
public void RaiseFinished()
{
actionHandler -= RaiseFinished;
if(Finished != null)
{
Finished();
}
}
}
Пример использования:
public class ReturnToMainMenuFrame : TutorialEventFrame
{
[SerializeField]
TutorialDialogueData dialogueData;
[SerializeField]
PointingArrowData arrowData;
[SerializeField]
TutorialDialogue tutorialDialogue;
[SerializeField]
PointingArrow arrow;
[SerializeField]
MainView mainView;
public override void StartFrame()
{
frameProcesses.Add(new ShowPointToUIProcess(arrow, arrowData));
frameProcesses.Add(new ShowDialogueProcess(tutorialDialogue, dialogueData));
frameProcesses.Add(new WaitForActionProcess(ref mainView.OnViewShown));
frameProcesses.Add(new HideDialogueProcess(tutorialDialogue, this));
frameProcesses.Add(new HidePointToUIProcess(arrow,this));
base.StartFrame();
}
}
Реализация Frame Base:
public class TutorialEventFrame : MonoBehaviour {
public delegate void OnFrameEnded();
public event OnFrameEnded FrameEnded;
public List<IProcess> frameProcesses = new List<IProcess>();
public bool debugMode = false;
public virtual void StartFrame()
{
StartProcess(0);
}
void StartProcess(int processIndex)
{
if (processIndex < frameProcesses.Count)
{
int nextProcessIndex = processIndex + 1;
frameProcesses[processIndex].Finished += () => StartProcess(nextProcessIndex);
}
else
{
EndFrame();
return;
}
if (debugMode)
{
Debug.Log("Starting process: " + frameProcesses[processIndex] + " of processes: " + (processIndex + 1) + "/" + (frameProcesses.Count - 1) + " on frame: " + name);
}
frameProcesses[processIndex].Play();
}
public virtual void EndFrame() {
foreach (var process in frameProcesses)
{
process.Finished = null;
}
if (debugMode)
{
Debug.Log("frame: " + name + " finished");
}
frameProcesses.Clear();
if (FrameEnded != null) {
FrameEnded();
}
}
}