Call Houdini Engine in Unity | Unity中调用Houdini Engine

在Unity中调用Houdini Engine是可以的,不过如果直接拖进场景,然后bake,其实不太好管理的。mesh叫啥不太好控制。但是如果用代码调用Houdini Engine,就可以进行一系列自动化操作,而且不用担心手动操作管理混乱的问题。

HDA可以直接拖进场景。拖进去以后有一个HoudiniParms的组件,组件里显示的就是HDA的面板。


实例化HDA组件

用代码调用的话可以这样:


assetparm = GameObject.FindObjectOfType();
if (assetparm == null)
{
    string otlpath = "Assets/OTLs/" + hdaname + ".hda";
    HoudiniAssetUtility.instantiateAsset(otlpath);
    assetparm = GameObject.FindObjectOfType();
}

这就相当于把HDA拖进场景了。上面assetparm就是HoudiniParms组件,我们之后修改参数也是改它。

有几种参数:字符串,float,int/bool,gameobject

参数对应HDA里的一个参数ID,但是参数ID是多少一般看不出来,需要断点跟踪这个assetparm来看。找到参数id以后就好办了。

Mesh参数

如果是mesh(需要gameobject带meshfilter组件),下面这个40就是参数id


assetparm.prParmInputs[40].newInputObject = tempProxyMeshObj;
assetparm.prParmInputs[40].inputObject = tempProxyMeshObj;
assetparm.prLastChangedParmId = 40;
assetparm.prControl.onParmChange();

String参数

如果是string,还要断点查一下字符串的id,要用setParmStrings设置。之前还要实例化一个HAPI_ParmInfo,里面设置字符串id。下面的15是字符串id,43是参数id


HAPI_ParmInfo splatpathInfo = new HAPI_ParmInfo();
splatpathInfo.size = 1;
splatpathInfo.stringValuesIndex = 15;
assetparm.setParmStrings(splatpathInfo, new string[] { splatpath });
assetparm.prLastChangedParmId = 43;
assetparm.prControl.onParmChange();

Float/Int参数

如果是float或int,有prPramIntValue和prParmFloatValues两个property。当然值的id和整个参数的id也不一样,要断点查一下。下面的26/27是float的id。45是参数id。14是int的id。49是参数id。


assetparm.prParmFloatValues[26] = size.x;
assetparm.prParmFloatValues[27] = size.y;
assetparm.prLastChangedParmId = 45;
assetparm.prControl.onParmChange();
assetparm.prParmIntValues[14] = 1;
assetparm.prLastChangedParmId = 49;
assetparm.prControl.onParmChange();

最后build

还有,最后不要忘了调用一下buildall,万一onParmChange没搞定。


assetparm.GetComponent().prAsset.buildAll();
assetparm.GetComponent().prAsset.buildClientSide();

以上。

发表评论

电子邮件地址不会被公开。 必填项已用*标注