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

时间:2017-12-15 14:03:14

标签: c# performance unity3d

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

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

我遇到的问题是当你杀死动物时增加任务数量。

我有一个脚本(死)坐在每只动物上,当动物死亡时,它会在死亡剧本中调用一个公共功能。

从死亡脚本中,它应该在" 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;
    }

现在我只是根据死亡剧本的名字命名每只动物,但这并不是真正有效。

有谁知道更好的方法吗?

1 个答案:

答案 0 :(得分:8)

您可以使用Dictionary。将所有动物类型注册为字符串,然后使用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; });
}

你的新杀戮功能:

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执行此操作,但这不是必需的。