⽹易游戏雷⽕事业:浅谈倩⼥⼿游中的资源更新z huanlan.zhihu
其实是看到这个之后,决定把热更新也整合进去。既然要整合热更新,那现在的框架不得不重新写⼀次,因为代码最终要编译成Dll的。这次重写的话,我做出了如下选择:
没啥好说的,中规中矩建⼀个3D⼯程。随意新建⼀个脚本,⽤VS打开,在“解决⽅案管理器”视图到Unity相关的引⽤,其属性为:把路径⾥⽤到的东西打包复制到Dll⼯程的3rd⽬录下,供Dll⼯程引⽤。然后再到和:
如果电脑⾥有多个Unity版本,则可能会有多个该程序,选择对应版本的即可,等下要⽤的是路径,是DLL的调试符号转换打上断点,挂上调试。然后运⾏游戏⼯程,好的,成功断住:
{
// 此处是Unity和系统的原⽣类型配置
[LuaCallCSharp]
public static List<Type> _LCS_UnityTypeList = new List<Type>()
{
// 测试
typeof(Debug),
// 基础
typeof(RectTransform),
typeof(Component),
typeof(Behaviour),
typeof(Transform),
typeof(MonoBehaviour),
typeof(System.Object),
typeof(UnityEngine.Object),
typeof(Time),
typeof(GameObject),
typeof(Application),
typeof(Screen),
typeof(PlayerPrefs),
// 结构
typeof(Vector2),
typeof(Vector3),
typeof(Vector4),
typeof(Rect),
typeof(Quaternion),
typeof(Color),
typeof(Ray),
typeof(Bounds),
typeof(Ray2D),
typeof(Resources),
typeof(TextAsset),
// 物理
typeof(BoxCollider),
typeof(BoxCollider2D),
typeof(CircleCollider2D),
typeof(SphereCollider),
typeof(CapsuleCollider),
typeof(CapsuleCollider),
typeof(AudioSource),
typeof(AudioClip),
// 动画
typeof(Keyframe),
typeof(AnimationCurve),
typeof(AnimationClip),
// 渲染
typeof(Material),
typeof(Mesh),
typeof(Texture2D),
typeof(ParticleSystem),
typeof(SkinnedMeshRenderer),
typeof(Renderer),
typeof(Camera),
};
// 此处是⾃定义类型的配置
unity3d animation[LuaCallCSharp]
public static List<Type> _LCS_FrameTypeList = new List<Type>()
{
};
// ⿊名单
[BlackList]
public static List<List<string>> _LCS_UnityBlackList = new List<List<string>>()
另外我⽐较习惯折叠代码,这点VSCode的Lua样式还没有,⼿动打开配置⼀下:
"folding": {
"offSide": true,
"markers": {
"start": "^s*--s*regionb",
"end": "^s*--s*endregionb"
}
}
加载Lua
在编辑器下的开发应当越快越好,越⾼效越好,所以加载的时候,就有必要设计⼀种编辑器下的加载模式,跟使⽤AssetBundle或者其他⾃定义数据存储形式的⽣产环境不同,该模式应当做到修改PrefabLua等资产之后,⽆需打包即可⽴刻启动。
因为是为了测试xLua的加载,所以⼀切从简:
using UnityEngine;
using System;
using Object = UnityEngine.Object;
namespace GameCore.Loader
{
interface ILoadEx
{
Object LoadAsset(LoadContext context);
void LoadAsset(LoadContext context, Action<Object, LoadContext> onLoaded);
string LoadLua(string luaPath);
XLua.LuaEnv.CustomLoader GetCustomLoader();
}
}
其中LoadContext是⼀个发起加载的上下⽂,该结构我暂时还没想好填充什么,不过也⽆关紧要,对于现在的测试来说,只要保证LoadLua⽅法可⽤就⾏。
class EditorLoadEx : BaseLoadEx
{
public override LuaEnv.CustomLoader GetCustomLoader()
{
return (ref string path) => {
Debug.Log(path);
var lua = LoadLua(path);
return string.IsNullOrEmpty(lua) ? null : System.Text.Encoding.UTF8.GetBytes(lua);
};
}
public override string LoadLua(string luaPath)
{
string path = Application.dataPath + "/Editor/Lua/" + luaPath + ".lua";
if (File.Exists(path))
{
return File.ReadAllText(path);
}
return null;
}
}
这⾥使⽤System.IO.File⽽不是⽤AssetDatabase的原因是,“*.lua”在Unity中会被认为是DefaultAsset,⽆法被当做TextAsset处理。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论