Unity开发游戏使用XLua的基础
Unity使用Xlua的常用编码方式,做一下记录
1、C#调用lua
1、Lua解析器
private LuaEnv env = new LuaEnv();//保持它的唯一性void Start(){env.DoString("print('你好lua')");//env.DoString("require('Main')"); 默认在resources文件夹下面//帮助我们清除lua中我们没有手动释放的对象 垃圾回收env.Tick();//销毁lua解释器,用的较少env.Dispose();}
2、自定义loader
private void Start(){//xlua路径重定向方法_env.AddLoader(MyLoader);_env.DoString("require('Main')");}private byte[] MyLoader(ref string filepath){//传入的filepath是 require执行的lua脚本文件名,在这里是mainstring path = Application.dataPath + "/Lua/" + filepath + ".lua";//判断文件是否存在if (File.Exists(path)){return File.ReadAllBytes(path);}else{Debug.Log("重定向失败,文件名为"+filepath);}return null;}
3、Lua管理器
/// <summary>
/// lua管理器
/// 提供lua解析器
/// 保证解析器的唯一性
/// </summary>
public class LuaMgr
{private static LuaMgr _instance;public static LuaMgr Instance{get{if (_instance==null){_instance = new LuaMgr();}return _instance;}}private LuaEnv _luaEnv;/// <summary>/// 得到lua中的_G/// </summary>public LuaTable Gloabl => _luaEnv.Global;/// <summary>/// 初始化/// </summary>public void Init(){if (_luaEnv!=null) return;_luaEnv = new LuaEnv();_luaEnv.AddLoader(MyLoader);_luaEnv.AddLoader(MyABLoader);}#region 标准内容/// <summary>/// 传入文件名,执行脚本/// </summary>/// <param name="fileName"></param>public void DoLuaFile(string fileName){string str = $"require('{fileName}')";DoString(str);}public void DoString(string str){if(_luaEnv==null){Debug.Log("解析器未初始化");return;}_luaEnv.DoString(str);}/// <summary>/// 释放lua垃圾/// </summary>public void Tick(){if(_luaEnv==null){Debug.Log("解析器未初始化");return;}_luaEnv.Tick();}/// <summary>/// 销毁解析器/// </summary>public void Dispose(){if(_luaEnv==null){Debug.Log("解析器未初始化");return;}_luaEnv.Dispose();_luaEnv = null;}//自动执行private byte[] MyLoader(ref string filepath){//传入的filepath是 require执行的lua脚本文件名,在这里是mainstring path = Application.dataPath + "/Lua/" + filepath + ".lua";//判断文件是否存在if (File.Exists(path)){return File.ReadAllBytes(path);}else{Debug.Log("重定向失败,文件名为"+filepath);}return null;}//重定向加载AB包中的lua脚本private byte[] MyABLoader(ref string filepath){//加载路径string path = Application.streamingAssetsPath + "/lua";//加载AB包AssetBundle ab=AssetBundle.LoadFromFile(path); TextAsset tx = ab.LoadAsset<TextAsset>(filepath+".lua");//加载Lua文件返回//加载lua文件,byte数组return tx.bytes;}//Lua脚本最终会放在ab包中,#endregion
}
4、全局变量获取
private void Start(){LuaMgr.Instance.Init();LuaMgr.Instance.DoLuaFile("Main");int i= LuaMgr.Instance.Gloabl.Get<int>("testNumber");var i2= LuaMgr.Instance.Gloabl.Get<bool>("testBool");var i3= LuaMgr.Instance.Gloabl.Get<float>("testFloat");var i4= LuaMgr.Instance.Gloabl.Get<string>("testString");//值拷贝不会修改lua中的值,可以用setLuaMgr.Instance.Gloabl.Set("testNumber",1000);i= LuaMgr.Instance.Gloabl.Get<int>("testNumber");Debug.Log("testNumber"+i);}
虽然lua中只有number一种数值类型,但是我们可以根据它具体的值,用对应的C#变量类型来存储
5、全局函数的获取
public delegate void CustomCall();
public delegate void CustomCall2(int a);
//加一个特性,只有添加特性才能被调用,,加完特性后还要一部分工作,就是点击Xlua->Generatedate
[CSharpCallLua]
public delegate int CustomCall3(int a);
[CSharpCallLua] //使用out来接
public delegate int CustomCall4(int a,out int b,out bool c,out string d,out int e);[CSharpCallLua] //使用ref来接
public delegate int CustomCall5(int a,ref int b,ref bool c,ref string d,ref int e);//变长函数,如果边长函数中类型多种多样,那就使用object
[CSharpCallLua]
public delegate void CustomCall6(string a,params int[] args);
public class Lesson5_CallFunction : MonoBehaviour
{ void Start(){LuaMgr.Instance.Init();// LuaMgr.Instance.DoString("require('Main')"); LuaMgr.Instance.DoLuaFile("Main");//无参无返回值var call1= LuaMgr.Instance.Gloabl.Get<UnityAction>("testFun1");call1();//有参有返回值var call2 = LuaMgr.Instance.Gloabl.Get<CustomCall3>("testFun2");// Debug.Log(call2(2));var call3 = LuaMgr.Instance.Gloabl.Get<Func<int,int>>("testFun2");// Debug.Log("Func: "+call3(2));//有参多返回值var call4 = LuaMgr.Instance.Gloabl.Get<CustomCall4>("testFun3");int b;bool c;string d;int e;// Debug.Log(call4(51,out b,out c,out d,out e));var call5 = LuaMgr.Instance.Gloabl.Get<CustomCall5>("testFun3");int b1 = 0;bool c1 = true;string d1="";int e1=0;// Debug.Log(call5(51,ref b1,ref c1,ref d1,ref e1));var call6 = LuaMgr.Instance.Gloabl.Get<CustomCall6>("testFun4");call6("你好",1,5,6,5,4);// LuaFunction lf = LuaMgr.Instance.Gloabl.Get<LuaFunction>("testFun4");// lf.Call("你好", 1, 5, 6, 5, 4);}
print("Variable启动")
-- 无参无返回
testFun1 = function()print("无参无返回")
end-- 有参有返回
testFun2 = function(a)print("有参有返回")return a + 1
end
-- 多返回
testFun3 = function(a)print("多返回")return 1, 2, false, "123", a
end
-- 变长参数
testFun4 = function(a, ...)print("变长参数")print(a)arg = { ... }for k, v in pairs(arg) doprint(k, v)end
end
6、List和Dictionary
private void Start(){LuaMgr.Instance.Init();LuaMgr.Instance.DoLuaFile("Main");#region ListList<int> list = LuaMgr.Instance.Gloabl.Get<List<int>>("testList");for (int i = 0; i < list.Count; i++){Debug.Log("----"+list[i]);}//不确定类型用objectList<object> list2 = LuaMgr.Instance.Gloabl.Get<List<object>>("testList2");for (int i = 0; i < list2.Count; i++){Debug.Log("----"+list2[i]);}#endregion#region 字典Dictionary<string, int> dic = LuaMgr.Instance.Gloabl.Get<Dictionary<string, int>>("testDic");foreach (var item in dic){Debug.Log(item.Key+"____"+item.Value);}Dictionary<object, object> dic2 = LuaMgr.Instance.Gloabl.Get<Dictionary<object, object>>("testDic2");foreach (var item in dic2){Debug.Log(item.Key+"____"+item.Value);}#endregion}
7、类映射table
//Lua
testClas={testInt=2,testBool=true,testFloat=1.2,testString="123",testFun=function()print("NIHAO")end
}
//C#
public class CallLuaClass
{//在类中去生命成员变量,名字要和lua那边一样//注意,。一定是公有的,不然不能赋值。//这个自定义中的变量可以多也可以少public int testInt;public bool testBool;public float testFloat;public string testString;public UnityAction testFun;//方法
}
public class Lesson7_Table : MonoBehaviour
{private void Start(){LuaMgr.Instance.Init();LuaMgr.Instance.DoLuaFile("Main");CallLuaClass callLuaClass = LuaMgr.Instance.Gloabl.Get<CallLuaClass>("testClas");Debug.Log(callLuaClass.testString);callLuaClass.testFun();}
}
8、接口映射table
注意接口是引用拷贝。改了值后,lua值也会改变
//接口中不允许有成员变量
//我们用属性
[CSharpCallLua]
public interface ICSharpCallInterface
{int testInt { get; set; }bool testBool { get; set; }float testFloat { get; set; }string testString { get; set; }UnityAction testFun { get; set; }
}public class Lesson_Interface : MonoBehaviour
{void Start(){LuaMgr.Instance.Init();LuaMgr.Instance.DoLuaFile("Main");ICSharpCallInterface callInterface = LuaMgr.Instance.Gloabl.Get<ICSharpCallInterface>("testClas");Debug.Log(callInterface.testFloat);}
}
9、luatable映射到table
//不过官方不建议使用luaTable和luaFunctionvoid Start(){LuaMgr.Instance.Init();LuaMgr.Instance.DoLuaFile("Main");LuaTable table = LuaMgr.Instance.Gloabl.Get<LuaTable>("testClas");Debug.Log(table.Get<int>("testInt"));table.Get<LuaFunction>("testFun").Call();table.Dispose();//使用完了dispose }
2、lua调用C#(重点)
用的较多。
1、Lua使用C#类
print("************Lua调用C#相关知识点*************")
-- lua中使用C#的类非常简单
-- 固定套路
-- Cs.命名空间.类名
-- Unity的类,比如GameObject Transform等等 ---CS.UnityEngine.类名-- 通过C#中的类,实例化一个对象,注意lua中没有new
-- 默认调用的相当于无参构造
local obj1 = CS.UnityEngine.GameObject()
local obj2 = CS.UnityEngine.GameObject("郑毅")-- 为了方便使用,并且节约性能,定义全局变量储存C#中的类
-- 相当于取了一个别名,这也是一种优化方式
GameObject = CS.UnityEngine.GameObject
local obj3 = GameObject("第三个")-- 类中的静态对象可以直接使用 .来调用
local obj4 = GameObject.Find("郑毅")
--得到对象中的成员变量,直接对象.就可以了
print(obj4.transform.position)
Vector3 = CS.UnityEngine.Vector3;
--使用对象中的成员方法,一定要加:
obj4.transform:Translate(Vector3.right)
print(obj4.transform.position)-- 调用自定义的类
local t = CS.Test()
t:Speak("你好")
--有命名空间的
local t = CS.MyClass.Test2()
t:Speak("你好")--继承mono的类
--继承mono的类是不能直接new的
--lua不支持使用无惨的泛型的
local obj5 = GameObject("加脚本测试")
-- Xlua提供了一个重要防范typeof 可以得到类的类型
obj5:AddComponent(typeof(CS.LuaCallC))
---- c#
public class Test
{public void Speak(string str){Debug.Log("test1"+str);}
}namespace MyClass
{public class Test2{public void Speak(string str){Debug.Log("test2"+str);}}
}
public class LuaCallC : MonoBehaviour
{}
2、枚举
PrimitiveType = CS.UnityEngine.PrimitiveType
GameObject = CS.UnityEngine.GameObject
local obj = GameObject.CreatePrimitive(PrimitiveType.Cube)---获取自定义美剧
myEnum=CS.MyEnum
local c=myEnum.Idle
print(c)
--枚举转换
--数值转枚举
local a=myEnum.__CastFrom(1)
print(a)
--字符串转枚举
local b=myEnum.__CastFrom("Atk ")
print(b)
3、调用C#数组和list和字典
public class Lesson
{public int[] array = new int[5] { 1, 2, 3, 4, 5 };public List<int> list = new List<int>();public Dictionary<int, string> dic = new Dictionary<int, string>();
}
local obj = CS.Lesson()
-- Lua使用数组相关知识
-- 长度
print(obj.array.Length)
print(obj.array[2])
--遍历,虽然lua索引是从1开始
--但是要按照C#来,从0开始
for i = 0, obj.array.Length - 1 doprint(obj.array[i])
end--创建数组 数组的底层是array类,使用静态方法CreateInstance
local array2 = CS.System.Array.CreateInstance(typeof(CS.System.Int32), 10)
print(array2.Length)---list
obj.list:Add(10)
obj.list:Add(20)
obj.list:Add(30)
obj.list:Add(40)for i = 0, obj.list.Count - 1 doprint(obj.list[i])
end
--创建list 相当于得到一个List<int>的一个类的别名,需要再实例化
local list_string = CS.System.Collections.Generic.List(CS.System.Int32)
local list3 = list_string()
list3:Add(50)
print(list3.Count)
print(list3[0])--- 字典
obj.dic:Add(1, "你好")
print(obj.dic[1])for k, v in pairs(obj.dic) doprint(k, v)
end--创建字典
local dicString=CS.System.Collections.Generic.Dictionary(CS.System.String,CS.UnityEngine.Vector3)
local dic2=dicString()
dic2:Add("001",CS.UnityEngine.Vector3.right)print(dic2["001"])---这里有个坑,自己创建的字典,这样是访问不到的
print(dic2:get_Item("001")) --只有通过这种方法才可以
dic2:set_Item("001",CS.UnityEngine.Vector3.up)
print(dic2:get_Item("001")) --只有通过这种方法才可以
print(dic2:TryGetValue("001"))--多返回值
4、拓展方法
//拓展方法
//拓展方法的写法
//想要在lua中使用拓展方法,一定要在工具类前面加上特性
//如果不加该特性,除了拓展方法以外,都不会报错
//但是lua是通过反射机制去调用C#类的,效率较低
//加上可提高性能
[LuaCallCSharp]
public static class Tools
{public static void Move(this Lesson4 obj){Debug.Log(obj.name+"移动");}
}
public class Lesson4
{public string name = "名称";public void Speak(string str){Debug.Log(str);}public static void Eat(){Debug.Log("吃东西");}
}
public class LuaCallC : MonoBehaviour
{private void Start(){Lesson4 lesson4 = new Lesson4();lesson4.Move();//拓展方法,对象可以直接调用}
}
Lesson4 = CS.Lesson4
Lesson4.Eat()
--成员方法
local a = Lesson4()
a:Speak("说话了啊")
--使用拓展方法
a:Move()
5、ref out
public class Lesson5
{public int RefFun(int a,ref int b,ref int c,int d){b = a + d;c = a - d;return 100;}public int OutFun(int a,out int b,out int c,int d){b = a;c = d;return 200;}public int RefOutFun(int a,out int b,ref int c){b = a * 10;c = a * 20;return 300;}
}
Lesson5 = CS.Lesson5
local obj = Lesson5()--ref 参数会以多返回值的形式返回给lua
local a, b, c = obj:RefFun(1, 0, 0, 1)
print(a)
print(b)
print(c)--out 参数会以多返回值的形式返回给lua
--out参数不需要传占位置的值
local a, b, c = obj:OutFun(1, 30)
print(a)
print(b)
print(c)--综合起来
-- out不用占位值 ref需要占位
local a, b, c = obj:OutFun(1, 30)
print(a)
print(b)
print(c)
6、C#函数重载
public class Lesson6
{public int Cal(){return 100;}public int Cal(int a,int b){return a + b;}public int Cal(int a){return a;}public float Cal(float a){return a;}
}
Lesson6 = CS.Lesson6
local obj = Lesson6()print(obj:Cal())
print(obj:Cal(1))
print(obj:Cal(15,20))
--对于C#中多精度的重载函数支持不好
print(obj:Cal(1.25))--如果要解决重载函数模糊不清的问题
--xlua提供了解决方案,反射机制,但这种方法只做了解
--另外,能不用就不用
local m2 = typeof(CS.Lesson6):GetMethod("Cal", { typeof(CS.System.Single) })
--通过xlua提供的一个方法,把它转换成lua函数来使用。
--一般我们转一次,然后重复使用
local f2 = xlua.tofunction(m2)
print(f2(obj,10.2))
7、委托 事件
public class Lesson8
{public UnityAction del;public event UnityAction eventAction;public void DoEvent(){if (eventAction != null) eventAction();}
}
Lesson8 = CS.Lesson8
local obj = Lesson8()-- 委托
local func=function()print("这是lua函数")
end
-- 注意lua没有复合运算符,没有+=
-- 如果第一次往委托中加函数,因为是niu 不能直接+
-- 所以第一次 要先等=
obj.del=func
--第二次可以
obj.del=obj.del+func
obj.del()
--委托清除
obj.del=nil---事件,事件和委托特别不一样
---有点类似于成员方法
obj:eventAction("+",func)
obj:DoEvent()
--事件不能直接设置为空
8、二维数组
使用GetValue获取
[LuaCallCSharp]
public class Book : MonoBehaviour
{public int[,] INTArray;void Awake(){INTArray = new int[3, 3]{{1,2,3},{2,4,5},{6,7,8}};}public int GetArrayValue(int x,int y){return INTArray[x, y];}public void SetArrayValue(int x,int y,int value){INTArray[x, y] = value;}
}local book = CS.Book
local go = GameObject("二维数组")local obj = go:AddComponent(typeof(book))-- 调用 GetArrayValue 方法
local c = obj:GetArrayValue(1, 1)
print(c)
9、nil
PrimitiveType=CS.UnityEngine.PrimitiveType
Rigidbody=CS.UnityEngine.Rigidbody
local GameObject = CS.UnityEngine.GameObject;
local obj = GameObject("Cube")
local obj2 = GameObject.CreatePrimitive(PrimitiveType.Cube)
local rig = obj2:GetComponent(typeof(Rigidbody))
-- nil和Null没法进行 == 比较
if rig == nil thenprint("空啊")
end
print("不为空吗")--可用这样
if rig:Equals(nil) thenobj2:AddComponent(typeof(Rigidbody))
end
-- 全局函数
print(IsNull(rig))
-- 在C#中
print(rig:Equ())
-- 判断全局函数
function IsNull(obj)if obj==nil or obj:Equals(nil) thenreturn trueendreturn false
end
10、C# 扩展方法
[LuaCallCSharp]
public static class ObjTest
{public static bool Equ(this Object obj){return obj==null;}
}
11、特殊问题
CSharpCallLua :委托、接口
LuaCallCSharp:拓展方法时、建议每个类都加
无法为系统类或者第三方库代码加上这两个特性
Obj = CS.UnityEngine.GameObject
Ui = CS.UnityEngine.UI
local sid=Obj.Find("Slider")
local sliders=sid:GetComponent(typeof(Ui.Slider))
sliders.onValueChanged:AddListener(function(f)print("你好")
end)---------------------------------------------------------------
public static class Lesson10
{[CSharpCallLua]public static List<Type> cSharpCallLua = new List<Type>(){typeof(UnityAction<float>)};[LuaCallCSharp]public static List<Type> luaCallCSharp=new List<Type>(){typeof(GameObject)};
}
----------------------------------------------------------------
local ani=Obj.Find("Btn")
local btn=ani:GetComponent(typeof(Ui.Button))
btn.onClick:AddListener(function()print("鼠标点击了")
end)---还可以这样
local c=CS.UnityEngine.Events.UnityAction(function()print("鼠标点击了")
end)
12、协程
--xlua提供的一个工具表,一定要通过require调用后才能用
local util=require('xlua.util')
GameObject = CS.UnityEngine.GameObject
WaitForSeconds = CS.UnityEngine.WaitForSeconds
--在场景中创建一个空物体,然后添加一个脚本
local obj = GameObject("Coroutine")
local mono = obj:AddComponent(typeof(CS.LuaCallC))
--希望用来被开启的协程函数
fun = function()local a = 1while true docoroutine.yield(WaitForSeconds(1))print(a)a = a + 1if a>10 then--关闭协程mono:StopCoroutine(b)endend
end
--我们不能直接将lua函数传入到开启协程中
--如果要把lua函数当做协程函数传入
--必须先调用xlua.util 中的cs_generator(fun)
b=mono:StartCoroutine(util.cs_generator(fun))
13、泛型
支持有约束有参数的泛型函数
不支持没有约束的泛型番薯
不支持有约束,但是没有参数的泛型函数
不支持非Class的约束
public class Lesson12
{public class TestFather{}public class TestChild:TestFather{}public void TestFun1<T>(T a,T b) where T:TestFather{Debug.Log("有参数有约束的泛型方法");}public void TestFun2<T>(T a,T b) {Debug.Log("有参数无约束的泛型方法");}public void TestFun3<T>(T a) {Debug.Log("有参数");}public void TestFun3<T>() where T:TestFather{Debug.Log("有参数");} }
local obj=CS.Lesson12()
local child=CS.Lesson12.TestChild()
local father=CS.Lesson12.TestFather()------------默认情况下支持----------
--支持有约束有参数的泛型函数
obj:TestFun1(child,father)
-----------------------------------注意 如果是mono 这种方式支持使用
--但是如果是iLcpp打包 泛型参数是引用类型才可以--要使得可用用
--设置泛型类型再使用
local testFun2=xlua.get_generic_method(CS.Lesson12,"TestFun3")
local testFun2_R=testFun2(CS.System.Int32)
--调用
testFun2_R(obj,10)--设置泛型类型再使用
local testFun3=xlua.get_generic_method(CS.Lesson12,"TestFun2")
local testFun3_R=testFun3(CS.System.Int32)
--调用
testFun3_R(obj,10,20)
相关文章:
Unity开发游戏使用XLua的基础
Unity使用Xlua的常用编码方式,做一下记录 1、C#调用lua 1、Lua解析器 private LuaEnv env new LuaEnv();//保持它的唯一性void Start(){env.DoString("print(你好lua)");//env.DoString("require(Main)"); 默认在resources文件夹下面//帮助…...
什么是区块链
区块链是一种去中心化的分布式账本技术,它通过一系列复杂而精密的设计原则和机制来确保数据的安全性、透明性和不可篡改性。在最基础的层面上,区块链是由一系列按照时间顺序链接起来的数据块组成的链式结构。每个数据块中包含了一定数量的交易记录或状态…...
C++中的析构器(Destructor)(也称为析构函数)
在C中,析构器(Destructor)也称为析构函数,它是一种特殊的成员函数,用于在对象销毁时进行资源清理工作。以下是关于C析构器的详细介绍: 析构函数的特点 名称与类名相同,但前面有一个波浪号 ~&a…...
【ts + java】古玩系统开发总结
src别名的配置 开发中文件和文件的关系会比较复杂,我们需要给src文件夹一个别名吧 vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vitejs.dev/config/ export default defineConfig({pl…...
NLP深度学习 DAY5:Sequence-to-sequence 模型详解
Seq2Seq(Sequence-to-Sequence)模型是一种用于处理输入和输出均为序列任务的深度学习模型。它最初被设计用于机器翻译,但后来广泛应用于其他任务,如文本摘要、对话系统、语音识别、问答系统等。 核心思想 Seq2Seq 模型的目标是将…...
音视频多媒体编解码器基础-codec
如果要从事编解码多媒体的工作,需要准备哪些更为基础的内容,这里帮你总结完。 因为数据类型不同所以编解码算法不同,分为图像、视频和音频三大类;因为流程不同,可以分为编码和解码两部分;因为编码器实现不…...
数据分析系列--⑦RapidMiner模型评价(基于泰坦尼克号案例含数据集)
一、前提 二、模型评估 1.改造⑥ 2.Cross Validation算子说明 2.1Cross Validation 的作用 2.1.1 模型评估 2.1.2 减少过拟合 2.1.3 数据利用 2.2 Cross Validation 的工作原理 2.2.1 数据分割 2.2.2 迭代训练与测试 2.2.3 结果汇总 …...
【react+redux】 react使用redux相关内容
首先说一下,文章中所提及的内容都是我自己的个人理解,是我理逻辑的时候,自我说服的方式,如果有问题有补充欢迎在评论区指出。 一、场景描述 为什么在react里面要使用redux,我的理解是因为想要使组件之间的通信更便捷…...
nacos 配置管理、 配置热更新、 动态路由
文章目录 配置管理引入jar包添加 bootstrap.yaml 文件配置在application.yaml 中添加自定义信息nacos 配置信息 配置热更新采用第一种配置根据服务名确定配置文件根据后缀确定配置文件 动态路由DynamicRouteLoaderNacosConfigManagerRouteDefinitionWriter 路由配置 配置管理 …...
前端知识速记:节流与防抖
前端知识速记:节流与防抖 什么是防抖? 防抖是一种控制事件触发频率的方法,通常用于处理用户频繁触发事件的场景。防抖的核心思想是将多个连续触发事件合并为一个事件,以减少执行次数。它在以下场景中特别有效: 输入…...
2.攻防世界PHP2及知识点
进入题目页面如下 意思是你能访问这个网站吗? ctrlu、F12查看源码,什么都没有发现 用kali中的dirsearch扫描根目录 命令如下,根据题目提示以及需要查看源码,扫描以php、phps、html为后缀的文件 dirsearch -u http://61.147.17…...
【ubuntu】双系统ubuntu下一键切换到Windows
ubuntu下一键切换到Windows 1.4.1 重启脚本1.4.2 快捷方式1.4.3 移动快捷方式到系统目录 按前文所述文档,开机默认启动ubuntu。Windows切换到Ubuntu直接重启就行了,而Ubuntu切换到Windows稍微有点麻烦。可编辑切换重启到Windows的快捷方式。 1.4.1 重启…...
C#属性和字段(访问修饰符)
不同点逻辑性/灵活性存储性访问性使用范围安全性属性(Property)源于字段,对字段的扩展,逻辑字段并不占用实际的内存可以被其他类访问对接收的数据范围做限定,外部使用增加了数据的安全性字段(Field)不经过逻辑处理占用内存的空间及位置大部分字段不能直接被访问内存使用不安全 …...
Androidstdio-真机调试
显示隐藏设备 手机通过数据线插入电脑 Androidstdio设置中下载USB驱动 选择下载的驱动 更新完成后,在编译器查看,此时真机已经显示出来了 调试app可以在日志中查看日志,详细日志查看方法看前面的帖子 如果有这种日志输出,运行到此…...
2025年美赛B题-结合Logistic阻滞增长模型和SIR传染病模型研究旅游可持续性-成品论文
模型设计思路与创新点: 建模的时候应该先确定我们需要建立什么类的模型?优化类还是统计类?这个题需要大量的数据分析,因此我们可以建立一个统计学模型。 统计学建模思路:观察规律,建立模型,参…...
数据结构【链栈】
基于 C 实现链表栈:原理、代码与应用 一、引言 栈就是一个容器,可以当场一个盒子,只能一个一个拿,一个一个放,而且是从上面放入。 有序顺序栈操作比较容易【会了链栈之后顺序栈自然明白】,所以我们这里只…...
MediaPipe与YOLO已训练模型实现可视化人脸和手势关键点检测
项目首页 - ZiTai_YOLOV11:基于前沿的 MediaPipe 技术与先进的 YOLOv11 预测试模型,精心打造一款强大的实时检测应用。该应用无缝连接摄像头,精准捕捉画面,能即时实现人脸检测、手势识别以及骨骼关键点检测,将检测结果实时、直观地…...
使用 SpringBoot+Thymeleaf 模板引擎进行 Web 开发
目录 一、什么是 Thymeleaf 模板引擎 二、Thymeleaf 模板引擎的 Maven 坐标 三、配置 Thymeleaf 四、访问页面 五、访问静态资源 六、Thymeleaf 使用示例 七、Thymeleaf 常用属性 前言 在现代 Web 开发中,模板引擎被广泛用于将动态内容渲染到静态页面中。Thy…...
pytorch深度Q网络
人工智能例子汇总:AI常见的算法和例子-CSDN博客 DQN 引入了深度神经网络来近似Q函数,解决了传统Q-learning在处理高维状态空间时的瓶颈,尤其是在像 Atari 游戏这样的复杂环境中。DQN的核心思想是使用神经网络 Q(s,a;θ)Q(s, a; \theta)Q(s,…...
list的使用,及部分功能的模拟实现(C++)
目录(文章中"节点"和"结点"是同一个意思) 1. list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list…...
makailio-alias_db模块详解
ALIAS_DB 模块 作者 Daniel-Constantin Mierla micondagmail.com Elena-Ramona Modroiu ramonaasipto.com 编辑 Daniel-Constantin Mierla micondagmail.com 版权 © 2005 Voice Sistem SRL © 2008 asipto.com 目录 管理员指南 概述依赖 2.1 Kamailio 模块 2.2 外…...
【AI】DeepSeek 概念/影响/使用/部署
在大年三十那天,不知道你是否留意到,“deepseek”这个词出现在了各大热搜榜单上。这引起了我的关注,出于学习的兴趣,我深入研究了一番,才有了这篇文章的诞生。 概念 那么,什么是DeepSeek?首先百…...
算法随笔_35: 每日温度
上一篇:算法随笔_34: 最后一个单词的长度-CSDN博客 题目描述如下: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升…...
人工智能入门课【手写自注意力机制】
原理 自注意力(Self-Attention)是一种强大的机制,广泛应用于自然语言处理、计算机视觉等领域,尤其是在Transformer架构中发挥了关键作用。它的核心思想是让模型能够动态地关注输入序列中不同位置之间的关系,从而更好地…...
记7(激活函数+多层神经网络+梯度下降法及其优化
目录 1、激活函数1.1、sigmoid函数:2端饱和,下面2个函数都要幂运算,运算速度会比较慢1.2、ReLU函数(Rectified Linear Unit,修正线性单元)1.3、PReLU函数(Parameteric Rectified Linear Unit&am…...
Qt u盘自动升级软件
Qt u盘自动升级软件 Chapter1 Qt u盘自动升级软件u盘自动升级软件思路:step1. 获取U盘 判断U盘名字是否正确, 升级文件是否存在。step2. 升级step3. 升级界面 Chapter2 Qt 嵌入式设备应用程序,通过U盘升级的一种思路Chapter3 在开发板上运行的…...
关于低代码技术架构的思考
我们经常会看到很多低代码系统的技术架构图,而且经常看不懂。是因为技术架构图没有画好,还是因为技术不够先进,有时候往往都不是。 比如下图: 一个开发者,看到的视角往往都是技术层面,你给用户讲React18、M…...
如何使用 ChatBox AI 简化本地模型对话操作
部署模型请看上一篇帖子:本地部署DeepSeek教程(Mac版本)-CSDN博客 使用 ChatBox AI 简化本地模型对话操作: 打开 ChatBox AI 官网:Chatbox AI官网:办公学习的AI好助手,全平台AI客户端…...
缩位求和——蓝桥杯
1.题目描述 在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。 比如:248153720248153720 把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是 1 位数,得 24814>145 156 56 而…...
hexo部署到github page时,hexo d后page里面绑定的个人域名消失的问题
Hexo 部署博客到 GitHub page 后,可以在 setting 中的 page 中绑定自己的域名,但是我发现更新博客后绑定的域名消失,恢复原始的 githubio 的域名。 后面搜索发现需要在 repo 里面添加 CNAME 文件,内容为 page 里面绑定的域名&…...
neo4j入门
文章目录 neo4j版本说明部署安装Mac部署docker部署 neo4j web工具使用数据结构图数据库VS关系数据库 neo4j neo4j官网Neo4j是用ava实现的开源NoSQL图数据库。Neo4作为图数据库中的代表产品,已经在众多的行业项目中进行了应用,如:网络管理&am…...
代码随想录——回溯
文章目录 组合组合总数电话号码的字母组合组合总数组合总数Ⅱ分割回文串复原IP地址子集子集Ⅱ非递减子序列去重的实现方法方法 1:**排序 跳过重复元素**方法 2:**使用哈希表或数组记录已使用的数字** 去重的完整示例总结本题代码 全排列全排列Ⅱ重新安排…...
独立游戏RPG回顾:高成本
刚看了某纪录片, 内容是rpg项目的回顾。也是这个以钱为核心话题的系列的最后一集。 对这期特别有代入感,因为主角是曾经的同事,曾经在某天晚上听过其项目组的争论。 对其这些年的起伏特别的能体会。 主角是制作人,在访谈中透露这…...
SQLModel入门
目录 概述快速开始官方教程简单使用样例 概述 SQLModel 是一个 ORM 框架,其基于 SQLAlchemy 和 Pydantic,其中 SQLALchemy 提供底层 ORM 能力,Pydantic 提供类型校验能力,SQLModel 中,一个 SQLModel model 既是一个 S…...
关于MySQL InnoDB存储引擎的一些认识
文章目录 一、存储引擎1.MySQL中执行一条SQL语句的过程是怎样的?1.1 MySQL的存储引擎有哪些?1.2 MyIsam和InnoDB有什么区别? 2.MySQL表的结构是什么?2.1 行结构是什么样呢?2.1.1 NULL列表?2.1.2 char和varc…...
【学习笔记】深度学习网络-正则化方法
作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。 在之前的文章中介绍了深度学习中用…...
NVIDIA (英伟达)的 GPU 产品应用领域
游戏娱乐领域 PC 游戏:NVIDIA 的 GeForce 系列 GPU 是 PC 游戏玩家的首选之一。能实现实时光线追踪、高分辨率渲染等,使游戏画面更加逼真,如《赛博朋克 2077》等支持光线追踪的游戏,在 NVIDIA GPU 的加持下,可呈现出真…...
Docker快速部署高效照片管理系统LibrePhotos搭建私有云相册
文章目录 前言1.关于LibrePhotos2.本地部署LibrePhotos3.LibrePhotos简单使用4. 安装内网穿透5.配置LibrePhotos公网地址6. 配置固定公网地址 前言 想象一下这样的场景:你有一大堆珍贵的回忆照片,但又不想使用各种网盘来管理。怎么办?别担心…...
goframe 多语言国际化解决方案
项目背景 本项目采用基于JSON配置的多语言国际化(i18n)解决方案,支持多种语言的无缝切换和本地化。 目录结构 manifest/ └── i18n/├── zh.json # 简体中文├── zh-tw.json # 繁体中文├── en.json # 英语├…...
mysql如何修改密码
在MySQL中修改密码可以通过多种方式完成,具体取决于你的MySQL版本和你是否有足够的权限。以下是一些常用的方法来修改MySQL用户的密码: 方法1: 使用ALTER USER命令 这是最常用的方法,适用于MySQL 5.7及以上版本。 ALTER USER usernameloca…...
17.2 图形绘制8
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 17.2.10 重绘 先看以下例子: 【例 17.28】【项目:code17-028】绘制填充矩形。 private void button1_Clic…...
Java基础知识总结(三十八)--读取数据
使用Reader体系,读取一个文本文件中的数据。返回 -1 ,标志读到结尾。 import java.io.*; class { public static void main(String[] args) throws IOException { /* 创建可以读取文本文件的流对象,让创建好的流对象和指定的文件相关联。…...
【并查集】
并查集(Disjoint Set Union,DSU)是一种用于处理不相交集合的数据结构,主要支持两种操作:查找(Find)和合并(Union)。它在解决连通性问题、图论问题以及动态连通性等问题时…...
SQL NOW() 函数详解
SQL NOW() 函数详解 引言 在SQL数据库中,NOW() 函数是一个常用的日期和时间函数,用于获取当前的时间戳。本文将详细介绍 NOW() 函数的用法、参数、返回值以及在实际应用中的注意事项。 函数概述 NOW() 函数返回当前的日期和时间,格式为 Y…...
[EAI-023] FAST,机器人动作专用的Tokenizer,提高VLA模型的能力和训练效率
Paper Card 论文标题:FAST: Efficient Action Tokenization for Vision-Language-Action Models 论文作者:Karl Pertsch, Kyle Stachowicz, Brian Ichter, Danny Driess, Suraj Nair, Quan Vuong, Oier Mees, Chelsea Finn, Sergey Levine 论文链接&…...
Rust 条件语句
Rust 条件语句 在编程语言中,条件语句是进行决策和实现分支逻辑的关键。Rust 语言作为一门系统编程语言,其条件语句的使用同样至关重要。本文将详细介绍 Rust 中的条件语句,包括其基本用法、常见场景以及如何避免常见错误。 基本用法 Rust…...
Windows 上安装 PostgreSQL
Windows 上安装 PostgreSQL PostgreSQL 是一款功能强大的开源对象-关系型数据库系统,它具有出色的扩展性和稳定性。本文将详细介绍在 Windows 操作系统上安装 PostgreSQL 的步骤和注意事项。 1. 准备工作 在开始安装 PostgreSQL 之前,请确保您的计算机满足以下要求: 操作…...
UE 5.3 C++ 对垃圾回收的初步认识
一.UObject的创建 UObject 不支持构造参数。 所有的C UObject都会在引擎启动的时候初始化,然后引擎会调用其默认构造器。如果没有默认的构造器,那么 UObject 将不会编译。 有修改父类参数的需求,就使用指定带参构造 // Sets default value…...
解码,蓝桥杯2020G
a2b 解码后:aab #include<iostream> using namespace std; typedef struct Node {char data;int size;Node* next; }Node,*Linklist; char* scan(char str[],int size) {int i 0;Linklist head new Node;Linklist rear head;while (i<size-1) {Lin…...
【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)
✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:贪心算法篇–CSDN博客 文章目录 一.贪心算法1.什么是贪心算法2.贪心算法的特点 二.例题1.柠…...