请使用C#委托/Action代替Unity的UnityEvent,它比Unity的事件更快。我几天前移植了
它。您只需要稍微修改一下就可以得到您想要的结果。
1.通过将所有Action声明更改为Action<float>来使Action接受float参数,这意味着它将允许具有float参数的函数。
2.现在,通过更改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);
}
}
}
测试:
public class Test : MonoBehaviour
{
void OnEnable()
{
EventManager.StartListening("OnPlayerTeleport", TeleportPlayer);
}
void OnDisable()
{
EventManager.StopListening("OnPlayerTeleport", TeleportPlayer);
}
void Update()
{
if (Input.GetButtonDown("Teleport"))
{
EventManager.TriggerEvent("OnPlayerTeleport", 5);
}
}
void TeleportPlayer(float h)
{
float yPos = transform.position.y;
yPos += h;
transform.position = new Vector3(transform.position.x, yPos, transform.position.z);
}
}
float
参数,一些具有string
参数,而另一些则没有参数怎么办? - Alexandr Kölnfloat height = 15.0f;
,然后在函数中我只需使用GameManager.instance.height
? 我的意思是,这样做会更快,对代码来说更优化吗? - Alexandr Köln