我刚开始用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
对象的指针,而不是一个字符串。
setMaterial()
有额外的重载,其中一些接受const char* name
参数而不是const Ptr<Material> &mat
参数。这些重载似乎在2.15中被删除了。这意味着您正在尝试使用的代码适用于较早版本的Unigine,而不是最新版本。
看来你从这个文档页复制了你的代码,这个文档页显然没有更新到最新的Unigine版本。显然,在最新版本中,从名称字符串中获取Material
对象现在涉及到另一个步骤。例如,通过调用Materials::findMaterial()
。或者,使用setMaterialPath()
代替setMaterial()
。
请查看升级到UNIGINE 2.15: API迁移:材料更改文档。