【问题标题】:Change variables between scenes unity改变场景之间的变量统一
【发布时间】:2017-04-26 10:49:50
【问题描述】:

我有一个场景,我写下了我的球员统计数据。在下一个场景中(基本上在接下来的2个场景中但没关系)我想买一些武器并改变变量。

问题是我正在使用“DontDestroyOnLoad”保存对象,当我进入下一个场景时,我想知道如何更改变量。

第一个场景:

代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class statsTextsToDisplayAndChanges : MonoBehaviour
{
    public static statsTextsToDisplayAndChanges _INstance;
    buyWeapons bw;
    public Text m_LevelText;
    public Text m_AttackText;
    public Text m_DefendText;
    public Text m_MoneyText;
    public int level = 0;
    public int money = 500;
    public int health = 400;
    public int attack = 10;
    public int def = 5;
    string answer;
    string url = "http://alex3685.dx.am/display.php";


    public int sword1 = 200;


    public void Start()
    {

        _INstance = this;
        DontDestroyOnLoad(this.gameObject);

        display();

    }

    public void display()
    {


        m_LevelText.text = level.ToString();
        m_AttackText.text = attack.ToString();
        m_DefendText.text = def.ToString();
        m_MoneyText.text = money.ToString();
    }

    public void onPurchase()
    {
        if (money >= sword1)
        {
            Debug.Log("YOU BOUGHT IT");
            money -= sword1;
            //Destroy(GameObject.Find("playerStats"));
            display();
        }
    }

}

第二幕:

当我按下按钮时,购买功能中的 debug.log 有效,但文本中没有任何变化(从 500 个硬币 - 200 个硬币的剑 = 300 个硬币)。

有什么想法吗?

提前致谢。

【问题讨论】:

  • 请展示您迄今为止的研究/调试工作。请先阅读How to Ask页面。

标签: c# unity3d


【解决方案1】:

嗯....最初的想法:

这是您想要一个真正的经理对象并附加一个只知道如何存储相关统计数据的脚本的时候之一。

然后,在处理购买的任何脚本中,它们都有一个私有 GameObject 引用管理器对象。private GameObject _Manager;

但该对象存在于我的编辑器的另一个场景中,因此我无法拖放参考!

没问题, 假设具有存储统计信息的组件的对象称为"PlayerManager"。在 start() 方法中处理购买的脚本中添加:_Manager = gameobject.Find("PlayerManager");

现在您可以根据自己的喜好更改所有变量,当然前提是您已将管理器中的变量设置为公开,或者如果您更高级并关心健壮的代码,则可以使用正确的 get;set ;方法到位。

希望这有帮助!

【讨论】:

  • 哇它有帮助!现在当我按下购买时,我可以看到统计数据的变化!我现在还有一个问题。当我回到第一个场景(图 1)时,统计数据又回到了旧的stats i,ei 第一个和第二个有 500 个硬币,当我购买武器时,我有 300 个硬币。当我回到第一个场景时,我仍然有 500 个硬币。有什么想法吗?
  • 对不起,我的错。它不起作用。它起作用了,因为我不小心在第二个场景中复制了“playerstats”对象。当我删除它时,它不起作用。跨度>
  • 这就是你不使用场景的原因。您需要让 Manager 脚本检测实例何时已存在,如果存在,则自行销毁。
  • 德拉科说的。返回到较早场景的问题在于,它仍然表现得好像是第一次加载一样。 AKA,原始的 statObject 将与所有引用和脚本一起存在。所以可能在开始时有一个初始化场景,你永远不会回到并继续使用 dontDestroyOnload()。如果您想以破坏另一位经理的方式行事,那么您也需要一种方法来告诉谁是最老的顺便说一句。因此,您还应该跟踪管理器对象从一个场景移动到另一个场景的次数。并使用该统计数据来决定要销毁的对象。
  • Another swer 建议使用 payer preffs,但它们的存储方式使它们易于从外部源(黑客)编辑,因此取决于您的游戏范围是否应该使用它取决于.如果您不关心播放器是否可以更改值,请使用 playerPrefs。
【解决方案2】:

使用PlayerPrefs 保存和检索数据。

来源:https://docs.unity3d.com/ScriptReference/PlayerPrefs.html

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多