c# – 将参数传递给UnityEvent
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 将参数传递给UnityEvent,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2992字,纯文字阅读大概需要5分钟。
内容图文
![c# – 将参数传递给UnityEvent](/upload/InfoBanner/zyjiaocheng/789/202c3f1dfb7b46b1bdb676a0b4edb912.jpg)
好的,我有点困惑.我通过this教程学习了UnityEvent和Messaging System.但我有一个问题,我无法理解.如何将参数传递给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");
}
}
但是,如果我想将’height’值传递给’TeleportPlayer’函数怎么办:
void TeleportPlayer (float h) {
float yPos = transform.position.y;
yPos += h;
transform.position = new Vector3 (transform.position.x, yPos, transform.position.z);
}
我怎样才能做到这一点?
解决方法:
使用C#delegate / Action而不是Unity的UnityEvent.它比Unity的活动更快.我几天前移植了it.您只需稍微修改一下即可获得所需内容.
1.通过将所有Action声明更改为Action< float>,使Action动作浮动这意味着它将允许具有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);
}
}
内容总结
以上是互联网集市为您收集整理的c# – 将参数传递给UnityEvent全部内容,希望文章能够帮你解决c# – 将参数传递给UnityEvent所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。