最近做项目时有一个要求是这样的:使用编辑器编辑的关卡到游戏运行,策划希望点击编辑器试玩时,游戏直接打开编辑器指定的关卡,但是编辑器编辑关卡是可以上传到服务器发布的关卡,游戏也是可以发布正常运行的游戏,这样就导致游戏不知道编辑器送过来的关卡ID,那么如何才能直接打开编辑器送过来的关卡呢。这个时候只能只用Unity注入lua代码到游戏端,告诉游戏我们送过来的关卡ID。
实现办法:在游戏端写一个模板结构,在游戏中直接调用,在Temp目录下创建一个TempConst.lua文件,并写入一下代码
local TempConst = {
DefaultLvID = nil, -- 默认关卡Id
}
return TempConst
游戏中直接调用代码
调用处:
local TempConst = require "Temp.TempConst"
local function enterLevelFunc()
-- 其他代码
if TempConst.DefaultLvID == nil then
-- 自己设置关卡ID
else
-- 调用编辑器指定关卡ID
self:_enterPuzzle(TempConst.DefaultLvID)
end
-- 其他代码
end
Unity端注入lua代码方法:
// 试玩
[UsedImplicitly]
public void PlayLevelAction() {
var level = YEDataManager.Instance.EditingLevel;
string levelFilePath; // 注入关卡路径,自己设置
string configFilePath; // 注入配置路径,自己设置
string excutablePath; // 打包游戏存放路径
if (!CreateLuaFiles(level, out levelFilePath, out configFilePath)) return;
//参数
var args = new StringBuilder();
//注入测试关卡
args.AppendFormat("-inject {0} \"{1}\" ", "AutoGenerateConfigs.Level.120000", levelFilePath);
//注入配置
args.AppendFormat("-inject {0} \"{1}\" ", "Temp.TempConst", configFilePath);
//启动游戏
Process.Start(excutablePath,args.ToString());
// AutoGenerateConfigs.Level.120000 游戏需要注入替换关卡的路径
// Temp.TempConst 游戏需要注入替换配置的路径,我们上面创建的文件
}
private bool CreateLuaFiles(YELevel level, out string levelFilePath,out string configFilePath)
{
//创建关卡文件
levelFilePath = ""; -- 设置注入关卡路径
if(File.Exists(levelFilePath))File.Delete(levelFilePath);
YELuaFactory.WriteLuaFile(HEMiddleWare.ToGameConfig(level), levelFilePath);
//创建配置文件
configFilePath = ""; -- 设置注入配置文件路径
if(File.Exists(configFilePath))File.Delete(configFilePath);
File.WriteAllText(configFilePath, "local TempConst = {DefaultLvID = \"120000\"} return TempConst", Encoding.UTF8);
return true;
}
HEMiddleWare.ToGameConfig(level)
是编辑器配置关卡的方法,该方法返回一个lua格式的关卡,并可以在游戏中执行。
"local TempConst = {DefaultLvID = \"120000\"} return TempConst"
是注入配置的lua代码,用于替换Temp.TempConst
内容,至于DefaultLvID = \"120000\"
是自己设置的关卡ID,可以自己设置。
Unity点击试玩时调用PlayLevelAction()
方法,编辑器启动游戏,并将关卡,配置注入到游戏运行。该方法最主要的是注入思想,代码需要自己补齐才可以运行。