使用unigine版本2.5
unigine material卸载后,再装载材质, 当重新导入使用该材质的node文件,会发现材质无法与node中的mesh进行自动绑定。
两种方式可以解决这个问题。
1、将 node文件进行简单的解析,逐个mesh去设置材质。
NodePtr node = Editor::get()->getNodeByName("yyyy");
if (node.get())
{
NodeReferencePtr ref = NodeReference::cast(node);
NodePtr pa = ref->getReference();
int num = pa->getNumChildren();
pa = pa->getChild(pa->findChild("A380_MainBody"));
if (pa.get()) {
ObjectMeshStaticPtr mesh = ObjectMeshStatic::cast(pa);
int ret = mesh->setMaterial("A380_MainBody", 0);
mesh->setProperty("surface_base", 0);
}
}
2、通过World::loadAsyncNode 异步加载后再对节点进行clone
void destroyNode(NodePtr &node)
{
while (node->getNumChildren()>0)
{
NodePtr temp = node->getChild(0);
temp->grab();
destroyNode(temp);
node->removeChild(temp);
temp.destroy();
}
}
int AppWorldLogic::update() {
if (World::get()->checkAsyncNode(asyncNodeId))
{
NodePtr node = World::get()->getAsyncNode(asyncNodeId);
if (node.get())
{
znode = node->clone();
destroyNode(node);
node->grab();
node.destroy();
znode->grab();
}
}
if (App::get()->clearKeyState(' '))
{
asyncNodeId = World::get()->loadAsyncNode("nodes/plane.node");
}
else if (App::get()->clearKeyState(','))
{
destroyNode(znode);
znode.destroy();
Log::message("remove node\n");
}
else if (App::get()->clearKeyState('/'))
{
int ret = Materials::get()->load("uy.mat");
}
else if (App::get()->clearKeyState('.'))
{
Materials::get()->clear("uy.mat");
}
return 1;
}