使用 OnClick 事件更改场景
Posted
技术标签:
【中文标题】使用 OnClick 事件更改场景【英文标题】:Using OnClick Events to Change Scenes 【发布时间】:2017-12-04 17:02:45 【问题描述】:我是事件和委托的新手,我无法在事物之间建立功能连接,特别是事件管理器以及事件如何连接到我的程序中的特定按钮。到目前为止,我已经创建了一些委托,然后我有一个应该订阅这些委托的类,但我不知道这个系统实际上是如何连接到不同场景的按钮的。我只需要有人帮我建立联系,这样我就可以看到一切是如何运作的。谢谢。
这是我的事件管理器类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Event_Manager : MonoBehaviour
public static Event_Manager evt = null; // create singleton
public delegate void GoToStartingSceneDelegate();
public static GoToStartingSceneDelegate onGoToStartingSceneDelegate;
public delegate void GoToSelectionSceneDelegate();
public static GoToSelectionSceneDelegate onGoToSelectionSceneDelegate;
public delegate void GoToColoringSceneDelegate();
public static GoToColoringSceneDelegate onGoToColoringSceneDelegate;
public delegate void GoToCaveSceneDelegate();
public static GoToCaveSceneDelegate onGoToCaveSceneDelegate;
private void Awake()
if (evt == null)
evt = this;
else if (evt != null)
Destroy(gameObject);
DontDestroyOnLoad(gameObject);
public static void OnStartGameButtonClick()
Debug.Log("Start Game");
if (onGoToStartingSceneDelegate != null)
onGoToStartingSceneDelegate();
public static void OnStartOverButtonClick()
Debug.Log("Start Over");
if (onGoToSelectionSceneDelegate != null)
onGoToSelectionSceneDelegate();
public static void OnSendAnimalButtonClick()
Debug.Log("Send Animal");
if (onGoToCaveSceneDelegate != null)
onGoToCaveSceneDelegate();
public static void OnPlayAgainButtonClick()
Debug.Log("Play Again");
if (onGoToStartingSceneDelegate != null)
onGoToStartingSceneDelegate();
这是我想要订阅这些事件的课程
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System.Collections;
using UnityEngine.UI.ProceduralImage;
public class LoadSceneButtonController : MonoBehaviour
[SerializeField] public Object startingScene;
[SerializeField] public Object selectionScene;
[SerializeField] public Object coloringScene;
[SerializeField] public Object caveScene;
GameObject transitionManager;
public GameObject touchToPlayButton;
public GameObject sendAnimalToForestButton;
public GameObject startOverButton;
private void OnEnable()
Event_Manager.onGoToStartingSceneDelegate += GoToStartingScene;
Event_Manager.onGoToSelectionSceneDelegate += GoToSelectionScene;
Event_Manager.onGoToColoringSceneDelegate += GoToColoringScene;
Event_Manager.onGoToCaveSceneDelegate += GoToCaveScene;
private void OnDisable()
Event_Manager.onGoToStartingSceneDelegate -= GoToStartingScene;
Event_Manager.onGoToSelectionSceneDelegate -= GoToSelectionScene;
Event_Manager.onGoToColoringSceneDelegate -= GoToColoringScene;
Event_Manager.onGoToCaveSceneDelegate -= GoToCaveScene;
void GoToStartingScene()
SceneManager.LoadScene(startingScene.name.ToString());
void GoToSelectionScene()
SceneManager.LoadScene(selectionScene.name.ToString());
void GoToColoringScene()
SceneManager.LoadScene(coloringScene.name.ToString());
void GoToCaveScene()
SceneManager.LoadScene(caveScene.name.ToString());
【问题讨论】:
这段代码你是怎么写的,但是还不懂Delegates / Events
google 搜索下面的C# Delegate Tutorial
和C# Events Tutorial
@MethodMan,我不知道,有时我只是不明白事情是如何运作的某些方面。
Google 是一个很好的资源
【参考方案1】:
您的代码不起作用,但问题与您的事件或委托无关。
问题在于您如何声明场景变量。不要为此使用UnityEngine.Object
。如果这样做,您只能将其转换为来自 UnityEditor
命名空间的 SceneAsset
。这意味着您的代码只能在具有AssetDatabase
类的编辑器中工作。
使用UnityEngine.SceneManagement
代替UnityEngine.Object
。您当前正在将Object.name
传递给SceneManager.LoadScene
函数,而Object.name
指的是对象的名称而不是场景名称。
全部替换:
[SerializeField] public Object startingScene;
[SerializeField] public Object selectionScene;
[SerializeField] public Object coloringScene;
[SerializeField] public Object caveScene;
与
public Scene startingScene;
public Scene selectionScene;
public Scene coloringScene;
public Scene caveScene;
Here 是一个简单的 Unity 事件和委托教程。我认为你不需要那个,因为你的那部分代码看起来不错。
至于将它连接到您的按钮,非常easy。只需订阅onClick.AddListener
按钮事件,并在有点击时通知Event_Manager
事件。
public Button startingButton;
public Button selectionButton;
public Button coloringButton;
public Button CaveButton;
void OnEnable()
//Register Button Events
startingButton.onClick.AddListener(() => buttonCallBack(startingButton));
selectionButton.onClick.AddListener(() => buttonCallBack(selectionButton));
coloringButton.onClick.AddListener(() => buttonCallBack(coloringButton));
CaveButton.onClick.AddListener(() => buttonCallBack(CaveButton));
private void buttonCallBack(Button buttonPressed)
if (buttonPressed == startingButton)
Debug.Log("Clicked: " + startingButton.name);
Event_Manager.OnStartGameButtonClick();
if (buttonPressed == selectionButton)
Debug.Log("Clicked: " + selectionButton.name);
Event_Manager.OnStartOverButtonClick();
if (buttonPressed == coloringButton)
Debug.Log("Clicked: " + coloringButton.name);
Event_Manager.OnSendAnimalButtonClick();
if (buttonPressed == CaveButton)
Debug.Log("Clicked: " + CaveButton.name);
Event_Manager.OnSendAnimalButtonClick();
【讨论】:
以上是关于使用 OnClick 事件更改场景的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 CSS3 更改具有不透明度过渡的图像以响应 onClick 事件?
单个 div 上的多个 onclick 事件 - 更改 div 边框颜色 - javascript