我如何修复我的setMaterial代码块上的无实例错误?



我刚开始用c++编程,并且正在做一些关于使用c++的教程,但是当我完成一部分代码时,我发现它是错误的:

没有重载函数的实例"Unigine::ObjectMeshDynamic" setMaterial"匹配参数

这是我的代码,即使我做了我应该做的,也许有什么我错过了,即使看了一遍又一遍(这是在unigine):

int AppWorldLogic::addMeshToScene(const char *file_name, const char *mesh_name, const char *material_name, Math::Vec3 position)
{
MeshPtr mesh = Mesh::create();
ObjectMeshDynamicPtr omd;
if (file_name)
{
if (!mesh->load(file_name))
{
Log::error("nError opening .mesh file!n");
mesh.clear();
return 0;
}
else omd = ObjectMeshDynamic::create(mesh);
}
else
{
mesh->addBoxSurface("box_surface", Math::vec3(0.5f));
omd = ObjectMeshDynamic::create(mesh);
}
// setting node material, name and position
omd->setMaterial(material_name, "*");
omd->setName(mesh_name);
omd->setWorldPosition(position);
Objects.append(omd);
Log::message("-> Object %s added to the scene. n", mesh_name);
mesh.clear();
return 1;
}

如果你阅读了Unigine的当前(2.15.1)setMaterial()(Unigine::ObjectMeshDynamic继承自Unigine::Object)的文档,你会看到它被重载,只接受以下参数:

void setMaterial ( const Ptr<Material> & mat, int surface )
void setMaterial ( const Ptr<Material> & mat, const char * pattern )

您正在尝试以2个字符串作为输入调用SetMaterial(),并且没有这样的过载可用,因此出现错误。

"*"是一个字符串字面值,它被实现为一个const char[2]数组,衰变成一个const char*。因此,您可以安全地将其传递给pattern参数。

但是,您试图将material_name变量(const char*字符串)传递给mat参数。const char*Ptr<Material>不兼容。setMaterial()需要一个指向Unigine::Material对象的指针,而不是一个字符串。

我查看了早期版本的文档,发现在2.15之前,setMaterial()有额外的重载,其中一些接受const char* name参数而不是const Ptr<Material> &mat参数。这些重载似乎在2.15中被删除了。这意味着您正在尝试使用的代码适用于较早版本的Unigine,而不是最新版本。

看来你从这个文档页复制了你的代码,这个文档页显然没有更新到最新的Unigine版本。显然,在最新版本中,从名称字符串中获取Material对象现在涉及到另一个步骤。例如,通过调用Materials::findMaterial()。或者,使用setMaterialPath()代替setMaterial()

请查看升级到UNIGINE 2.15: API迁移:材料更改文档。

最新更新