我应该如何编写正确的 Switch 语句,以便所有对象不会一次实例化?



调用特定函数时,我正在加载资源。但是,所有对象都被实例化,而不仅仅是我需要的特定对象。我希望得到一些帮助来编写正确的开关语句。

这是我的代码。

if (File.Exists(objPath) == Resources.Load("BlueCube"))
{
//FileUtil.CopyFileOrDirectory(objPath, savePath);
GameObject instance = Instantiate(Resources.Load("BlueCube", typeof(GameObject))) as GameObject;
}
if (File.Exists(objPath) == Resources.Load("RedCube"))
{
GameObject instance = Instantiate(Resources.Load("RedCube", typeof(GameObject))) as GameObject;
}
if (File.Exists(objPath) == Resources.Load("GreenCube"))
{
GameObject instance = Instantiate(Resources.Load("GreenCube", typeof(GameObject))) as GameObject;
}
if (File.Exists(objPath) == Resources.Load("PurpleCube"))
{
GameObject instance = Instantiate(Resources.Load("PurpleCube", typeof(GameObject))) as GameObject;
}

在 if 语句中,您尝试将来自 File.Exists(objPath) 的布尔结果与来自 Resources.Load("Any") 的对象类型进行比较。

File.Exists(字符串路径)只是说文件是否存在。

Resources.Load("AnyCube") 在上下文中返回一个游戏对象。

哪些文件名通过 objPath 传递?你有一些示例名称吗?那么在这里展示一个真实的开关案例就更容易了。

我可以想象文件名具有应该作为资源加载到此处的名称。然后你可以用条件开关解决这个问题。

GameObject instance;
switch (objPath)
{ 
case string op when op.Contains("BlueCube"):
instance = Instantiate(Resources.Load("BlueCube", typeof(GameObject))) as GameObject;
break;
case string op when op.Contains("RedCube"):
instance = Instantiate(Resources.Load("RedCube", typeof(GameObject))) as GameObject;
break;
case string op when op.Contains("GreenCube"):
instance = Instantiate(Resources.Load("GreenCube", typeof(GameObject))) as GameObject;
break;
}

但是开关盒可以与示波器一起使用,但如果加载了更多不同的游戏对象,那么最好从开-关原则开始。

好吧...File.Exists(objPath)返回一个boolResources.Load("BlueCube")返回已加载的UnityEngine.Object,该具有隐式转换为bool

=> 可以同时true所有if条件

要使switch-case起作用,您需要有一些可以检查不同情况的东西。在您的情况下,您似乎想要实例化不同颜色的立方体。引入enum有助于提高可读性和可扩展性。

创建一个包含所有颜色的新枚举,您可以稍后轻松添加新颜色。接下来,而不是使用objectPath,您想使用该枚举。

假设您的函数当前如下所示:

private void InstantiateCubeAtPath(string objPath)

您希望将其更改为:

private void InstantiateCubeWithColor(CubeColor CubeColor.green)或任何您想要的颜色。您还需要将有关其颜色的信息添加到每个立方体。

在您的switch case中,您现在检查立方体颜色并从那里继续。

希望对您有所帮助!

最新更新