好的,我有点困惑。我通过this教程研究了UnityEvent
和消息系统。但我有一个问题,我无法理解。如何将参数传递给Invoking函数?
例如(我在教程中有EventManager
):
void OnEnable() {
EventManager.StartListening ("OnPlayerTeleport", TeleportPlayer);
}
void OnDisable() {
EventManager.StopListening ("OnPlayerTeleport", TeleportPlayer);
}
void TeleportPlayer () {
float yPos = transform.position.y;
yPos += 20.0f;
transform.position = new Vector3 (transform.position.x, yPos, transform.position.z);
}
我有触发器:
void Update () {
if (Input.GetButtonDown ("Teleport")) {
EventManager.TriggerEvent ("OnPlayerTeleport");
}
}
但是,如果我想通过'身高'功能价值' TeleportPlayer':
void TeleportPlayer (float h) {
float yPos = transform.position.y;
yPos += h;
transform.position = new Vector3 (transform.position.x, yPos, transform.position.z);
}
我该怎么做?
答案 0 :(得分:3)
使用C#delegate / Action而不是Unity UnityEvent
。它比Unity的活动更快。几天前我移植了it。你只需稍微修改一下即可得到你想要的东西。
1 。通过将所有Action
声明更改为float
来Action
取Action<float>
这意味着它将允许{{1}的函数参数。
2 。现在,让float
函数采用TriggerEvent
参数。通过改变
float
到
public static void TriggerEvent(string eventName)
这是新的public static void TriggerEvent(string eventName, float h)
脚本。
EventManager
测试:
using UnityEngine;
using System.Collections.Generic;
using System;
public class EventManager : MonoBehaviour
{
private Dictionary<string, Action<float>> eventDictionary;
private static EventManager eventManager;
public static EventManager instance
{
get
{
if (!eventManager)
{
eventManager = FindObjectOfType(typeof(EventManager)) as EventManager;
if (!eventManager)
{
Debug.LogError("There needs to be one active EventManger script on a GameObject in your scene.");
}
else
{
eventManager.Init();
}
}
return eventManager;
}
}
void Init()
{
if (eventDictionary == null)
{
eventDictionary = new Dictionary<string, Action<float>>();
}
}
public static void StartListening(string eventName, Action<float> listener)
{
Action<float> thisEvent;
if (instance.eventDictionary.TryGetValue(eventName, out thisEvent))
{
thisEvent += listener;
}
else
{
thisEvent += listener;
instance.eventDictionary.Add(eventName, thisEvent);
}
}
public static void StopListening(string eventName, Action<float> listener)
{
if (eventManager == null) return;
Action<float> thisEvent;
if (instance.eventDictionary.TryGetValue(eventName, out thisEvent))
{
thisEvent -= listener;
}
}
public static void TriggerEvent(string eventName, float h)
{
Action<float> thisEvent = null;
if (instance.eventDictionary.TryGetValue(eventName, out thisEvent))
{
thisEvent.Invoke(h);
}
}
}