当前位置: 首页 > news >正文

[unity]lua热更新——个人复习笔记【侵删/有不足之处欢迎斧正】

一、AssetBundle

AB包是特定于平台的资产压缩包,类似于压缩文件

相对于RESOURCES下的资源,AB包更加灵活轻量化,用于减小包体大小和热更新

可以在unity2019环境中直接下载Asset Bundle Browser

可以在其中设置关联

AB包生成的文件

AB包文件:资源文件
manifest文件:AB包文件信息;当加载时,提供了关键信息,资源信息,依赖关系,版本信息等等
关键AB包(和目录名一样的包 )

AB包资源加载

void Start(){
//加载AB包
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath+"/"+"model");//加载AB包中的资源
//只用名字加载那么会出现同名同类型资源混乱
GameObject obj = ab.LoadAsset<GameObject>("Cube");}

AB包依赖

关于AB包的依赖一一个资源身 上用到了别的AB包中的资源这个时候如果只加载自己的AB包,通过它创建对象会出现资源丢失的情况,这种时候需要把依赖包-起加载了才能正常

可以考虑利用主包获取信息

//加载AB包
AssetBundle ab = AssetBundle.LoadFromFile(Application.streamingAssetsPath+"/"+"model");//加载主包和其中的固定文件
AssetBundle abMain = AssetBundle.LoadFromFile(Application.streamingAssetsPath +"/"+"PC");
AssetBundleManifest abManifest=abMain.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

AB包资源加载管理器

public class ABMgr : SingletonAutoMono<ABMgr>
{//主包private AssetBundle mainAB = null;//主包依赖获取配置文件private AssetBundleManifest manifest = null;//选择存储 AB包的容器//AB包不能够重复加载 否则会报错//字典知识 用来存储 AB包对象private Dictionary<string, AssetBundle> abDic = new Dictionary<string, AssetBundle>();private string PathUrl{get{return Application.streamingAssetsPath + "/";}}private string MainName{get{
#if UNITY_IOSreturn "IOS";
#elif UNITY_ANDROIDreturn "Android";
#elsereturn "PC";
#endif}}private void LoadMainAB(){if( mainAB == null ){mainAB = AssetBundle.LoadFromFile( PathUrl + MainName);manifest = mainAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");}}private void LoadDependencies(string abName){//加载主包LoadMainAB();//获取依赖包string[] strs = manifest.GetAllDependencies(abName);for (int i = 0; i < strs.Length; i++){if (!abDic.ContainsKey(strs[i])){AssetBundle ab = AssetBundle.LoadFromFile(PathUrl + strs[i]);abDic.Add(strs[i], ab);}}}public T LoadRes<T>(string abName, string resName) where T:Object{//加载依赖包LoadDependencies(abName);//加载目标包if ( !abDic.ContainsKey(abName) ){AssetBundle ab = AssetBundle.LoadFromFile(PathUrl + abName);abDic.Add(abName, ab);}//得到加载出来的资源T obj = abDic[abName].LoadAsset<T>(resName);//如果是GameObject 因为GameObject 100%都是需要实例化的//所以我们直接实例化if (obj is GameObject)return Instantiate(obj);elsereturn obj;}public Object LoadRes(string abName, string resName, System.Type type) {//加载依赖包LoadDependencies(abName);//加载目标包if (!abDic.ContainsKey(abName)){AssetBundle ab = AssetBundle.LoadFromFile(PathUrl + abName);abDic.Add(abName, ab);}//得到加载出来的资源Object obj = abDic[abName].LoadAsset(resName, type);//如果是GameObject 因为GameObject 100%都是需要实例化的//所以我们直接实例化if (obj is GameObject)return Instantiate(obj);elsereturn obj;}public Object LoadRes(string abName, string resName){//加载依赖包LoadDependencies(abName);//加载目标包if (!abDic.ContainsKey(abName)){AssetBundle ab = AssetBundle.LoadFromFile(PathUrl + abName);abDic.Add(abName, ab);}//得到加载出来的资源Object obj = abDic[abName].LoadAsset(resName);//如果是GameObject 因为GameObject 100%都是需要实例化的//所以我们直接实例化if (obj is GameObject)return Instantiate(obj);elsereturn obj;}public void LoadResAsync<T>(string abName, string resName, UnityAction<T> callBack) where T:Object{StartCoroutine(ReallyLoadResAsync<T>(abName, resName, callBack));}//正儿八经的 协程函数private IEnumerator ReallyLoadResAsync<T>(string abName, string resName, UnityAction<T> callBack) where T : Object{//加载依赖包LoadDependencies(abName);//加载目标包if (!abDic.ContainsKey(abName)){AssetBundle ab = AssetBundle.LoadFromFile(PathUrl + abName);abDic.Add(abName, ab);}//异步加载包中资源AssetBundleRequest abq = abDic[abName].LoadAssetAsync<T>(resName);yield return abq;if (abq.asset is GameObject)callBack(Instantiate(abq.asset) as T);elsecallBack(abq.asset as T);}public void LoadResAsync(string abName, string resName, System.Type type, UnityAction<Object> callBack){StartCoroutine(ReallyLoadResAsync(abName, resName, type, callBack));}private IEnumerator ReallyLoadResAsync(string abName, string resName, System.Type type, UnityAction<Object> callBack){//加载依赖包LoadDependencies(abName);//加载目标包if (!abDic.ContainsKey(abName)){AssetBundle ab = AssetBundle.LoadFromFile(PathUrl + abName);abDic.Add(abName, ab);}//异步加载包中资源AssetBundleRequest abq = abDic[abName].LoadAssetAsync(resName, type);yield return abq;if (abq.asset is GameObject)callBack(Instantiate(abq.asset));elsecallBack(abq.asset);}public void LoadResAsync(string abName, string resName, UnityAction<Object> callBack){StartCoroutine(ReallyLoadResAsync(abName, resName, callBack));}private IEnumerator ReallyLoadResAsync(string abName, string resName, UnityAction<Object> callBack){//加载依赖包LoadDependencies(abName);//加载目标包if (!abDic.ContainsKey(abName)){AssetBundle ab = AssetBundle.LoadFromFile(PathUrl + abName);abDic.Add(abName, ab);}//异步加载包中资源AssetBundleRequest abq = abDic[abName].LoadAssetAsync(resName);yield return abq;if (abq.asset is GameObject)callBack(Instantiate(abq.asset));elsecallBack(abq.asset);}//卸载AB包的方法public void UnLoadAB(string name){if( abDic.ContainsKey(name) ){abDic[name].Unload(false);abDic.Remove(name);}}//清空AB包的方法public void ClearAB(){AssetBundle.UnloadAllAssetBundles(false);abDic.Clear();//卸载主包mainAB = null;}
}

二、lua基础语法

第一个lua程序

print("你好世界");
--单行注释
--lua语句可以省略分号--[[
多行数据
]]--[[
多行数据
]]----[[
还是多行数据
--]]

lua的变量(lua中所有的变量声明都不需要申明类型,会自动的判断类型)

简单变量类型:nil number string boolean

nil 相当于空的概念

number 所有的数值都是number(lua中的一个变量可以随便赋值)

string 字符串类型,字符串的声明需要用单双引号包裹,lua中无char类型

boolean 真或假

可以通过type获得变量类型,其返回值是string类型

注意:lua中使用没有声明过的变量不会报错,其值是空

其他数据类型:function table userdata thread

字符串操作

s="5464565655"print(#s)
--获取字符串长度
--中文字符在lua中占三个长度
--多行打印
--lua中支持转义字符
print("123\n123")s =[[hello
world
]]
--字符串拼接
print("1323".."65456")

注意lua字符串索引开始都是从1开始的,而不是从0开始

 运算符

算术运算符:+-*/%^

与c#中基本相同,但是需要注意lua中无++ -- += *= %= -=

(字符串可以进行算数运算符的惭怍 会自动转成number)

lua中^是幂运算

条件运算符:> < <= == ~=

~= Lua中的不等于 相当于C#中的!=

逻辑运算符

&&  ||  (c#)

and or  (lua)

not  取反

lua中and和or支持短路原则

位运算符(不支持)

三目运算符(不支持)

条件分支语句

print("条件分支语句")-- if  条件 then ... end
if a > 6 thenprint("666")
elseif  a == 999 thenprint("123")
elseprint("555")
end

在lua中没有switch语句

循环语句

num = 0
--while
while num <555 doprint(num)num =num +1
end--do  while
repeatprint(num)
until num>555
--满足条件跳出,不同于C#中的进入条件--for语句
for i =1,5 doprint(i)
end
for i =1,5,2 doprint(i)
end

函数

function 函数名()

end

不同于c#,函数在声明之前,不能调用

无参无返回值

F2 = function()print("F1hanshu")
end
F2()

有参有返回值

F2 = function(a)print(a)
end
F2(1)
F2()
--不传参数,默认为空

如果传入的参数和函数参数个数不匹配,不会报错,只会补nil或者丢弃参数

F2 = function(a)return a ,"123",false
end
tt = F2(a)

多返回值时,在前面申明多个变量来截取,变量不够会接取对应位置的返回值

函数的类型

F2 = function()print("F1hanshu")
end
F2()
print(type(F2))

函数的重载

LUA中不支持函数的重载

变长参数

F2 = function(...)print("F1hanshu")
end
F2()

变长参数使用 先用一个表存起来 再来使用

函数嵌套

F2 = function()F6 =function()print(666);endreturn F9 print("F1hanshu")
endf9 =F2()
f9()

table表实现数组

所有的复杂类型本质上都是Table

数组:

a ={1,2,3,true,nil,"9916"}
print(a[1])
--lua中的索引从1开始

获取数组长度

--#是通用的获取长度的关键字
--在打印长度时,nil和其数组后面的数据将会被省略

自定义索引:

aa ={[0]=1,2,3,[-5]=4,5}
print(aa[-5])
print(#aa)
--输出为4 3

 迭代器遍历

主要是用于遍历表

#得到的长度,其实是不准确的 一般不会使用#来遍历表

aa ={[0]=1,2,3,[-5]=4,5}
--ipairs
for i ,k in ipairs(aa) doprint(i..k)
end

ipairs遍历还是从1开始遍历,小于等于0的值得不到,只能找到连续连续索引的键值

aa ={[0]=1,2,3,[-5]=4,5}
--pairs
for i ,v in pairs(aa) doprint(i..v)
end
--能把所有键都找到 通过键找到值

table表现字典

--字典的声明
a = {["name"]="Name",["anme"]=5}
print(a["name"])
--还可以类似.成员变量的形式得到值,但是不能是数字
print(a.name)--字典新增
a["newnew"]=666--模拟字典 遍历一定要使用pairs
for k,v in pairs(a) do--可以穿多个参数 一样可以打印出来print(k,v)
endfor _,v in pairs(a) do--遍历值print(v)
end

table实现类

lua中默认没有面向对象,需要自己去实现

Student ={age =1,sex=true,Up=function function_name(  )-- bodyprint("函数")end}print(Student.age)
Student.Up()

lua中.和:的区别在于,:调用方法时,会默认把调用者作为第一个参数传入方法中

表的公共操作

a = {{age =1 ,name ="123"},{age =2 ,name="456"}}
b={name ="54645",sex=false}--插入
table.insert(a,b);
--在a表中加入b--删除指定元素
--移除最后一个索引的内容
table.remove(a)--排序算法
t={5,9,54,5,7}
table.sort(t)

多脚本执行

全局变量与本地变量

--全局变量与本地变量
a = 1
b = 1
--以上都是全局变量for i=1,2 doc=1
end--c还是全局变量--本地变量的关键字是 local
fun =function()tt="123123"
end
fun()
print(tt)--能正常输出,是全局变量

多脚本执行

全局变量,只要执行过后,可以在任何脚本中进行调用

脚本卸载

如果是require("")加载执行的脚本,加载一次过后不会再执行

可以利用package.loaded["脚本名"]来判断脚本是否被执行

大G表

是一个总表,将我们声明的全部全局变量都储存在其中,本地变量不会存储

LUA的特殊用法

多变量赋值

l,g,c = 1 ,2 ,true
l,g,c=1,2
--多变量赋值后面的值不够会自动补空,多了会自动省略

多返回值

function Test()return 10,20,30
end
a,b,c =Test()

and 与 or

在lua中只有 nil 和 false才会被认为是假

lua模拟三目运算符

local res = (x>y) and x or b

协同程序

--coroutine.create()
fun = function()print(123)
end
--协程本质上是一个线程对象
lu=coroutine.create(fun)--coroutine.wrap()
ji = coroutine.wrap(fun)--协程运行
coroutine.resume(lu)
ji()--协程的挂起
fun2=function()while true doprint(123)--挂起函数coroutine.yield()end
endpeng =coroutine.create(fun2)
coroutine.resume(peng)

元表

任何表对象都可以作为另一个表变量的元表

当对子表中进行特定操作时,会执行元表中的内容

mega = {--当子表要被当作字符串使用时,会默认调用元表中的tostring方法__tostring =function(t)return t.nameend,--当子表被当作一个函数使用时,会默认调用__call中的内容__call =function(a,b)print(a)print(b)--默认第一个参数是调用自己end
}
myMega = {name = "666"
}
--设置元表函数
--第一个为子表,第二个为夫表
setmetatable(myMega,mega)print(myMega)

LUA自带库

--系统时间
print(os.time())
print(os.time({year=2014,month=8,day=14}))local nowTime =os.data("*t")
--可以得到更多的信息--数学运算
print(math.abs(-1555))--弧度转角度
print(math.deg(math.pi))--向下取整
print(math.floor(-1555))--最小值
print(math.min(-1555,999))--小数分离
print(math.modf(1.5555))--随机数
math.randomseed(os.time())
print(math.random(100))--路径
print(package.path)
--打印LUA脚本加载路径

垃圾回收

--垃圾回收
lu={id=1,idd=2}
collectgarbage("count")
--获取当前lua占用内存数,返回千字节单位--进行垃圾回收
collectgarbage("collect")
print(collectgarbage("count"))--lua的垃圾回收机制和c#中类似,取消羁绊便成为垃圾--lua中有自动计时垃圾回收的方法,但不推荐在项目中使用

相关文章:

[unity]lua热更新——个人复习笔记【侵删/有不足之处欢迎斧正】

一、AssetBundle AB包是特定于平台的资产压缩包&#xff0c;类似于压缩文件 相对于RESOURCES下的资源&#xff0c;AB包更加灵活轻量化&#xff0c;用于减小包体大小和热更新 可以在unity2019环境中直接下载Asset Bundle Browser 可以在其中设置关联 AB包生成的文件 AB包文件…...

Springboot日常总结-@RestController和@Controller的区别

RestController和 Controlle是两种不同的控制器实现&#xff0c;它们的主要区别在于如何处理返回的数据和是否支持跳转到视图页面。 Controller 是一个基本的控制器注解&#xff0c;它允许你将一个类标记为一个Spring MVC控制器处理器。使用 Controller 的类中的方法可以直接返…...

MongoDB之客户端工具与核心概念及基本类型篇

MongoDB之客户端工具与核心概念及基本类型篇 文章目录 MongoDB之客户端工具与核心概念及基本类型篇1. MongoDB是什么?1. 关于MongoDB2. 相关客户端工具1. MongoDB Compass2. Studio 3T3. Navicat for MongoDB4. NoSQL Manager for MongoDB Professional 2.MongoDB相关概念2.1 …...

Essential C++ 编程基础

Essential C 前言1.1 如何撰写 C程序1.2 对象的定义与初始化1.3 撰写表达式1.4 条件语句和循环语句1.5 如何运用Array和Vector1.6 指针带来弹性1.7 文件的读写 前言 通过Essential C笔记的形式对C相关重点知识进行汇总&#xff0c;读者通读此系列文章就可以轻松的把该语言基础捡…...

07 Qt自绘组件:图片预览小组件ImageViewer

系列文章目录 01 Qt自定义风格控件的基本原则-CSDN博客 02 从QLabel聊起&#xff1a;自定义控件扩展-图片控件-CSDN博客 03 从QLabel聊起&#xff1a;自定义控件扩展-文本控件-CSDN博客 04 自定义Button组件&#xff1a;令人抓狂的QToolButton文本图标居中问题-CSDN博客 0…...

Groovy(第九节) Groovy 之单元测试

JUnit 利用 Java 对 Song 类进行单元测试 默认情况下 Groovy 编译的类属性是私有的,所以不能直接在 Java 中访问它们,必须像下面这样使用 setter: 编写这个测试用例余下的代码就是小菜一碟了。测试用例很好地演示了这样一点:用 Groovy 所做的一切都可以轻易地在 Java 程序…...

gprMax3.0随机介质建模

此处利用gprMax建立随机介质模型,采用matlab生成随机数组,保存为HDF5文件,此处为全代码,无需修改即可运行。在gprMax输入文件中使用#geometry_objects_read:读入自定义的随机模型 此文参考其他博主的自定义几何形状模块gprMax3.0建模时如何自定义目标的几何形状_#geomet…...

自动驾驶---行业发展及就业环境杂谈

进入21世纪以来&#xff0c;自动驾驶行业有着飞速的发展&#xff0c;自动驾驶技术&#xff08;L2---L3&#xff09;也逐渐落地量产到寻常百姓家。虽然最早期量产FSD的特斯拉有着深厚的技术积累&#xff0c;但是进入2010年以后&#xff0c;国内的公司也逐渐发展起来自己的自动驾…...

Matlab 矩阵基础

Matlab 基础 MATLAB 是“矩阵实验室matrix laboratory”的缩写。其他编程语言大多一次处理一个数字&#xff0c;MATLAB 主要用于处理整个矩阵和数组。 所有 MATLAB 变量都是多维数组&#xff0c;无论数据类型如何。矩阵是常用于线性代数的二维数组。 若要创建一个包含单行中…...

TikTok矩阵系统的功能展示:深入解析与源代码分享!

今天我来和大家说说TikTok矩阵系统&#xff0c;在当今数字化时代&#xff0c;社交媒体平台已成为人们获取信息、交流思想和娱乐放松的重要渠道&#xff0c;其中&#xff0c;TikTok作为一款全球知名的短视频社交平台&#xff0c;凭借其独特的创意内容和强大的算法推荐系统&#…...

Gradio Dataframe sort 问题

Gradio Dataframe sort 问题 1. 问题描述2. 解决办法(临时) 1. 问题描述 使用 Gradio Dataframe 显示表格数据时&#xff0c;默认每个列名右边会有个 sort icon&#xff0c;点击这个 sort icon 后&#xff0c;会按照该列进行升序或者降序排序。 问题点是&#xff0c;如果对表…...

【机器学习300问】24、模型评估的常见方法有哪些?

一、为什么要对模型进行评估&#xff1f; 对机器学习和神经网络的模型进行评估是至关重要的&#xff0c;原因如下&#xff1a; 得知模型的泛化能力&#xff1a; 模型评估的主要目的是了解模型在未见过的数据上的表现&#xff0c;即其泛化能力。这是因为模型的性能在训练数据上…...

ArcgisForJS如何将ArcGIS Server发布的点要素渲染为热力图?

文章目录 0.引言1.ArcGIS创建点要素2.ArcGIS Server发布点要素3.ArcgisForJS将ArcGIS创建的点要素渲染为热力图 0.引言 ArcGIS For JS 是一个强大的地理信息系统&#xff08;GIS&#xff09;工具&#xff0c;它允许开发者使用 JavaScript 语言来创建各种 GIS 应用。ArcGIS Ser…...

第 2 章 微信小程序的构成 (代码导读)断更,后续继续更新

2.1 小程序项目的基本结构 Hello World&#xff01;程序.mp4 文泉云盘 -- 图书二维码资源管理系统兆泰源二维码管理系统https://www.wqyunpan.com/resourceDetail.html?id284928&openIdoUgl9wdyNYHu9EcAe-GEwbQdZilY&qrcodeId242916&signc2lnbm1PUmNxSndPWGFOck…...

十一、Qt自定义Widget组件、静态库与动态库

一、自定义Widget组件 1、自定义Widget组件 使用步骤采用提升法&#xff08;promotion&#xff09;重新定义paintEvent事件 2、实现程序 &#xff08;1&#xff09;创建项目&#xff0c;基于QWidget &#xff08;2&#xff09;添加类&#xff0c;为Widget组件提升类 #inclu…...

八、ChatGPT能替代什么人?

上一讲关于ChatGPT的热炒&#xff0c;其实对于我们来说算是敲了敲警钟。 其实在今天&#xff0c;关于ChatGPT&#xff0c;最多人关注的一个问题就是&#xff1a;ChatGPT能取代人吗&#xff0c;或者说能抢人的饭碗么吗&#xff1f; 有人说不能&#xff0c;也有人说能&#xff08…...

QT C++实现点击按键弹出窗口并显示图片/视频|多窗口应用程序的设计和开发

一、介绍 首先&#xff0c;QT界面开发中主要大体分为2种多窗口的形式&#xff1a; 嵌入式&#xff1a; 新生成的窗口嵌入在主窗口内部独立窗口&#xff1a; 以弹窗形式的新窗口生成和展示 这里就讲解最简单的&#xff1a;点击案件后&#xff0c;跳出一个新窗口 二、代码实…...

shell和go实现:防火墙放行所有端口,唯独拦截80端口

shell 1.防火墙放行所有端口&#xff0c;唯独拦截80端口 1.1拦截 mkdir -p /data/shellscat > /data/shells/02nginx_close.sh <<-EOF #!/bin/bash# 检查Linux系统版本 linux_version$(cat /etc/redhat-release)# 根据Linux系统版本选择相应的防火墙开启命令和保存…...

QT信号槽实现分析

1.宏定义 qt中引入了MOC来反射&#xff0c;编译阶段变成 MOC–>预处理–>编译–>汇编–>链接 1-1、Q_OBJECT 这个宏定义了一系列代码&#xff0c;包括元对象和处理的函数 #define Q_OBJECT \public: \QT_WARNING_PUSH \Q_OBJECT_NO_OVERRIDE_WARNING \static c…...

【pytorch】tensor.detach()和tensor.data的区别

文章目录 序言相同点不同点测试实例应用 序言 .detach()和.data都可以用来分离tensor数据&#xff0c;下面进行比较pytorch0.4及之后的版本&#xff0c;.data仍保留&#xff0c;但建议使用.detach() 相同点 x.detach()和x.data返回和x相同数据的tensor&#xff0c;这个新的t…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...