需要一个函数来返回多种类型的游戏对象,我可以调用方法

本文关键字:游戏 类型 种类 对象 方法 调用 我可以 返回 函数 一个 | 更新日期: 2023-09-27 17:49:21

我想让一个函数返回一个通用的游戏对象,然后我可以调用一个方法。这行不通。

我的游戏世界中有不同的对象。我想有一个函数,我可以调用它将返回在给定位置找到的对象。然后,检查找到了什么类型的对象。我的每个对象都有一个返回对象类型的GetObjectType方法。

我非常感谢你给我的任何帮助。谢谢你的关注。
GameObject spotObjectLocation1;
spotObjectLocation1 = GetObjectAtLocation(player.transform.position 
                                          + checkDirection);
// THIS IS WHAT I WANT TO DO THAT DOESN'T WORK
if (spotObjectLocation1.GetObjectType() == "box"){  }
GameObject GetObjectAtLocation(Vector3 location)
{
    GameObject[] objects = GameObject.FindGameObjectsWithTag("boxes");
    for (int i = 0; i < objects.Length; i++)
    {
        if (objects[i].transform.position.x == location.x 
            && objects[i].transform.position.z == location.z)
        {
            return objects[i];
        }
    }
    GameObject[] objects = GameObject.FindGameObjectsWithTag("blocks");
    for (int i = 0; i < objects.Length; i++)
    {
        if (objects[i].transform.position.x == location.x 
            && objects[i].transform.position.z == location.z)
        {
            return objects[i];
        }
    }
}
public class ObjectBox : MonoBehaviour {    
    public string GetObjectType()
    {
        return "box";   
    }
}
public class ObjectBlock : MonoBehaviour {  
    public string GetObjectType()
    {
        return "block"; 
    }
}

需要一个函数来返回多种类型的游戏对象,我可以调用方法

到底是什么不起作用?

无论如何,使用适当的继承树和"as"操作符会更好。例如,让所有的box对象都继承自一个类box(如果有多个box对象):

public class Box : GameObject
{
    ...
}
public class ObjectBox : Box
{
    ...
}

然后你可以使用"as"操作符来确定GameObject是否是一个盒子:

GameObject spotObjectLocation1 = GetObjectAtLocation(player.transform.position + checkDirection);
Box b = spotObjectLocation1 as Box;
if (b != null)
    ...

同样,这种类型的代码有时用普通多态性处理会更好。想象一下,如果这个对象实际上是一个盒子,你会怎么处理它。对于其他类型的对象,您是否也想这样做?如果是这样,所有这些对象都继承自一个公共基类,该基类提供了派生类可能覆盖的虚拟或抽象方法。然后,客户端代码可以简单地通过基类调用这些方法,而不需要知道对象的实际类型。