【问题标题】:Unity - How to call multiple parameters for UI Button with single stringUnity - 如何使用单个字符串调用 UI Button 的多个参数
【发布时间】:2021-04-20 04:29:01
【问题描述】:

Unity 按钮只能从检查器中获取一个参数,但我听说您可以使用单个字符串,然后需要将其拆分然后用作多个参数。我该怎么做?

例如,如果我把它放在一个用逗号分隔的字符串中:“John,Attack,1”(这基本上意味着对于名为 John 的角色,它将将该角色的攻击统计更改 +1)。所以它需要角色的名字,统计类型和数量作为参数。

我已经设置了方法,只需要一个示例和说明如何完成这样的事情。

编辑:根据 TEEBQNE 的建议,我能够让它工作,这就是我所做的。但如果您对代码有更好的方法或改进,请随时分享。

public void ChangeStat(string phrase)
    {
        string[] words = phrase.Split(',');

        //For the 3 parameters need: StringType:cName, EnumType:stat, intType:amount
        string cName = words[0];
        Stat stat = (Stat)System.Enum.Parse(typeof(Stat), words[1]);
        int amount = int.Parse(words[2]);

        //if the dictionary contains a valid character name then add the stat level
        if (CharacterDatabase.ContainsKey(cName))
        {
            //Save previous value
            int previousValue = CharacterDatabase[cName].Stats[stat];

            Debug.Log("Character found!");
            //Add the stat by the amount
            CharacterDatabase[cName].Stats[stat] += amount;
            Debug.Log(CharacterDatabase[cName].CharacterBase.Name + "'s " + stat + " level is now: " + CharacterDatabase[cName].Stats[stat] + "(Before: " + previousValue + " )");
            return;
        }
        //Else the character name was not valid in the dictionary DB
        else
        {
            Debug.Log("Character NOT found!");
            return;
        }
    }

【问题讨论】:

  • string.Split ?您可以将回调包装在 lambda/delegate 中,例如 button.onClick.AddListener(() => YourMethod(as, many, parameters, as, you, like)); .. 有点不清楚您到底在问什么
  • 很抱歉,我不确定如何描述它。 TEEBQNE 提供了一个有效的解决方案,我使用他的建议使用我所做的代码更新了我的帖子。希望查看该方法会清除它,我感谢其他建议和方法可以做到这一点。我也会尝试你提到的回调样式
  • 你肯定想去委托......基于字符串的东西总是......好吧,在性能、可读性、可维护性方面很糟糕......

标签: c# string unity3d split


【解决方案1】:

我相信您所指的是分隔符,它是一个字符或字符序列,用于定义重要数据之间的拆分。您可以将多个参数作为字符串添加到按钮中,也可以在代码中添加委托并从那里添加您想要的任何数据。

要在 C# 中将字符串拆分为一个字符,只需获取一个字符串数组并使用代码。

string[] words = phrase.Split(','); 

在您的示例中,您发布了"John,Attack,1",因此上述代码将执行的操作是将其转换为字符串数组,如 {John, Attack, 1}。那么 onClick 将只是一个字符串。当你进入 onClick 时,你应该知道数组中每个索引的类型,所以只需将它们转换回来。我会使用System.Convert.To[YourTypeHere](stringHere); 这里的问题是序列化类型(例如其他游戏对象或组件)更难。

要解释为按钮提供多参数功能的另一种方法,您可以在代码中添加所有数据。

// the button that triggers this
[SerializeField] private Button myButton = null;

// data to pass in - assigned in the inspector
[SerializeField] private GameObject obj = null;
[SerializeField] private string strObj = "";
[SerializeField] private int intObj = 0;


private void Start()
{
    myButton.onClick.AddListener(delegate{OurCallback(obj, strObj, intObj);});
}

// our actual onclick
private void OurCallback(GameObject obj, string str, int num)
{
    // code
}

当数据已经在代码中时,上面的方法将数据作为参数传递似乎有点多余。我能想到的一个用例是,如果管理器在其Start()Awake() 中分配某种Init() 函数中的参数,那么该按钮已经包含并保存了该数据,并且在它之后没有额外的工作设置好了。

如果您对任一实现有任何疑问,请告诉我。更多地了解您的情况有助于缩小效果更好的范围。

【讨论】:

  • 谢谢你,正是我需要的。再次阅读我更新的帖子,这就是我为使其正常工作所做的工作。如果您有其他建议,请告诉我,但这对我有用。
  • 我对 sn-p 的唯一真正反馈是考虑读入的数据是否永远不是您期望的类型。使用 int.parse 可能会失败,如果它无法解析为 int,则会引发异常。如果保证数据是 int,则没有问题,但如果有机会,则不会出于某种奇怪的原因。我建议使用TryParse
  • 我的一个问题是CharacterDatabase 是什么类型?它是否包含另一个包含其他字典的数据结构?
  • CharacterDatabase 是我所有角色的字典。基本上充当我的主要角色数据库,其中所有角色的所有内容都像 CRUD 操作一样进行管理,例如更改统计数据、从数据库中添加到派对/组以及从我的派对/组中删除角色等。该项目是一款基于回合制战斗的 rpg 类型游戏.
  • 如果字典以名称作为键,则不需要遍历任何列表。您只需要检查名称是否包含在字典中。它会立即告诉您它是否存在。您无需遍历任何列表。
猜你喜欢
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多