您的位置:首页 > 编程语言 > Lua

Xlua热更新笔记

2018-10-23 20:46 225 查看

成员方法:通过对象调用

静态方法:通过类调用

static全局的,静态方法只能放在静态方法中,普通方法生命周期小于静态方法(全局的)如协程不能在静态方法中调用

***************************环境配置与导入********************

  1. 导入Xlua文件到Unity工程
  2. 配置宏定义:添加 HOTFIX_ENABLE 到 'Edit > Project Settings > Player > Other Settings > Scripting Define Symbols'。
    (注意:各平台需要分别设置)
  3. 生成代码:执行 'XLua > Generate Code' 菜单,等待Unity编译完成。
  4. 注入:执行 'XLua > Hotfix Inject In Editor' 菜单。注入成功会打印 'hotfix inject finish!' 或者 'had injected!' 。";
  5. 按提示导入Tools文件夹,必须是英文路径

*************************lua虚拟环境搭建*********************************

  1. [code]using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using XLua;
    using System.IO;
    public class HotFixScript : MonoBehaviour {
    private LuaEnv LuaEnv;
    // Use this for initialization
    void Start () {
    //第一步
    LuaEnv = new LuaEnv();
    //第二步
    LuaEnv.AddLoader(MyLoader);
    //第三步 具体执行哪一个文件
    LuaEnv.DoString("require'Fish'");       //lua命令
    }
    
    // Update is called once per frame
    void Update () {
    
    }
    
    //自定义Loader
    
    private byte[] MyLoader(ref string filePath)    //传入文件路径
    {
    string absPath = @"E:\XluaPractice\FishingJoy\HotFixScripts\" + filePath + ".lua.txt";
    
    return System.Text.Encoding.UTF8.GetBytes( File.ReadAllText(absPath));   //读取文件
    }
    
    private void OnDestroy()
    {
    LuaEnv.Dispose();       //释放虚拟环境
    }
    }

    创建的lua文件

    [code]print ('123')

    使用建议

  • 对所有较大可能变动的类型加上Hotfix标识;
  • 建议用反射找出所有函数参数、字段、属性、事件涉及的delegate类型,标注CSharpCallLua;
  • 业务代码、引擎API、系统API,需要在Lua补丁里头高性能访问的类型,加上LuaCallCSharp;
  • 引擎API、系统API可能被代码剪裁调(C#无引用的地方都会被剪裁),如果觉得可能会新增C#代码之外的API调用,这些API所在的类型要么加LuaCallCSharp,要么加ReflectionUse;

*****************************************************************范例****************************************************************************

 

  1. 引入命名空间 using XLua;
  2. 打标签 [Hotfix]
  3. 如果Lua会用到C#里的方法,需要在方法前加上[LuaCallCSharp]

*************************************************************改变一个私有类型的变量******************************************************

  1. 只赋值的时候不用打LuaCallCsharp标签

**************************************************************补丁打在什么位置********************************************************

  • Awake函数内
  • 如果在Start里,那么要更新Start函数就不会执行

******************************************************只修改方法体内部分代码************************************************

(先执行已有逻辑,在执行新加逻辑)

  1. 引入util文件,定义为变量方便使用 local util=require 'util'--导入库文件,类似引入命名空间(平级目录)
  2. 用util.hotfix_ex(CS.ClassName,'方法名',function(self)  Self.方法名(Self)    Self.属性=???   end)调用
  3. 释放时还是使用xlua.hotfix(CS.ClassName,'方法名',nil)

******************************************************************带参数的方法**************************************************

  1. util.hotfix_ex(CS.ClassName,'方法名',function(self,参数名)  Self.方法名(Self,参数名)    函数体   end)
  2. --传递进来的参数不用加self

 

*************************************************************多重载函数***********************************************************

UnityEngine.Random.Range多重载函数回取到浮点类型可以用UnityEngine.Mathf.Floor向上或向下取整

*********************************************************在网络加载AB包*****************************************************

  1.  需要在协程中加载
  2. 静态方法不能开启协程
    [code]using UnityEngine.Networking;
    
    public void LoadResource(string resName, string filePath) //第一个参数是想要加载的预制体的名字,第二个参数是想要加载的文件路径
    {
    StartCoroutine(LoadResourceCorotine(resName,filePath));
    }
    IEnumerator LoadResourceCorotine(string resName, string filePath)
    {
    //发送请求
    UnityWebRequest request= UnityWebRequestAssetBundle.GetAssetBundle(@"http://localhost" + filePath);
    //下载到request对象里
    yield return request.SendWebRequest();
    //下载到的内容
    
    AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
    GameObject gameObject = ab.LoadAsset<GameObject>(resName);
    //放到什么地方
    prefabsDic.Add(resName, gameObject);
    }

     

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: