对象类型
TorqueObjectType是一个有效且方便的为特定目的创建对象的方法。例如,在一些策略游戏中,你可能会给一方的所有单位标记一个对象类型,给另一方的所有单位标记一个不同的对象类型,这样单位的人工智能(AI)就能够容易地区分出敌友。对象类型在碰撞中是非常非常重要的,因为它们允许你控制哪些对象之间可以互相发生碰撞(比如,你可能会想禁用相同类型之间的碰撞,这样就可以避免友军之间的伤害)。
使用对象类型
对象类型可以通过TorqueObjectDatabase以名字的方式获取。就像这样:
TorqueObjectType Rebel = TorqueObjectDatabase.Instance.GetObjectType("RebelAlliance"); TorqueObjectType Imperial = TorqueObjectDatabase.Instance.GetObjectType("GalacticEmpire"); TorqueObjectType Elite = TorqueObjectDatabase.Instance.GetObjectType("Elite");
对象数据库确保每一个类型都是独一无二的。当GetObjectType方法第一次“看见”一个特殊的名字时,它会创建一个新的TorqueObjectType对象,然后下次遇到同样的名字时,返回同样的类型。对象类型之上定义了一些简单的操作。假设我们拥有一些叫做SnubFighter, Commando, Trooper, 和 ImperialGuard的TorqueObject。我们可能会这样做:
SnubFighter.ObjectType += Rebel; Commando.ObjectType += Rebel; Commando.ObjectType += Elite; Trooper.ObjectType += Imperial; ImperialGuard += (Imperial + Elite);
设置对象类型是正确的,但是其中包含的信息只在它被使用时才有用。那么如果使用对象类型?有几种方法,让我们来看看这个例子:假设SnubFighter有一系列的人工智能组件,其中一个人工智能组件看起来可能像这个样子:
public List GetNearbyImperials() { TorqueObjectType Imperial = TorqueObjectDatabase.Instance.GetObjectType("GalacticeEmpire"); List ImperialUnits = new List(); T2DSceneGraph.Instance.FindObjects(_sceneObject.Position, 30.0, Imperial, (uint)0xFFFFFFFF, ImperialUnits); return ImperialUnits; }
FindObject方法让你能够通过匹配一些确定的参数比如位置来在场景图中查找对象。正如你看到的那样,其中一个搜索参数是对象类型(Imperial),这会使搜索范围大大缩小,如果这正是你期望的做法。
对象类型和碰撞
T2DcollisionComponent暴露了一个名叫CollidesWith的TorqueObjectType 属性。通过设定这个属性,不出意外,你将可以控制哪些对象类型之间可以发生碰撞:
TorqueObjectType ValidTarget = TorqueObjectDatabase.Instance.GetObjectType("ValidTarget"); ExhaustPort.ObjectType += ValidTarget; Torpedo.Collision.CollidesWith = ValidTarget;