2017-06-18 6 views
1

Der Versuch, einen UnityAction als Parameter für einen meiner Methoden zu senden, wie so:Pass Parameter mit UnityAction

public void PopulateConversationList(string [] fullConversation, string onLastPagePrompt, string npcName, int stage, UnityAction action) 
{ 
    conversations.Add(new Conversation(fullConversation, onLastPagePrompt, npcName, stage, action)); 
} 

dialogHolder.PopulateConversationList(stage1, "Okay", _name, 1, QuestManager.Instance().ActivateQuest); 

das funktioniert gut, aber jetzt möchte ich die folgende Aktion als Parameter zu übergeben:

public void ActivateQuest(int questId) 
{ 
    Debug.Log("This is the id: " + questId); 
} 

Allerdings wird es nicht funktionieren, wenn ich eine Aktion verwenden, die einen Parameter hat:

dialogHolder.PopulateConversationList(stage1, "Okay", _name, 1, QuestManager.Instance().ActivateQuest(2)); 

Die oben geben s Fehler: Cannot convert from void to UnityAction. Wie kann ich eine UnityAction mit einem Parameter als Parameter übergeben?

Ich nenne die Action im Gespräch wie folgt aus:

dialog.OnAccept(ConvList[i].onLastPagePrompt,() => 
{ 
    ConvList[i].action(); 
    dialog.Hide(); 
}); 

EDIT: Die Lösung, die ich mit endete gehen:

enter dialogHolder.PopulateConversationList(stage1, "Okay", _name, 1,() => 
    { 
     QuestManager.Instance().ActivateQuest(0); 
    }); 

So kann ich auch verschiedene Methoden aufrufen können. Hier

+0

Sie haben sich nicht einmal die 'testMethod' Funktion angesehen und auch wie' MyAction' deklariert wurde. Diese werden benötigt, um Ihnen zu helfen. – Programmer

+0

@Programmer Sorry, ich habe versucht, es lesbarer zu machen, schätze ich habe es nur noch schlimmer gemacht. Ich habe das Q bearbeitet. – Majs

Antwort

1

ist das Problem:

public void PopulateConversationList(string[] fullConversation, string onLastPagePrompt, string npcName, int stage, UnityAction action) 

Das action Argument keine Parameter akzeptiert, aber sie sind vorbei es eine Funktion, die einen Parameter benötigt:

public void ActivateQuest(int questId) 
{ 
    Debug.Log("This is the id: " + questId); 
} 

mit:

dialogHolder.PopulateConversationList(stage1, "Okay", _name, 1, QuestManager.Instance().ActivateQuest(2)); 

Beachten Sie die 2 an dieübergebenFunktion.


Passing Parameter UnityEvent ist nicht wirklich so einfach, wie man es erwarten würde. Sie müssen von UnityEvent ableiten und auch den Typ des Parameters angeben. In diesem Fall möchten Sie int übergeben. Sie müssen eine Klasse erstellen, die von UnityEvent mit int als generisch abgeleitet wird.

public class IntUnityEvent : UnityEvent<int>{}

Das IntUnityEvent action Variable kann dann um in Ihren Funktionen statt UnityAction action als Parameter übergeben werden.

Im Folgenden finden Sie eine vereinfachte und generische Lösung, die auch anderen hilft. Fügen Sie einfach Ihre anderen Parameter zur PopulateConversationList Funktion hinzu und Sie sollten gut gehen. Es ist gut kommentiert.

[System.Serializable] 
public class IntUnityEvent : UnityEvent<int> 
{ 
    public int intParam; 
} 

public IntUnityEvent uIntEvent; 

void Start() 
{ 
    //Create the parameter to pass to the function 
    if (uIntEvent == null) 
     uIntEvent = new IntUnityEvent(); 

    //Add the function to call 
    uIntEvent.AddListener(ActivateQuest); 

    //Set the parameter value to use 
    uIntEvent.intParam = 2; 

    //Pass the IntUnityEvent/UnityAction to a function 
    PopulateConversationList(uIntEvent); 
} 

public void PopulateConversationList(IntUnityEvent action) 
{ 
    //Test/Call the function 
    action.Invoke(action.intParam); 
} 

//The function to call 
public void ActivateQuest(int questId) 
{ 
    Debug.Log("This is the id: " + questId); 
} 

Hinweis:

Wenn möglich, vermeiden UnityEvent in Unity verwenden. Verwenden Sie C# Action und delegate, da sie einfacher zu verwenden sind. Außerdem sind sie viel schneller als Unity UnityEvent.

+0

Danke, Accepted cus es beantwortet meine Frage :) Ich landete meinen eigenen Weg, der es mir auch erlaubt, mehrere Methoden aufzurufen, die ich brauche. – Majs

+0

Großartig. Das ist in Ordnung, solange du es funktioniert hast. – Programmer