首页 > 解决方案 > 如何在一个场景上设置一个活动的游戏对象,形成第二个场景上的按钮单击功能,该功能加载了添加剂 C#,Unity

问题描述

我是编码和 Unity 的新手,我正在开发一个简单的点击式游戏来学习两者的基础知识。我创建了几个场景:MainMenu、UI、1st level 和 2nd level。在主菜单中按“开始”后,我正在加载 UI 和第一级。

在 UI 层,我有一个商店 UI 和其他我不想卸载的部分。在第 1 层和第 2 层,我有一些我只想在那些场景中拥有的部分。

所以,我想做的是当我购买物品或升级第一级时,我希望将游戏对象(精灵)设置为活动状态。

我试图做的是在一个脚本中调用一个函数,该脚本从附加到 UI 场景中的购买按钮的脚本中附加到第一级的 GameObject,但是从我能够理解的弄乱它将设置如果在 UI 场景中分配了该游戏对象,则该游戏对象处于活动状态 - 所以整个事情基本上没有意义,我可以更轻松地做到这一点。

附加到第一级场景中游戏对象的脚本中的代码

public class Work_Button : MonoBehaviour
{
    public GameObject hubert12;

    public void Huberd()
    {
        hubert12.SetActive(true);
    }

}

UI 场景中附加到 GameObject 的脚本中的代码

public class Shop : MonoBehaviour
{
    public GameObject buyHubertOnebutton;
    public GameObject test;

    public void UnlockHubert1()
    {

        if (Global_Cash.CashCount >= 20)
        {
            Global_Cash.CashCount -= 20;
            buyHubertOnebutton.GetComponent<UnityEngine.UI.Button>().interactable = false;
            Work_Button sn = test.GetComponent<Work_Button>();
            sn.Huberd();           
        }

    }

}

如果您对我如何吐槽或其他任何事情有任何评论,他们将非常受欢迎!

谢谢!

标签: c#unity3d

解决方案


您需要注意一些事情,那就是您不能在一个场景中引用一个对象,在另一个场景中。你可以引用相同的 Prefab,但这是一个稍微不同的问题。

我发现有效的一种方法是做这样的事情:

public class Work_Button : MonoBehaviour
{
    public GameObject hubert12;

    public void Awake ( )
    {
        Shop.Register ( this );
    }

    public void Huberd ( )
    {
        hubert12.SetActive ( true );
    }
}

然后,您可以拥有一个具有实例和静态组件的 Shop manager。

public class Shop : MonoBehaviour
{
    // Static variables
    private static Work_Button _workButton;

    // Instance variables
    public GameObject buyHubertOnebutton;

    public static void Register ( Work_Button workButton )
    {
        _workButton = workButton;
    }

    public void UnlockHubert1 ( )
    {

        if ( Global_Cash.CashCount >= 20 )
        {
            Global_Cash.CashCount -= 20;
            buyHubertOnebutton.GetComponent<UnityEngine.UI.Button> ( ).interactable = false;
            if ( _workButton != null )
                _workButton.Huberd ( );
        }

    }
}

这可以通过让您的按钮在商店中注册来实现。因为我们在这里使用静态变量,所以我们不需要“找到” Shop 对象。实例方法 UnlockHubert1 将检查以确保已注册按钮。

这只是实现这一目标的众多方法之一。它也是最基本的基本实现。但截至目前,我喜欢这种方法。扩展这一点,您可以将已注册的项目存储在 Dictionary 集合中,并且您可以在按钮被销毁时进行一些清理/取消注册(即 OnDestroy )。

这里的假设是场景中只有一个 Work_Button,否则您需要一种方法来区分它们(即以 am 标识符为键的 Dictionary)。


推荐阅读