使用 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 TutorialC# 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 事件更改场景的主要内容,如果未能解决你的问题,请参考以下文章

onClick事件更改类名反应js

如何使用 CSS3 更改具有不透明度过渡的图像以响应 onClick 事件?

在 React 中使用 onClick 更改元素内容

单个 div 上的多个 onclick 事件 - 更改 div 边框颜色 - javascript

更改 CSS 样式 onHover 和 onClick 事件

小技巧Unity UGUI 中使用脚本激活按钮onclick事件