我是编程和Unity的新手,我正在开发一个简单的点击风格的游戏来学习两者的基础知识。我已经创建了几个场景: MainMenu,UI,1级和2级。在按下主菜单中的“开始”后,我正在加载UI和第一级。
在UI层,我有一个商店UI和其他我永远不想卸载的部分。在第一层和第二层,我有一些我只想在这些场景中使用的东西。
所以,我想要做的是,当我购买一件物品或升级到第一级时,我希望GameObject (精灵)被设置为活动的。
我尝试做的是在一个脚本中调用一个函数,这个脚本附加在第一级的GameObject中,这个脚本附加在UI场景中的一个购买按钮上,但是从我能够理解的是,如果游戏对象是在UI场景中分配的,它将被设置为活动的-所以整个事情基本上没有意义,我可以更容易地做到这一点。
1级场景中附加到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();
}
}
}
如果你对我吐出的场景或其他任何东西有任何评论,他们将非常受欢迎!
谢谢!
发布于 2020-06-12 03:35:05
有一点你需要注意,那就是你不能在一个场景中引用另一个场景中的对象。你可以引用相同的Prefab,但这是一个稍微不同的问题。
我发现一种有效的方法是这样做:
public class Work_Button : MonoBehaviour
{
public GameObject hubert12;
public void Awake ( )
{
Shop.Register ( this );
}
public void Huberd ( )
{
hubert12.SetActive ( true );
}
}
然后,您可以拥有一个具有实例和静态组件的Shop管理器。
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将进行检查,以确保注册了一个按钮。
这只是实现这一目标的众多方法中的一种。它也是最基本的基本实现。但到目前为止,我喜欢这种方法。对此进行扩展,您可以将注册项存储在一个字典集合中,并且可以在按钮被销毁(即OnDestroy )时执行一些清理/注销操作。
这里的假设是场景中只有一个Work_Button,否则您将需要一种方法来区分它们(即,使用am标识符作为关键字的字典)。
https://stackoverflow.com/questions/62332121
复制