在上一教程中,我们创建了一个自定义Action,该Action会影响场景中任何刚体的重力设置。但是,它只适用于“编辑”模式下场景中存在的对象:它不适用于在游戏中实例化的prefab,也不适用于“ActionList”资源文件。我们现在将通过使用Constant ID来解决此问题。

Constant ID是Adventure Creator在场景之间跟踪游戏对象的方式。当Constant ID脚本附加到GameObject或Prefab时,它给自己分配了一个Constant ID号,我们可以将其合并到Action中。这将允许我们的Action在涉及资产文件时发挥作用。

当作为Assets的ActionList引用Scene中的对象时,就会自动给Scene内的对象附加Constant ID。因为Asset里面的ActionList绝大部分是为了在不同的场景中复用的,不同的场景引用不同的对象,有了Constant ID就能第一时间确定引用,但是我们的ActionGravity还不能支持这个功能,这就是这一节要添加的。

我们首先声明一个新的整数,将ID号记录下来:

1
2
3
public GameObject objectToAffect;
public bool newGravityState;
public int constantID;

当我们在ActionGravity面板上添加一个带有Rigidbody的对象时,我们希望自动添加一个ID号的引用,可以这样修改ShowGUI的代码:

1
2
3
4
5
6
7
8
9
public override void ShowGUI ()
{
// Action-specific Inspector GUI code here
objectToAffect = (GameObject)EditorGUILayout.ObjectField("GameObject to affect:", objectToAffect, typeof(GameObject), true);
newGravityState = EditorGUILayout.Toggle("New gravity state:", newGravityState);

constantID = FieldToID(objectToAffect, constantID);//先生成ID
objectToAffect = IDToField(objectToAffect, constantID, true);//根据生成的ID定位Field
}

这样我们的ActionGravity就能自动创建Constant ID了,我们将我们的ActionGravity放在一个Asset的ActionList里,然后引用一个场景里的对象的话,Constant ID便会自动创建。

自动创建ConstantID

最后,如果条件成立,我们将使用这个Constant ID号重新分配objectToAffect变量。我们可以插入一个新函数AssignValues,它将在运行Action之前被调用:

1
2
3
4
public override void AssignValues()
{
objectToAffect = AssignFile(constantID, objectToAffect);
}