我有一个脚本,该脚本的功能具有作为参数的接口。
public void Execute_IfPuzzleCompleted(IPuzzleMain mainScript);
但似乎该功能未在UnityEvent中显示。
答案 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()
{
}
如图所示,unityevent可以选择接口作为参数。 但请注意 它标记为动态。
在检查器中配置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的子类。