You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:05:33