如何重启lua环境或重启引擎

如题,cocos-lua是否支持重启整个lua环境?
或者cocos引擎是否支持重启引擎?

1赞

这几天自己研究了下,发现如下方法可以:
将一下代码放在AppDelegate.cpp的 AppDelegate::AppDelegate() 上面

int register_all_packages();
int fix_restart_lua(lua_State * l);
bool regist_lua();

bool regist_lua()//这个函数为原来applicationDidFinishLaunching中内容
{
	// register lua module
	auto engine = LuaEngine::getInstance();
	ScriptEngineManager::getInstance()->setScriptEngine(engine);
	lua_State* L = engine->getLuaStack()->getLuaState();
	lua_module_register(L);

	register_all_packages();

	LuaStack* stack = engine->getLuaStack();
	stack->setXXTEAKeyAndSign("2dxLua", strlen("2dxLua"), "XXTEA", strlen("XXTEA"));

#if (COCOS2D_DEBUG > 0) && (CC_CODE_IDE_DEBUG_SUPPORT > 0)
	// NOTE:Please don't remove this call if you want to debug with Cocos Code IDE
	auto runtimeEngine = RuntimeEngine::getInstance();
	runtimeEngine->addRuntime(RuntimeLuaImpl::create(), kRuntimeEngineLua);
	runtimeEngine->start();
#else
	if (engine->executeScriptFile("src/main.lua"))
	{
		return false;
	}
#endif

	return true;
}

int fix_restart_lua(lua_State * l)
{
	cocos2d::log("fix_restart_lua");
	std::string key = "restart";
	CCDirector::getInstance()->getScheduler()->schedule([](float delta){//必须延迟执行,否则会报错
		ScriptEngineManager::getInstance()->removeScriptEngine();//把原来的luaEngine销毁
		ScriptHandlerMgr::destroyInstance();//把原理注册的函数ID清空
		regist_lua();//重新创建luaEngine
	}, CCDirector::getInstance()->getRunningScene(),0.1f,0,0.1f,false,key);
	
	return 1;
}

static int register_all_packages()
{//在lua中注册重启lua全局函数
	auto L = LuaEngine::getInstance()->getLuaStack()->getLuaState();
	lua_register(L, "fix_restart_lua", fix_restart_lua);
	return 1; //flag for packages manager
}

然后修改bool AppDelegate::applicationDidFinishLaunching()

bool AppDelegate::applicationDidFinishLaunching()
{
    // set default FPS
    Director::getInstance()->setAnimationInterval(1.0 / 60.0f);

	return regist_lua();
    
}

以上方法我测试过可以使用,如果大神看到后发现有什么隐患或其他不对的地方请指出。

大佬。。。
有没有不延迟的调用的方法啊???
这个看起来怪怪的。。。