c# - 如何简化这一长串 if 语句?

标签 c# performance unity3d

我正在使用 Unity 制作游戏。我在游戏中有多个动物敌人。

我正在执行游戏中的任务,你必须杀死随机数量的随机动物,我已经有了。

我有一个问题是当你杀死一只动物时增加任务计数。

我在每只动物身上都安装了一个脚本(死),当动物死去时,它会调用死脚本中的一个公共(public)函数。

从死脚本中,它应该在“MissionHolder”脚本中增加一个 int 值,当您杀死动物时,所有动物都有一个 int 值要增加。

问题是当玩家杀死一只动物时我不知道哪只动物被杀死,我所做的是这样的:

public string Name;
public MissionHolder missionHolder;
    public void Kill()
{
    if (name == "Tiger")
    {
        missionHolder.Tiger += 1;
    }

    if (name == "Hyena")
    {
        missionHolder.Hyena += 1;
    }

    if (name == "Gorilla")
    {
        missionHolder.Gorilla += 1;
    }

    if (name == "Giraffe")
    {
        missionHolder.Giraffe += 1;
    }

    if (name == "Gazelle")
    {
        missionHolder.Gazelle += 1;
    }

等等

现在我只是用死脚本上的名字给每只动物命名,但这并不是很有效。

有谁知道更好的方法吗?

最佳答案

您可以使用字典。将所有动物类型注册为字符串,然后使用 Action 作为 StartAwake 函数中的值。 Action 将包含您当前在 if 语句中的所有名称。当你想杀死一只动物时,检查它是否在 Dictionary 中,然后执行 Action

public string Name;
public MissionHolder missionHolder;

Dictionary<string, Action> animalToAction = new Dictionary<string, Action>();

void Start()
{
    //Register and animal type and Action
    animalToAction.Add("Tiger", delegate { missionHolder.Tiger += 1; });
    animalToAction.Add("Hyena", delegate { missionHolder.Hyena += 1; });
    animalToAction.Add("Gorilla", delegate { missionHolder.Gorilla += 1; });
    animalToAction.Add("Giraffe", delegate { missionHolder.Giraffe += 1; });
    animalToAction.Add("Gazelle", delegate { missionHolder.Gazelle += 1; });
}

你的新 Kill 函数:

public void Kill()
{
    //If the name exists in the dictionary, execute the corresponding delegate
    Action action;

    if (animalToAction.TryGetValue(Name, out action))
    {
        //Execute the approprite code
        action();
    }
}

您可以使用 EventManager这样做,但这不是必需的。

关于c# - 如何简化这一长串 if 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47833958/

相关文章:

c# - 如何将 HtmlAgilityPack 添加到 Visual Studio 2010 项目中

c# - 如何从 XML 文件中获取所有文本节点

php - 在 MySQL 和 PHP 中进行计算

c# - Unity - GetComponentsInChildren<T>() 返回顺序

c# - 如何使用 StartCoroutine 在 7 秒内将变量值从 300 递增到 0 递增 1?

c# - 动态切换状态机 Unity C#

c# - 在 Fluent NHibernate 中处理与值类型的一对多关系

c++ - c++中std::min(int)的效率

c# - 如何提高数据库查询的性能?

c# - WCF 服务中的方法不返回任何内容