我是编码和Unity的新手,我正在研究一个简单的点击式游戏,以了解两者的基础。我创建了几个场景:MainMenu,UI,第一级和第二级。在主菜单中按“开始”后,我正在加载UI和第一级。
在UI层中,我有商店UI和其他我永远不想卸载的位。在第一级和第二级,我只想拥有那些场景上的位。
所以,我想做的是当我购买物品或升级到第一级时,我希望将GameObject(精灵)设置为活动状态。
[我试图做的是在一个脚本中调用一个函数,该脚本在第一个级别中从附加到UI场景中购买按钮的脚本中附加到GameObject的第一个级别,但是从我弄清楚它的过程中我可以理解如果在UI场景中分配了该游戏对象,它将将该游戏对象设置为活动状态-因此整个操作基本上是毫无意义的,我可以轻松得多。
第一级场景中附加到GameObject的脚本中的代码
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();
}
}
}
如果您有任何评论,以及我如何吐出场景或其他任何东西,我们将不胜感激!
谢谢!
您需要了解一些事情,那就是您不能引用另一个场景中的一个对象。您可以引用相同的Prefab,但这是一个稍微不同的问题。
我发现有效的一种方法是做这样的事情:
public class Work_Button : MonoBehaviour
{
public GameObject hubert12;
public void Awake ( )
{
Shop.Register ( this );
}
public void Huberd ( )
{
hubert12.SetActive ( true );
}
}
然后您可以拥有一个包含实例和静态组件的商店经理。
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(字典)。