【问题标题】:Returning a Single Type or List of Type?返回单个类型或类型列表?
【发布时间】:2019-08-26 20:05:25
【问题描述】:

所以,问题的要点是我在 Unity 中使用 GameObjects 进行编程。我想要一个返回三个不同对象的函数。出现的主要问题是其中两个是游戏对象列表,另一个只是单个游戏对象。解决此问题的最佳方法是什么?这是我当前的代码。

static List<GameObject> zombies;
static List<GameObject> humans;
static GameObject psgObject;

public const int HUMAN = 0;
public const int ZOMBIE = 1;
public const int PSG = 2;

public static object GetObject(int @object)
{
    switch(@object)
    {
        case HUMAN:
            return humans;
        case ZOMBIE:
            return zombies;
        case PSG:
            return psgObject;
        default:
            Debug.Log("GetObject() method error");
            return null;
    }
}

这段代码的尴尬之处在于,每当调用函数时,它都需要强制转换。我尝试使用动态类型,但 Unity 使用的编译器不支持动态类型。在这种情况下,您有什么建议?

【问题讨论】:

  • 解释一下psgObject是什么。
  • @Aybe 这是一个游戏对象,基本上是一个球体,如果人类没有靠近僵尸,他们就会追逐。
  • 好吧,您的方法的意图尚不清楚,您在什么情况下调用它?用游戏机制术语解释。
  • 这感觉像是设计问题而不是实现问题,但您可以只返回一个列表,其中包含您的对象作为单个项目。
  • @Aybe 基本上这是 GameManager 类,其中一切都被实例化(人类、僵尸、紫色荣耀球体)。人类、僵尸和 PSG 需要相互引用,因此 GameManger 有一个带有 int const 的静态方法 getter,以便于检索引用。例如,人类需要 PSG 和 Zombies 列表来知道僵尸在哪里并在它们靠近时逃跑,当然还需要 PSG 位置来知道在哪里找到和追逐它。

标签: c# unity3d types return return-type


【解决方案1】:

只需将您的单个 GameObject 变成一个列表,然后您将拥有相同的所有返回类型,即

public static List<GameObject> GetObject(int @object)
{
    switch(@object)
    {
        case HUMAN:
            return humans;
        case ZOMBIE:
            return zombies;
        case PSG:
            return new List<GameObject>() { psgObject };
        default:
            Debug.Log("GetObject() method error");
            return null;
    }
}

或者将psgObject静态变量改为列表直接返回。

PS:从设计的角度来看,最好有不同的方法GetHumansGetZombiesGetPSG,因为调用者必须已经能够区分它们。然后这个问题甚至没有出现。

【讨论】:

  • 这种方法的尴尬之处在于,每次你想访问 PSG 时,都必须使用它的第 0 个索引,对吧?我不确定这是否比只投一次更好的解决方案。此外,psg 永远不会有多个元素,所以从概念上讲,它只是一个列表,只是让它与返回类型匹配,这真的没有意义。
  • @Alex 是的;我已经编辑了答案(见 PS 部分)。这种方法可行吗?
  • 您只是在修复编译错误,而不是真正帮助 OP 解决他的问题。
  • @Aybe;据我了解,没有编译错误。
  • 你知道的。有时最简单的解决方案就是最好的解决方案,使用多个 getter 可能最有意义。也许让我失望的是类型的相似性,如果它们都是真正的 GameObject 列表,那么这可能是最好的解决方案,但三个 getter 可能是最有意义的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2012-06-09
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多