1

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

我的游戏世界中有不同的对象。我想要一个可以调用的函数,它将返回在给定位置找到的对象。然后,检查找到什么类型的对象。我的每个对象都有一个返回对象类型的 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"; 
    }
}
4

1 回答 1

2

究竟是什么行不通?

无论如何,使用适当的继承树和“as”运算符会更好。例如,让您的所有盒子对象都继承自一个 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)
    ...

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

于 2012-12-21T08:15:19.213 回答