UnityEvent不接受带有接口作为参数的函数

时间:2018-08-08 06:05:45

标签: c# unity3d

我有一个脚本,该脚本的功能具有作为参数的接口。

PuzzleABCondition.cs

public void Execute_IfPuzzleCompleted(IPuzzleMain mainScript);

但似乎该功能未在UnityEvent中显示。

enter image description here

2 个答案:

答案 0 :(得分:1)

尝试使用脚本添加按钮操作

public Button btn;
void Start()
{
    btn.onClick.AddListener(delegate{  
           Execute_IfPuzzleCompleted(YourObjectHere);})
}

答案 1 :(得分:1)

我的统一版本为 2017.3 ,并在 Window10 上运行。使用跟随代码没问题。

在我的代码文件之一中:定义接口和事件。

        public interface TestPara { }
        [System.Serializable]
        public class TestInterfaceEvent : UnityEvent<TestPara>
        {

        }

在另一个文件中:使用TestInterfaceEvent并将其拖动到场景中的一个对象。

        public class TestClass : MonoBehaviourpublic
        {
           TestInterfaceEvent OnTestEvent;
        } 

在OnEventEffect.cs中定义了两个函数。

        public void Test(TestPara para)
        {
        }
        public void Test()
        {
        }

enter image description here 如图所示,unityevent可以选择接口作为参数。 但请注意 它标记为动态。 enter image description here

  

在检查器中配置UnityEvent时,有两种类型的   支持的功能调用:

     

静态。静态呼叫是预先配置的呼叫,具有在UI中设置的预先配置的值。这意味着调用回调函数时,将使用已输入到参数中的参数来调用目标函数。   用户界面。

     

动态。动态调用是使用从代码发送的参数来调用的,并且该参数绑定到正在使用的UnityEvent类型   调用。 UI过滤回调,仅显示动态调用   对于UnityEvent有效。

-------------------------------- UPDATE ----------- -------------------------------

更新原因如下: 我尝试了很多特殊情况,例如struct,enum或多个基本类型作为参数,它们都不在静态列表中显示。因此,我对结果感到困惑。经过数小时的研究,我找到了good answer形式的JoshuaMcKenzie来解决这些问题。

Unity的UnityEventBaseInspector类

//UnityEventBase has this field that it serializes
       PersistentCallGroup m_PersistentCalls;// holds a list of all the methods to call when the event is invoked

//and PersistentCallgroup has this
       List<PersistentCall> m_Calls;

//each PersistentCall has these fields
       UnityEventCallState m_CallState // an enum for off, editor and runtime, or runtime only
       PersistentListenerMode m_Mode // enum determining which internal delegate to call and which inputs to draw in inspector
       UnityEngine.Object m_Target // the instance which to call the method on
       string m_TypeName // the concrete type name of the target (needed for polymorphism)
       string m_MethodName // the name of the method to call in target

       ArgumentCache m_Arguments //container class which holds the arguments that are passed into the calling function, used for static calls

//ArgumentCache has the following variables
       UnityEngine.Object m_ObjectArgument
       string m_ObjectArgumentAssemblyTypeName // used to confirm if objectArgument is valid
       int m_IntArgument
       float m_FloatArgument
       string m_StringArgument
       bool m_BoolArgument
  正如您在ArgumentCache类中看到的那样,

  存储每种数据类型中的一种,当您真正了解   编辑器脚本,没有干净的方法来显示多个字段   有限的字段可用(不能显示任何函数(int,int)调用   例如,由于每个调用中只有一个intArgument字段)   ArgumentCache类。

对于自定义类,仅支持UnityEngine.Object的子类。