唉,我好菜啊,本来想自己实现一套热更的,但是毫无思路,还是一步一步来吧,先抄抄看看别人的东西怎么样吧,写了个helloworld,支持资源和代码热更。

读取的json数据,在公司里面应该是读取服务器下发的协议数据,应该更麻烦。
json:

{"nodes": [{"Name": "kk","Exp": 100,"Job": "AK1","CombatPower": 300},{"Name": "lisi","Exp": 1000,"Job": "AK2","CombatPower": 15},{"Name": "lufei","Exp": 200,"Job": "AK3","CombatPower": 150},{"Name": "solong","Exp": 300,"Job": "AK4","CombatPower": 2}]
}

define.lua:

我添加了RankView和RankCtrl

这里没有操作,其实可以把后面常用的luacomponent(都是静态方法)添加进来;
functions.lua

添加了全局函数,方便查找子节点
注意这里用cjson来操控json的加载和序列化。
json就放到指定文件夹下就可以了,看下面代码路径。
RankCtrl:

RankCtrl = {};
local this = RankCtrl;local luaBehaviour;
local transform;
local gameObject;
local data;
local json = require "cjson"
local util = require "3rd/cjson/util"
local isExp = false;
require "Controller/RankItem"
--构建函数--
function RankCtrl.New()logWarn("RankCtrl.New--->>");return this;
endfunction RankCtrl.Awake()logWarn("RankCtrl.Awake--->>");panelMgr:CreatePanel('Rank', this.OnCreate);
end--启动事件--
function RankCtrl.OnCreate(obj)gameObject = obj;luaBehaviour = gameObject:GetComponent('LuaBehaviour');logWarn("Start lua--->>"..gameObject.name);resMgr:LoadPrefab('rank', { 'RankItem' }, this.InitPanel);-- 事件注册luaBehaviour:AddClick(RankPanel.btnClose, this.OnClick);luaBehaviour:AddClick(RankPanel.btnExp,function()RankPanel.txtRankValue:GetComponent("Text").text = "经验值";this.isExp = true;this.Refresh();end);luaBehaviour:AddClick(RankPanel.btnCombatPower,function ()RankPanel.txtRankValue:GetComponent("Text").text = "战力";this.isExp = false;this.Refresh();end);
end--初始化面板--
function RankCtrl.InitPanel(objs)---@type tablethis.data = this.LoadData();table.sort(this.data.nodes,function (d1,d2)return d1.CombatPower<d2.CombatPower;end);local parent =RankPanel.RankItemParent;for i=1,#this.data.nodes dolocal go = newObject(objs[0])go.name = 'RankItem';go.transform:SetParent(parent.transform,false);go.transform.localScale = Vector3.one;go.transform.localPosition = Vector3.zero;local item = LuaFramework.LuaComponent.Add(go,RankItem);item.obj = go;item.rank = i;item.name = this.data.nodes[i]["Name"];item.job = this.data.nodes[i]["Job"];item.rankValue = this.data.nodes[i].CombatPower;end
endfunction RankCtrl.Refresh()if this.isExp thentable.sort(this.data.nodes,function (d1,d2)return d1.Exp<d2.Exp;end);elsetable.sort(this.data.nodes,function (d1,d2)return d1.CombatPower<d2.CombatPower;end);end---@type UnityEngine.GameObjectlocal parent =RankPanel.RankItemParent;-- 先删再加local tmp= {};for i = 1, parent.transform.childCount dotmp[i] = parent.transform:GetChild(i-1)endfor i=1,#tmp dodestroy(tmp[i].gameObject)endtmp = nil;resMgr:LoadPrefab('rank', { 'RankItem' }, this.CallBack);
endfunction RankCtrl.CallBack(objs)---@type UnityEngine.GameObjectlocal parent =RankPanel.RankItemParent;for i=1,#this.data.nodes dolocal go = newObject(objs[0])go.name = 'RankItem';go.transform:SetParent(parent.transform,false);go.transform.localScale = Vector3.one;go.transform.localPosition = Vector3.zero;local item = LuaFramework.LuaComponent.Add(go,RankItem);item.obj = go;item.rank = i;item.name = this.data.nodes[i]["Name"];item.job = this.data.nodes[i]["Job"];if this.isExp thenitem.rankValue = this.data.nodes[i].Exp;elseitem.rankValue = this.data.nodes[i].CombatPower;endend
end
--cjson--
function RankCtrl.LoadData()local path = Util.DataPath.."lua/3rd/cjson/rank.json";local text =util.file_load(path);local t = json.decode(text)return t;
endfunction RankCtrl.OnClick()destroy(gameObject)
end
--关闭事件--
function RankCtrl.Close()LuaFramework.Util.Log("Rank 销毁!!!")panelMgr:ClosePanel(CtrlNames.Rank);
end

唉。
RankView:

local transform;
local gameObject;RankPanel = {};
local this = RankPanel;--启动事件--
function RankPanel.Awake(obj)gameObject = obj;transform = obj.transform;this.InitPanel();logWarn("Awake lua--->>"..gameObject.name);
end--初始化面板--
function RankPanel.InitPanel()this.btnClose = FindChildNode(transform,"btnClose").gameObject;this.txtRankValue=  FindChildNode(transform,"txtRankValue").gameObject;this.RankItemParent=FindChildNode(transform,"LstItemParent").gameObject;this.btnCombatPower = FindChildNode(transform,"btnCombatPower").gameObject;this.btnExp = FindChildNode(transform,"btnExp").gameObject;
end--单击事件--
function RankPanel.OnDestroy()logWarn("OnDestroy---->>>");
end

RankItem:
每个Item保存自己的数据

RankItem = {--里面可以放一些属性name = "RankItem",rank = -1, --索引job = "ice",rankValue = 100,obj = nil,
}
function RankItem:Start()-- 设置IdFindChildNode(self.obj.transform,"txtRank"):GetComponent("Text").text = self.rank;-- 设置nameFindChildNode(self.obj.transform,"txtName"):GetComponent("Text").text = self.name;-- 设置scoreFindChildNode(self.obj.transform,"txtJob"):GetComponent("Text").text = self.job;FindChildNode(self.obj.transform,"txtRankValue"):GetComponent("Text").text = self.rankValue;
end--创建对象
function RankItem:New(obj)local o = {}setmetatable(o, self)self.__index = selfreturn o
end

还有events这个鬼东西没有用到。
用到网上他们常用的一个LuaComponent类。

/** 让Lua脚本也能挂载到游戏物体上的组件* * LuaComponent主要有Get和Add两个静态方法,其中Get相当于UnityEngine中的GetComponent方法,Add相当于AddComponent方法,* 只不过这里添加的是lua组件不是c#组件。每个LuaComponent拥有一个LuaTable(lua表)类型的变量table,它既引用上述的Component表。* Add方法使用AddComponent添加LuaComponent,调用参数中lua表的New方法,将其返回的表赋予table。* Get方法使用GetComponents获取游戏对象上的所有LuaComponent(一个游戏对象可能包含多个lua组件,由参数table决定需要获取哪一个),* 通过元表地址找到对应的LuaComponent,返回lua表* * Add by TYQ*/using LuaInterface;
using UnityEngine;namespace LuaFramework
{public class LuaComponent : View{//Lua表public LuaTable table;//添加LUA组件  public static LuaTable Add(GameObject go, LuaTable tableClass){LuaFunction fun = tableClass.GetLuaFunction("New");if (fun == null)return null;//lua升级后不,Call方法不再返回对象,因此改为Invoke方法实现object rets = fun.Invoke<LuaTable, object>(tableClass);if (rets == null){return null;}LuaComponent cmp = go.AddComponent<LuaComponent>();cmp.table = (LuaTable)rets;cmp.CallAwake();return cmp.table;}//添加LUA组件,允许携带额外一个参数(args)public static LuaTable Add(GameObject go, LuaTable tableClass, LuaTable args){LuaFunction fun = tableClass.GetLuaFunction("New");if (fun == null)return null;object rets = fun.Invoke<LuaTable, object>(tableClass);if (rets == null){return null;}LuaComponent cmp = go.AddComponent<LuaComponent>();cmp.table = (LuaTable)rets;cmp.CallAwake(args);return cmp.table;}//添加LUA组件  // isAllowOneComponent为true时,表示只添加一次组件,如果已存在,就不再添加public static LuaTable Add(GameObject go, LuaTable tableClass, bool isAllowOneComponent){//如果已存在,则不再添加LuaComponent luaComponent = go.GetComponent<LuaComponent>();if (luaComponent != null){return null;}LuaFunction fun = tableClass.GetLuaFunction("New");if (fun == null)return null;object rets = fun.Invoke<LuaTable, object>(tableClass);if (rets == null){return null;}LuaComponent cmp = go.AddComponent<LuaComponent>();cmp.table = (LuaTable)rets;cmp.CallAwake();return cmp.table;}//获取lua组件public static LuaTable Get(GameObject go, LuaTable table){LuaComponent cmp = go.GetComponent<LuaComponent>();string mat1 = table.ToString();string mat2 = cmp.table.GetMetaTable().ToString();if (mat1 == mat2){return cmp.table;}return null;}//删除LUA组件的方法略,调用Destory()即可  //调用lua表的Awake方法void CallAwake(){LuaFunction fun = table.GetLuaFunction("Awake");if (fun != null)fun.Call(table, gameObject);}//调用lua表的Awake方法(携带一个参数)void CallAwake(LuaTable args){LuaFunction fun = table.GetLuaFunction("Awake");if (fun != null)fun.Call(table, gameObject, args);}private void OnEnable(){// Debug.Log("================================================================================");//Debug.Log(table);if (table == null){//Debug.LogWarning("Table is Null---------------------");return;}LuaFunction fun = table.GetLuaFunction("OnEnable");if (fun != null){fun.Call(table, gameObject);}}void Start(){LuaFunction fun = table.GetLuaFunction("Start");if (fun != null)fun.Call(table, gameObject);}void Update(){//效率问题有待测试和优化//可在lua中调用UpdateBeat替代LuaFunction fun = table.GetLuaFunction("Update");if (fun != null)fun.Call(table, gameObject);}private void FixedUpdate(){LuaFunction fun = table.GetLuaFunction("FixedUpdate");if (fun != null)fun.Call(table, gameObject);}private void LateUpdate(){LuaFunction fun = table.GetLuaFunction("LateUpdate");if (fun != null)fun.Call(table, gameObject);}//更多函数略private void OnDisable(){if (table != null){LuaFunction fun = table.GetLuaFunction("OnDisable");if (fun != null){fun.Call(table, gameObject);}}}private void OnDestroy(){#if ASYNC_MODEstring abName = name.ToLower().Replace("item", "");ResManager.UnloadAssetBundle(abName + AppConst.ExtName);
#endifUtil.ClearMemory();Debug.Log("~" + name + " was destroy!");if (table != null){LuaFunction fun = table.GetLuaFunction("OnDestroy");if (fun != null){fun.Call(table, gameObject);}}}}
}

其实这代码写的也不全面,他原作者的ondetory就写的很low,完全没有资源销毁之后item的ab包引用计数的问题,我这里补充了一下。
还有ctrlmanager里面ctrl全部初始化new,返回this,以及initallpanels,包括你rankitem实例化出来的名称问题这些细节要注意一下。
想看源码这里:helloworld

LuaFramework实现一个排行榜相关推荐

  1. 用unity和php实现一个排行榜功能(unity客户端篇)

    注:此文章需配合以下文章一起使用 用unity和php实现一个排行榜功能(PHP服务端篇) unity客户端篇 目前我用的版本是unity2020,unity2019,这份代码应该也适用 排行榜显示部 ...

  2. 凉了呀,面试官叫我设计一个排行榜。

    这是why哥的第89篇原创文章 前两天,有一个读者给我发了一张图片. 我问:发什么肾么事了? 于是有了这样的对话: 他发的图,就是微信运动步数排行榜的截图: 其实扯了这么多,这就是个常见的面试场景题: ...

  3. 教你快速开发一个微信小游戏好友排行榜

    概述 ​ 要做这个好友排行榜.必然要有好友的战绩比分,然后再做排序,最后将数据呈现在UI上 , 可以分为下面几个步骤: 保存每个用户的分数 获取好友列表,并获取好友的分数 渲染排行榜 保存每个用户的分 ...

  4. 如何利用UGUI在Unity中实现一个本地排行榜

    write by 书封影 前置知识:Unity的基本操作,C#基础,List泛型集合基本操作,GameManager,string的基本使用方法.注意,本文默认你已经掌握上述知识,并在后文中不会对上述 ...

  5. 用 Redis 搞定游戏中的实时排行榜,附源码!

    原文:segmentfault.com/a/1190000019139010 1. 前言 前段时间刚为项目(手游)实现了一个实时排行榜功能, 主要特性: 实时全服排名 可查询单个玩家排名 支持双维排序 ...

  6. 鸿蒙武器排行榜,刺客伍六七武器排行榜,剪刀垫底,魔刀仅排第二,图四才是最强武器...

    <刺客伍六七>是一部非常精彩的动漫,它的整体剧情也是看起来比较轻松愉快,当然在一个有着刺客的世界中,武器自然是刺客的重要道具,那么在这个世界中的武器就会有一个排行榜,下面随小编一起来看:刺 ...

  7. python开发的比较知名的游戏-游戏排行榜-Python实现

    背景介绍 排行榜通常是游戏中为了激发玩家的一种策略,那么对于开发人员来说如何完成一个排行榜的设计呢?如果这个排行榜是动态的如何才能高效的对比出结果呢?如果排行榜实时性较高如何给用户展示出用户是进步了还 ...

  8. 7-20(排序) 奥运排行榜(25 分)

    7-20(排序)奥运排行榜 每年奥运会各大媒体都会公布一个排行榜,但是细心的读者发现,不同国家的排行榜略有不同.比如中国金牌总数列第一的时候,中国媒体就公布"金牌榜":而美国的奖牌 ...

  9. Docker最全教程——Redis容器化以及排行榜实战(十三)

    Docker最全教程--Redis容器化以及排行榜实战(十三) 原文:Docker最全教程--Redis容器化以及排行榜实战(十三) 前言 容器教程的路还很长,笔者尽量根据实践来不断地完善.由于在编写 ...

最新文章

  1. ios NSLayoutConstraint
  2. ggplot2笔记4 语法基础
  3. python有哪些方面_Python学习中最基本的内容,看看有哪些需要我们学习的
  4. linux交叉编译tile环境搭建,g ++ - 在Ubuntu中在32位上交叉编译64位程序时,缺少包含“bits / c ++ config.h”...
  5. 崭新的2020(洛谷P5886题题解,Java语言描述)
  6. 为什么大学普遍都教C/C++、Java,而不教Golang、Python、Rust?
  7. C++设计模式-Factory工厂模式
  8. java ecc signature_如何用python验证android/java的ECC签名
  9. 按代码行衡量编程进度就像按重量衡量飞机制造进度一样
  10. 如何让pm2支持es6
  11. 96% 移动恶意软件针对 Android 系统:逾50亿应用可被攻击
  12. 关于 in与exist , not in与not exist 的区别
  13. SATI 国产文献题录信息统计分析工具:简介
  14. 计算机输入法不能切换用户登录,Win7输入法无法切换怎么办?
  15. python导入excel数据到mysql
  16. opencascade 0xXXXXXXXX处最可能的异常: 0xC0000005: 写入位置 0x00000014 时发生访问冲突
  17. 机器学习中文资源合集
  18. springcloud + oauth2
  19. 乘积累加运算(Multiply Accumulate, MAC)
  20. 圆周率250亿位资源

热门文章

  1. matlab寻找直线_Matlab 霍夫变换 ( Hough Transform) 直线检测
  2. 2017283422赵浩凯
  3. FCD网站服务器加密,AWS S3 应用 KMS Key 进行服务端数据加密
  4. 基于树莓派的电机倒立摆控制系统开发
  5. 软件测试 —— Python(二)之流程控制结构
  6. uptime2 /proc/uptime
  7. java写洗衣机仿真程序
  8. 公司的电脑为什么卡——因为缺少工程师文化
  9. oppo计算机怎么添加到桌面,如何在oppo手机中添加桌面插件?
  10. 苹果屏幕上的悬浮的home键(小圆点)在哪里设置出来