【问题标题】:How to set a GameObject active on one scene form a button click function on second scene that is loaded additive C#, Unity如何在一个场景上设置一个活动的游戏对象形成一个按钮点击功能在第二个场景上加载附加 C#,Unity
【发布时间】:2020-09-07 00:47:57
【问题描述】:

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

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

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

我试图做的是在一个脚本中调用一个函数,该脚本从附加到 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


    【解决方案1】:

    您需要注意一些事情,那就是您不能在一个场景中引用一个对象,在另一个场景中。您可以引用相同的 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)。

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多