Godot加载GDNative库启动崩溃问题求助
Godot C++ GDNative 体素地形崩溃问题
我正在跟着某YouTube教程做Godot体素地形生成开发,用C++替代GDScript,进度到约7分08秒处。代码转译准确且编译正常,但打开项目时弹出错误:Godot Engine has stopped working. A problem caused the program to stop working correctly...。删除项目中的dll文件后可正常打开,此前官方的gdnative_cpp_example示例编译运行完全没问题。
运行Godot_v3.5.1-stable_win64_console.cmd替代可执行文件时,打印出以下错误:
ERROR: Another resource is loaded from path 'res://Chunk.gdns' (possible cyclic resource inclusion).
at: (core/resource.cpp:79)
chunk.h
#ifndef CHUNK_H #define CHUNK_H #include <vector> #include <Godot.hpp> #include <StaticBody.hpp> #include <SurfaceTool.hpp> #include <ArrayMesh.hpp> #include <Mesh.hpp> #include <MeshInstance.hpp> namespace godot { const Vector3 VERTICES[] = { Vector3(0, 0, 0), Vector3(1, 0, 0), Vector3(0, 1, 0), Vector3(1, 1, 0), Vector3(0, 0, 1), Vector3(1, 0, 1), Vector3(0, 1, 1), Vector3(1, 1, 1), }; const Vector3 DIMENSION = Vector3(16, 64, 16); const unsigned char TOP[] = {2, 3, 7, 6}; const unsigned char BOTTOM[] = {0, 4, 5, 1}; const unsigned char LEFT[] = {6, 4, 0, 2}; const unsigned char RIGHT[] = {3, 1, 5, 7}; const unsigned char FRONT[] = {7, 5, 4, 6}; const unsigned char BACK[] = {2, 0, 1, 3}; struct Block {}; class Chunk : public StaticBody { GODOT_CLASS(Chunk, StaticBody) private: std::vector<Block> blocks; SurfaceTool* st; ArrayMesh* mesh; MeshInstance* meshInstance; public: void Update(); void CreateBlock(const unsigned char x, const unsigned char y, const unsigned char z); void CreateFace(const unsigned char* indices, const unsigned char x, const unsigned char y, const unsigned char z); Chunk(); ~Chunk(); static void _register_methods(); void _init(); void _process(float delta); }; } #endif
chunk.cpp
#include "chunk.h" using namespace godot; void Chunk::_register_methods() { register_method("_process", &Chunk::_process); } Chunk::Chunk() {} Chunk::~Chunk() { delete st; delete mesh; delete meshInstance; } void Chunk::_init() { st = new SurfaceTool(); mesh = nullptr; meshInstance = nullptr; Update(); } void Chunk::_process(float delta) {} void Chunk::Update() { // Unload chunk if (meshInstance != nullptr) { meshInstance->call_deferred("queue_free"); meshInstance = nullptr; } mesh = new ArrayMesh(); meshInstance = new MeshInstance(); st->begin(Mesh::PRIMITIVE_TRIANGLES); for (unsigned char x = 0; x < DIMENSION.x; x++) { for (unsigned char y = 0; y < DIMENSION.y; y++) { for (unsigned char z = 0; z < DIMENSION.z; z++) { CreateBlock(x, y, z); } } } st->generate_normals(false); st->commit(mesh); meshInstance->set_mesh(mesh); add_child(meshInstance); meshInstance->create_trimesh_collision(); } void Chunk::CreateBlock(const unsigned char x, const unsigned char y, const unsigned char z) { CreateFace(TOP, x, y, z); CreateFace(BOTTOM, x, y, z); CreateFace(LEFT, x, y, z); CreateFace(RIGHT, x, y, z); CreateFace(BACK, x, y, z); CreateFace(FRONT, x, y, z); } void Chunk::CreateFace(const unsigned char* indices, const unsigned char x, const unsigned char y, const unsigned char z) { auto offset = Vector3(x, y, z); // Get corners auto a = VERTICES[indices[0]] + offset; auto b = VERTICES[indices[1]] + offset; auto c = VERTICES[indices[2]] + offset; auto d = VERTICES[indices[3]] + offset; PoolVector3Array triangleOne; triangleOne.push_back(a); triangleOne.push_back(b); triangleOne.push_back(c); PoolVector3Array triangleTwo; triangleTwo.push_back(a); triangleTwo.push_back(c); triangleTwo.push_back(d); st->add_triangle_fan(triangleOne); st->add_triangle_fan(triangleTwo); }
内容的提问来源于stack exchange,提问作者NaniNoni
相关产品推荐
相关产品推荐

