lua热更新怎么得到其他脚本的unity gameobjectt

lua代码热更新
最近在学习lua,准备在下一个游戏中使用lua作为逻辑部分的开发语言。
看中两点,一个是代码不用编译,且容易实现热更新,c++的代码在工程规模大了之后,编译速度很慢,经常是改了几行代码,就要等待长达10几,甚至几十分钟的编译时间。这点对开发速度影响较大。第二,c++程序容易挂。虽然在这个项目中,做到了几乎不挂,但是这其中的对开发人员的要求太高了。基于上面两点,打算在下一个游戏中使用脚本语言作为主要的逻辑开发语言,提高效率,降低人员要求。
切入正题。
lua热更新很简单,常用的有dofile,require等方法。这里只涉及require方法
------------------------------------------------
------------------------------------------------
require "liba"
require "libb"
--dofile("libb.lua")
--print(package.loaded["libb"])
--print("load liba success!")
print("M& ")
while true do
&&& line =
&&& if line ==
&&& elseif line
== "a" then
liba.a("YES")
&&& elseif line
== "b" then
liba.a("NO")()
&&& elseif line
== "reload a" then
package.loaded["liba"] = nil
&&& require
&&& elseif line
== "reload b" then
package.loaded["libb"] = nil
&&& require
&&& elseif line
== "v" then
liba.version()
&&& elseif line
== "c" then
liba.call("&&")
&&& elseif line
== "api" then
liba.api("nono")
----------------------------------------------------------------
----------------------------------------------------------------
function liba.version()
print("1.0.3")
function liba.api(data)
print(data)
function liba.call(d)
libb.echo(d)
function liba.a(d)
&&& return
libb.ec(d .. " 1.0.4")
return liba
------------------------------------------------------------
------------------------------------------------------------
function libb.echo(d)
&&& print("xx"
.. d .. "yy")
f = libb.echo("yes")
function libb.ec(d)
function he()
print("OK")
&&& local a =
function ha()
&&& return
return libb
需要注意一点,对于闭包函数的热更新。闭包函数中的upvalue的更新是个麻烦的问题,要么就禁止这样的写法,要么就在把所有这些函数都放入全局的列表,使用的地方引用全局列表中的项,在更新的时候,把全局表中内容修改后,再修改使用地方的引用项。这个过程还是有点麻烦的。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。本文转载于:&
什么是热更新
所谓的热更新,指的是客户端的更新。
大致的流程是,客户端在启动后访问更新的URL接口,根据更新接口的反馈,下载更新资源,然后使用新的资源启动客户端,或者直接使用新资源不重启客户端。
热更新代码使用到的场景
情人节快到了,你想要组织一个游戏内活动,错过时机肯定是你最不想要看到的结果。
当你发现一个严重的bug。
当你想要添加一些新的场景或者关卡来延长游戏的生命。
以及非常多其他的情况...
在Cocos2d-x引擎中的如何实现热更新
LuaEngine是一个脚本能够实时运行Lua脚本的对象,也就是因为有了LuaEngine这个C++类对象,所以才有了实现热更新技术的基础
获取LuaEngine脚本引擎的对象。
//获取LuaEngine引擎脚本类的单例对象
LuaEngine *engine = LuaEngine::getInstance();
//设置该单例对象作为脚本引擎管理器对象的脚本引擎
ScriptEngineManager::getInstance()-&setScriptEngine(engine);
使用LuaEngine执行Lua字符串脚本
//使用Lua脚本引擎执行Lua字符串脚本
engine-&executeString("print(\"Hello 蓝鸥\")");
使用LuaEngine执行Lua文件脚本
//获取储存的文件路径
std::string path = FileUtils::getInstance()-&getWritablePath();
path += "hellolanou.lua";
//创建一个文件指针
//路径、模式
FILE* file = fopen(path.c_str(), "w");
if (file) {
fputs("print (\"蓝鸥!!!\")", file);
fclose(file);
CCLOG("save file error.");
//使用Lua脚本引擎执行Lua文件脚本
engine-&executeScriptFile(path.c_str());
lua_State,可以认为是&脚本上下文&,主要包括当前Lua脚本环境的运行状态信息,还会有GC相关的信息。
在使用cocos2d-x引擎开发时需要使用Lua,那么就需要连接到libcocos2d和libluacocos2d两个静态库。
也就是要在lua_State对象中注册对应的功能模块类,如果不想要使用里边相应的模块时,就可以在luamoduleregister.h中注释掉对应的一行代码。
int lua_module_register(lua_State* L)
//注册cocosdenshion模块
register_cocosdenshion_module(L);
//注册network网络模块
register_network_module(L);
#if CC_USE_CCBUILDER
//注册cocosbuilder模块
register_cocosbuilder_module(L);
#if CC_USE_CCSTUDIO
//注册coccostudio模块
register_cocostudio_module(L);
//注册ui模块
register_ui_moudle(L);
//注册extension模块
register_extension_module(L);
#if CC_USE_SPINE
//注册spine模块
register_spine_module(L);
#if CC_USE_3D
//注册3d模块
register_cocos3d_module(L);
//注册音频audio模块
register_audioengine_module(L);
在使用cocos2d-x引擎时需要使用quick框架时,同样需要在lua_State注册quick框架的对应模块。
static void quick_module_register(lua_State *L)
luaopen_lua_extensions_more(L);
lua_getglobal(L, "_G");
if (lua_istable(L, -1))//stack:...,_G,
register_all_quick_manual(L);
luaopen_cocos2dx_extra_luabinding(L);
register_all_cocos2dx_extension_filter(L);
luaopen_HelperFunc_luabinding(L);
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
luaopen_cocos2dx_extra_ios_iap_luabinding(L);
lua_pop(L, 1);
通常情况下每一个lua_State对象就对应一个LuaStack。
使用到的相关代码
//使用LuaEngine对象获取Lua的函数栈
LuaStack* stack = engine-&getLuaStack();
#if ANYSDK_DEFINE & 0
lua_getglobal(stack-&getLuaState(), "_G");
tolua_anysdk_open(stack-&getLuaState());
tolua_anysdk_manual_open(stack-&getLuaState());
lua_pop(stack-&getLuaState(), 1);
//设置加密用的密钥
stack-&setXXTEAKeyAndSign("2dxLua", strlen("2dxLua"), "XXTEA", strlen("XXTEA"));
AssetsManager
资源管理器的诞生就是为了在游戏运行时能够完成资源热更新的技术而设计的。
这里的资源可以是图片,音频甚至是游戏的脚本本身。
使用资源管理器,你将可以上传新的资源到你的服务器,你的游戏会跟踪远程服务器上的修改,将新的资源下载到用户的设备上并在游戏中使用新的资源。
这样的话,一个全新的设计,全新的游戏体验甚至全新的游戏内容就可以立刻被推送到用户的受伤。
更加重要的是,我们并不需要针对各个渠道去重新打包我们的应用程序并且经历痛苦的应用审核,这个过程中没有任何成本!
创建AssetsManager对象
static AssetsManager *assetManager = NULL;
if (!assetManager) {
/*创建AssetsManager对象
*@param 资源包的下载路径
*@param 资源包的当前版本
*@param 资源包下载后的存储路径
assetManager = new AssetsManager(
"/game/cocos/teacher/test/src.zip",
"/game/cocos/teacher/test/version.php",
_pathToSave.c_str());
//设置AssetsManager对象的回调对象
assetManager-&setDelegate(this);
//设置AssetsManager对象的timeout时间
assetManager-&setConnectionTimeout(3);
AssetsManagerDelegateProtocol
AssetsManagerDelegateProtocal是一个类接口,主要用来封装下载过程中的回调接口。
class AssetsManagerDelegateProtocol
virtual ~AssetsManagerDelegateProtocol(){};
/* @brief Call back function for error
@param errorCode Type of error
virtual void onError(AssetsManager::ErrorCode errorCode) {};
/** @brief Call back function for recording downloading percent
@param percent How much percent downloaded
This call back function just for recording downloading percent.
AssetsManager will do some other thing after downloading, you should
write code in onSuccess() after downloading.
virtual void onProgress(int percent) {};
/** @brief Call back function for success
virtual void onSuccess() {};
那么接下来,我们使用AssetsManager来创建一个自动更新的类Update.
Created by 蓝鸥.
#ifndef __hello__Update__
#define __hello__Update__
#include &stdio.h&
#include "cocos2d.h"
#include "extensions/cocos-ext.h"
class Update:public cocos2d::Layer,public cocos2d::extension::AssetsManagerDelegateProtocol
virtual ~Update();
virtual bool init();
void update(cocos2d::Ref *pSender);
void reset(cocos2d::Ref *pSender);
//继承的回调函数
virtual void onError(cocos2d::extension::AssetsManager::ErrorCode errorCode);
virtual void onProgress(int percent);
virtual void onSuccess();
CREATE_FUNC(Update);
cocos2d::extension::AssetsManager *getAssetsManager();
//创建下载到的目录路径
void initDownloadDir();
std::string _pathToS
//用来显示下载进度的Label标签
cocos2d::Label *_showDownloadI
#endif /* defined(__hello__Update__) */
Update.cpp
Update.cpp
Created by 蓝鸥.
#include "Update.h"
#if(CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
#include &dirent.h&
#include &sys/stat.h&
USING_NS_CC;
USING_NS_CC_EXT;
#define DOWNLOAD_FILE "download"
#include "CCLuaEngine.h"
Update::Update():
_pathToSave(""),
_showDownloadInfo(NULL)
Update::~Update()
AssetsManager *assetManager = getAssetsManager();
CC_SAFE_DELETE(assetManager);
bool Update::init()
if (!Layer::init()) {
return false;
Size winSize = Director::getInstance()-&getWinSize();
initDownloadDir();
_showDownloadInfo = Label::createWithSystemFont("", "Arial", 20);
_showDownloadInfo-&setPosition(Vec2(winSize.width / 2,winSize.height / 2 - 20));
this-&addChild(_showDownloadInfo);
auto itemLabel1 = MenuItemLabel::create(
Label::createWithSystemFont("Reset", "Arail", 20), CC_CALLBACK_1(Update::reset, this));
auto itemLabel2 = MenuItemLabel::create(
Label::createWithSystemFont("Update", "Arail", 20), CC_CALLBACK_1(Update::update, this));
auto menu = Menu::create(itemLabel1,itemLabel2, NULL);
this-&addChild(menu);
itemLabel1-&setPosition(Vec2(winSize.width / 2, winSize.height / 2 + 20));
itemLabel2-&setPosition(Vec2(winSize.width / 2, winSize.height / 2));
menu-&setPosition(Vec2::ZERO);
return true;
void Update::onError(AssetsManager::ErrorCode code)
switch (code) {
case cocos2d::extension::AssetsManager::ErrorCode::NO_NEW_VERSION:
_showDownloadInfo-&setString("no new version");
case cocos2d::extension::AssetsManager::ErrorCode::NETWORK:
_showDownloadInfo-&setString("no new version");
case cocos2d::extension::AssetsManager::ErrorCode::CREATE_FILE:
_showDownloadInfo-&setString("create file error");
void Update::onProgress(int percent)
if (percent & 0) {
char progress[20];
snprintf(progress, 20, "download %d%%",percent);
_showDownloadInfo-&setString(progress);
void Update::onSuccess()
CCLOG("download success");
_showDownloadInfo-&setString("download success");
std::string path = FileUtils::getInstance()-&getWritablePath() + DOWNLOAD_FILE;
LuaEngine* pEngine = LuaEngine::getInstance();
//首先添加下载文件的目录
pEngine-&addSearchPath(_pathToSave.c_str());
path += "/src/main.lua";
pEngine-&executeScriptFile(path.c_str());
AssetsManager* Update::getAssetsManager()
static AssetsManager *assetManager = NULL;
if (!assetManager) {
/*创建AssetsManager对象
*@param 资源包的下载路径
*@param 资源包的当前版本
*@param 资源包下载后的存储路径
assetManager = new AssetsManager(
"/game/cocos/teacher/test/src.zip",
"/game/cocos/teacher/test/version.php",
_pathToSave.c_str());
//设置AssetsManager对象的回调对象
assetManager-&setDelegate(this);
//设置AssetsManager对象的timeout时间
assetManager-&setConnectionTimeout(3);
return assetM
void Update::initDownloadDir()
CCLOG("initDownloadDir");
_pathToSave = FileUtils::getInstance()-&getWritablePath();
_pathToSave += DOWNLOAD_FILE;
CCLOG("Path: %s",_pathToSave.c_str());
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
DIR *pDir = NULL;
pDir = opendir(_pathToSave.c_str());
if (!pDir) {
mkdir(_pathToSave.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
if ((GetFileAttributes(_pathToSave.c_str())) = INVALID_FILE_ATTRIBUTES) {
CreateDirectoryA(_pathToSave.c_str(),0);
CCLOG("initDownloadDir end");
void Update::reset(Ref *pSender)
_showDownloadInfo-&setString("");
// Remove downloaded files
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
std::string command = "rm -r ";
// Path may include space.
command += "\"" + _pathToSave + "\"";
system(command.c_str());
std::string command = "rd /s /q ";
// Path may include space.
command += "\"" + _pathToSave + "\"";
system(command.c_str());
getAssetsManager()-&deleteVersion();
initDownloadDir();
void Update::update(Ref *pSender)
_showDownloadInfo-&setString("");
getAssetsManager()-&update();
大家最好可以在本地搭建一个apache服务器,做一下练习。
阅读(...) 评论()查看: 341回复: 9
unityLua热更新教程
元素币活跃度贡献值
unity3D区版主
土豪金2014
在线时间1408 小时
马上注册成为元素者,获取海量元素资源,结识各路大神级人物
才可以下载或查看,没有帐号?
本帖最后由 狼之独步 于
14:47 编辑
资源大小:1.17GB 更新时间:价格:20元素币 销售总额:400元素币 购买人数:20尊敬的游客 ,本内容需要支付 20元素币 来下载,您可以 或者 。也可使用获取 同等点击次数 ,来轻松下载。
4402876F-F895-4C18-A1DE-CD519D1C9369.png (441.35 KB, 下载次数: 0)
14:23 上传
0AC030A2-9FF6-406E-AC59-9EC.png (141.97 KB, 下载次数: 0)
14:45 上传
2F3FF-4BAF-B772-9DD.png (200.47 KB, 下载次数: 0)
14:45 上传
F9D377A1-F037-4F52-AB81-F.png (226.74 KB, 下载次数: 0)
14:45 上传
活跃度 +15
看着有点像siki的。。。。
伟大的元素神,送我一个水灵灵的妹纸吧!
元素币活跃度贡献值
元素皇, 积分 70636, 距离下一级还需 29364 积分
元素皇, 积分 70636, 距离下一级还需 29364 积分
在线时间1775 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
unity3D区版主
土豪金2014
在线时间1408 小时
哈哈,就是
伟大的元素神,送我一个水灵灵的妹纸吧!
元素币活跃度贡献值
元素王, 积分 7669, 距离下一级还需 22331 积分
元素王, 积分 7669, 距离下一级还需 22331 积分
在线时间91 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素侠, 积分 1729, 距离下一级还需 271 积分
元素侠, 积分 1729, 距离下一级还需 271 积分
在线时间23 小时
元素帖子强,满满正能量!
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素侠, 积分 1729, 距离下一级还需 271 积分
元素侠, 积分 1729, 距离下一级还需 271 积分
在线时间23 小时
我们先定一个能达到的小目标,先赚它一亿元素币
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素魔, 积分 4486, 距离下一级还需 514 积分
元素魔, 积分 4486, 距离下一级还需 514 积分
在线时间52 小时
一个神语言要诞生了
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 20714, 距离下一级还需 9286 积分
元素王, 积分 20714, 距离下一级还需 9286 积分
在线时间406 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素王, 积分 20714, 距离下一级还需 9286 积分
元素王, 积分 20714, 距离下一级还需 9286 积分
在线时间406 小时
我们先定一个能达到的小目标,先赚它一亿元素币
还没有设置签名!您可以在此展示你的链接,或者个人主页!
元素币活跃度贡献值
元素师, 积分 421, 距离下一级还需 79 积分
元素师, 积分 421, 距离下一级还需 79 积分
在线时间6 小时
还没有设置签名!您可以在此展示你的链接,或者个人主页!
【拥有1000元素币】你就可以领取
【拥有3000元素币】其实也是很容易的事情
达成成就【元素智者】在元素知道
超过5次解决提问者的问题
达成成就【元素皇者】升级成为元素皇
【元素晶石】
只有【元素大神】才能拥有,自由出入元素秘境之钥
【真爱之花】
情人节限量版,据说此花会带来桃花运!
守望者【猎空】
据说可以随时呼唤猎空,需要消耗100点贡献
加入【元素6月】在元素冒险的时候,你一定会用到它,尤其是在遇到像小强这种可怕生物时
加入【元素1年】自古美女爱英雄,这是千年不变的定律!英雄盾会为你们见证
【50小时】的学习,已经证明了你自己,这件法袍是你的了,由于使用了简陋的材料,能穿一个月已经不错了!
【600小时】在线,足以驾驭魔神的力量,他们会守护你!
达成成就【中级追猎者】在元素悬赏中30次被评为最佳答案 ,双十二特别礼品
平时一次性兑换土豪金超过3000,圣诞节期间一次性兑换土豪金超过500即可获取!
【MP50】这次的冒险才刚刚开始,和所有故事一样,你得先有一个属于自己的法杖!即使他的法力会在30天后消失
达成成就【闪电链】发布55张包含3条以上内部相关链接的帖子
元素推荐-友情提示 /1
每周一次的扩散大招带来更多元素币收益!
快速登录:
收藏帖子(4)
周一至周日:08:00-22:00
积分和充值
&2014&&. All rights reserved. (ios下怎么代码热更新?lua只能改业务逻辑!
ios下怎么代码热更新?lua只能改业务逻辑!不能把物体上挂的脚本改成lua脚本。
要评论请先&或者&
只能哟个lua类的吧,ios不让用动态更新。扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
查看: 839|回复: 4
Unity热更新专题(一)热更新简介&(二)Lua编程语言
74291/5000排名<font color="#FF昨日变化3主题帖子积分
日久生情, 积分 4291, 距离下一级还需 709 积分
日久生情, 积分 4291, 距离下一级还需 709 积分
蛮牛币62853
在线时间352 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
本帖最后由 BobbyKim 于
12:04 编辑
  1、什么是热更新?
  游戏上线后,在运营过程中,如果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新打包,然后让玩家重新下载,就会浪费流量,体验不好。
  热更新可以在不重新下载客户端的情况下,更新游戏内容。
  2、为什么C#脚本不可以直接更新?
  C#运行之前需要先编译,这个过程在手机上是无法完成的,所以当我们游戏的逻辑更改时,C#代码发生改变的时候,我们就需要重新发布新版本。
  这对于手游来说体验是不好的。
  3、热更新有哪些实现方式?
  ①使用Lua脚本编写游戏的UI或者其他逻辑。(调用C#里面的方法来进行)
  ②使用C#Light。
  ③使用C#反射技术。
  4、什么是AssetBundle?
  Unity提供的一种资源更新技术,就是通过AssetBundle更新UI,也可以通过把脚本或者其他代码当成资源打包成AssetBundle然后更新到客户端。
  5、如何利用Lua进行热更新?
  在移动端编写Lua解析器,通过这个解析器可以运行最新的Lua脚本,然后我们把控制游戏逻辑的代码写成Lua脚本。
  6、Lua的解析?
  ①uLua。
  ②Nlua。
  ③UniLua。(游嗯爱Lua)
  ④sLua。
  7、怎么学习热更新?
  ①Lua编程。
  ②LuaInterface和luanet进行Lua和C#的交互通信。
  ③学习使用AssetBundle进行资源更新。
  ④学习uLua SimpleFramework。
===============================================
  1、安装LuaForWindows
  自行百度下载安装。
  2、Lua基础
  可参考:Lua初步。
unity 和unity使用什么语言;unity lua写;unity如何使用unity+unity使用unity 三种语言;unity 用什么语言;unity 多语言;unity中能用其他语言吗;unity是用什么语言;unity语言;unity中写 lua
本帖被以下淘专辑推荐:
& |主题: 1, 订阅: 0
每日推荐:
5887/1000排名<font color="#FF昨日变化1主题帖子积分
熟悉之中, 积分 887, 距离下一级还需 113 积分
熟悉之中, 积分 887, 距离下一级还需 113 积分
蛮牛币1757
在线时间217 小时
好教程,感谢楼主的分享
[]: Old_N 发帖时在路边捡到 1
蛮牛币,偷偷放进了口袋.
每日推荐:
71535/5000排名<font color="#FF昨日变化77主题帖子积分
日久生情, 积分 1535, 距离下一级还需 3465 积分
日久生情, 积分 1535, 距离下一级还需 3465 积分
蛮牛币2175
在线时间164 小时
写的很详细,谢谢分享了!
每日推荐:
5812/1000排名<font color="#FF昨日变化9主题帖子积分
熟悉之中, 积分 812, 距离下一级还需 188 积分
熟悉之中, 积分 812, 距离下一级还需 188 积分
蛮牛币1384
在线时间291 小时
正在学习&&来看看怎么学习
每日推荐:
5647/1000排名<font color="#FF昨日变化25主题帖子积分
熟悉之中, 积分 647, 距离下一级还需 353 积分
熟悉之中, 积分 647, 距离下一级还需 353 积分
蛮牛币1002
在线时间170 小时
每日推荐:

我要回帖

更多关于 lua gcobject 的文章

 

随机推荐