【问题标题】:Unity (C#) - public variable won't work in one specific functionUnity (C#) - 公共变量在一个特定函数中不起作用
【发布时间】:2017-05-04 19:10:46
【问题描述】:

好的,所以我有一个名为 info 的变量,它属于我自己的类,称为 Kingdom Perk。它包含有关您可以添加到您的王国的每个不同升级的信息,并通过设置函数传递给脚本,并且在该函数中,公共变量“info”被分配给传入的内容。

在更新函数中,如果我写:

Debug.Log("Perk Name: " + info.Name);

它告诉我“Cannon”或“Walls”等

但如果我尝试在按下按钮时运行的函数中访问它,它会告诉我“信息”为空。

设置函数总是在按钮按下函数之前运行,并且相同的全局变量在更新函数中起作用,因为它总是告诉我正确的事情,它只是在这个函数中被破坏了。

感谢任何帮助,如果您需要更多详细信息,请询问

谢谢

编辑:不同的全局变量也仅在此函数中显示为 null。

编辑 2:

private KingdomPerk info;

public void Setup(KingdomPerk data)
{
    info = data;
    perkName.text = data.Name;
    perkType.text = "Type: " + data.Type.ToString();
    perkHealth.text = "Health: " + data.Health.ToString() + "HP";
    perkUpgradeCost.text = "Upgrade Cost: " + data.UpgradeCost.ToString();
    perkImage.sprite = data.Sprite;
}

public void UpgradeButtonPressed()
{
    float money = FindObjectOfType<MapGenerator>().worldInfo.money;

    if (money >= info.UpgradeCost && info.Level != info.MaxUpgradeLevel)
    {
        Debug.Log("We've got enough!");
        money -= info.UpgradeCost;
        info.DamagePerShot *= info.DamageMultiplier;
        info.Health *= info.HealthMultiplier;
        info.Level++;
        info.UpgradeCost *= info.CostMultiplier;
        info.FireRate *= info.FireRateMultiplier;
        RefreshInfo();
    }
    else if (money < info.UpgradeCost)
        Debug.Log("Get more money!");
    else if (info.Level == info.MaxUpgradeLevel)
        Debug.Log("Already max level!");
}

安装程序在这里调用,在不同的脚本中:

void RefreshListItems()
{
    ClearListItems();

    for (var i = 0; i < perks.Count; i++)
    {
        if (perks[i].UnlockLevel <= FindObjectOfType<MapGenerator>().worldInfo.playerLevel)
        {
            GameObject perkObject = Instantiate(itemPrefab);
            perkObject.transform.SetParent(scrollViewTransform);
            PerkListItem perkItem = perkObject.GetComponent<PerkListItem>();
            perkItem.Setup(perks[i]);
            upgradeGOList.Add(perkObject);
        }
    }
}

【问题讨论】:

  • 你能显示更多你的代码吗? IE。 info 在哪里初始化,在哪里使用,在哪里声明?目前没有足够的上下文来确定根本原因。
  • 好的,更新了,如果还有什么要告诉我
  • 您必须调用 Setup(KingdomPerk data) 函数并传入 KingdomPerk 的新实例才能初始化 info
  • 那么“信息”如何在除此之外的所有其他功能中起作用?
  • 抱歉,info 甚至不像您的标题和问题主体所说的那样是公共变量。它是一个私有变量。您可能正在访问另一个变量并认为它就是这个变量。

标签: c# unity3d


【解决方案1】:

已修复 - onclick 事件引用的是预制件上的脚本,而不是其实例化副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2023-04-09
    • 1970-01-01
    • 2014-03-13
    • 2018-05-22
    相关资源
    最近更新 更多