【问题标题】:Using OnClick Events to Change Scenes使用 OnClick 事件更改场景
【发布时间】: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 是一个很好的资源

标签: c# events unity3d delegates


【解决方案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();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多