PP——实践项目笔记
PP——实践项目笔记
Unity上线塔防游戏【智械危机】程序、策划、美术全解析
CS——CSharp笔记
CS——CSharp笔记
C#
C#是一种新式编程语言,不仅面向对象,还类型安全。
开发人员利用 C# 能够生成在 .NET 中运行的多种安全可靠的应用程序。
C# 源于 C 语言系列,C、C++、Java 和 JavaScript 程序员很快就可以上手使用。
C# 是面向对象的、面向组件的编程语言。
C# 提供了语言构造来直接支持这些概念,让 C# 成为一种非常自然的语言,可用于创建和使用软件组件。
自诞生之日起,C# 就添加了支持新工作负载和新兴软件设计实践的功能。
C# 本质上是面向对象的语言。 你需要定义类型及其行为。
C# 文档 - 入门、教程、参考。 | Microsoft Learn
笔记代号CS——即C Sharp的缩写
C#前四部曲是学习Unity的前置内容,唯有掌握该内容才能编写Unity的脚本
本笔记包括以下系列
C#入门 - 基本代码逻辑
C#基础 - 函数,复杂数据类型,值与引用,排序算法入门
C#核心 - 面向对象
C#进阶 - 数据结构,泛型,委托与事件,协变逆变,多线程,预处理器指令,反射与特性,排序算法进阶(未迁移)
C#知识补充 - .Net, ...
UH2S2——xLua
UH2S2——xLua
xLua
xLua是由腾讯维护的一个开源项目,xLua为Unity、.Net、Mono等C#环境增加Lua脚本编程的能力,
借助xLua,这些Lua代码可以方便的和C#相互调用。
自2016年初推广以来,已经应用于十多款腾讯自研游戏,因其良好性能、易用性、扩展性而广受好评。
现在,腾讯已经将xLua开源到GitHub。其git地址是:https://github.com/Tencent/xLua。
本系列学习内容
xLua框架导入和AB包相关准备
C#调用Lua
Lua解析器
Lua文件加载重定向
Lua解析器管理器
全局变量获取
全局函数获取
表映射到List和Dictionary
表映射到类
表映射到接口
表映射到LuaTable
Lua调用C#
C#类
枚举
数组、List和Dictionary
拓展方法
带out和ref的函数
重载函数
委托和事件
特殊问题
二维数组遍历
null和nil比较
让系统类型和Lua能互相访问
协程
泛型函数
xLua热补丁(Lua替换C#脚本内逻辑)
...
UH2S1L13——垃圾回收
UH2S1L13——垃圾回收
Lua垃圾回收
垃圾回收的关键字是collectgarbage,通过传入特定的字符串使用
本章代码关键字
123collectgarbage() --这个函数是垃圾收集器的通用接口。 通过参数 opt 它提供了一组不同的功能。collectgarbage("count") --以K字节数为单位返回 Lua 使用的总内存数collectgarbage("collect") --做一次完整的垃圾收集循环
获取内存占用
以 K 字节数为单位返回 Lua 使用的总内存数,用返回值*1024,就可以得到具体的内存占用字节数
12test = {id = 1, name = "123123"}print(collectgarbage("count"))
进行垃圾回收
做一次完整的垃圾收集循环,将内存内未被变量引用的数据释放掉,类似于C#的GC
lua中,有自动定时进行GC的方法,但是在Unity中进行热更新开发,尽量不要使用 ...
UH2S1L13——自带库
UH2S1L13——自带库
本章代码关键字
123456789101112131415os.time() --返回时间戳,没有任何参数,就会返回当前时间的时间戳,传入包含year, month, day域的表,返回指定时间的时间戳os.date("*t") --返回一个包含当前时间的表,里面有各种时间单位math.abs() --绝对值math.pi --π的值math.deg() --弧度转角度math.cos() --三角函数math.floor() --向下取整math.ceil() --向上取整math.max() --最大值math.min() --最小值math.modf() --分离整数与小数math.randomseed() --设置随机数种子math.random() --随机数math.sqrt( ...
UH2S1L12——Lua的面向对象
UH2S1L12——Lua的面向对象
Lua的面向对象
Lua没有原生的面向对象实现,因此我们必须借助表和元表自行实现面向对象
我们不仅要实现类(包括成员变量与方法,还要构造方法),还要实现面向对象有三大特性,封装、继承、多态
本章实现
12345678910111213141516171819-- 万物之父Object,所有的类都继承自它,提供最基础的继承与实例化方法Object = {}-- 类的实例化方法,返回实例化的对象function Object:new() local obj = {} self.__index = self setmetatable(obj, self) return objend-- 声明新的类的方法,需要继承哪个类就让哪个类执行该方法,声明出来的类会自动声明base成员变量,指向其父类function Object:subClass(className) _G[className] = {} local newClass = _G[className] ...
UH2S1L11——元表
UH2S1L11——元表
元表
任何表变量都可以作为另一个表变量的元表,任何表变量都可以有自己的元表
当我们对有元表的表中进行一些特定操作时,会执行其元表中的内容,即元表内存储的特定方法将改变其对应表的特定方法
在Lua的 table 中我们可以访问对应的 key 来得到 value 值,但是却无法对两个 table 进行操作(比如相加)。
因此 Lua 提供了元表(Metatable),允许我们改变 table 的行为,每个行为关联了对应的元方法。
例如,使用元表我们可以定义 Lua 如何计算两个 table 的相加操作 a+b。
当 Lua 试图对两个表进行相加时,先检查两者之一是否有元表,之后检查是否有一个叫 __add 的字段,
若找到,则调用对应的值。 __add 等即时字段,其对应的值(往往是一个函数或是 table)就是"元方法"。
———— Lua 元表(Metatable) | 菜鸟教程 (runoob.com)
本章代码关键字
123456789setmetatable() --设置元表getmetatable() ...
UH2S1L10——协同程序
UH2S1L10——协同程序
协同程序概念已在Unity基础讲过,这里不再赘述
本章代码关键字
123456coroutine.create() --创建协程,返回thread类型变量coroutine.wrap() --创建协程,返回function类型变量coroutine.yield() --挂起协程,参数用于返回协程coroutine.resume() --启动thread类型的协程变量,返回协程运行是否成功和协程返回值coroutine.status() --检测thread类型的协程变量的运行状态coroutine.running() --返回当前正在运行的协程的协程号
协程的创建
使用coroutine.create传入作为协程的函数,创建协程,检查类型发现其变量类型为thread
123456function Fun() print(123)endlocal co = coroutine.create(Fun)print(type(co))
1thread
使用coroutin ...
UH2S1L9——特殊用法
UH2S1L9——特殊用法
本章代码关键字
1... and ... or ... --使用Lua的and与or的特性,模拟的一个三目运算符
多变量赋值
一行代码可以为多个变量赋值,如果后面的值不够,则后面的变量自动补空,如果后面的值过多,则多余的值被忽略
123456789101112131415print("**********多变量赋值************")local a, b, c = 1, 2, "123"print(a)print(b)print(c)local a, b, c = 1, 2print(a)print(b)print(c) --nillocal a, b, c = 1, 2, 3, 4, 5, 6print(a)print(b)print(c)
12345678910**********多变量赋值************1212312nil123
多返回值
函数可以返回多个值,用几个变量接收就有几个值,如果少了,就少接几个,如果多了就自动补空
12345678910111213141516pr ...
UH2S1L9——多Lua脚本执行
UH2S1L9——多Lua脚本执行
本章代码关键字
12345local --声明局部变量return --脚本返回值,外部加载该脚本时可以接收这里的返回值require() --加载一个脚本,若加载脚本有返回值还可以返回出这个值package.loaded[] --可以查看某个脚本是否被加载,将其赋值nil可以卸载某个脚本_G --_G表是一个总表,我们申明的所有全局变量都存储在其中
全局变量和本地变量
全局变量
Lua默认声明出来的变量是全局变量,这是一种声明出来后就可以在脚本里到处调用的变量,
即使它是在循环体或者函数体内声明的变量,出了循环或者函数仍然可以使用,不会释放内存
显然到处使用全局变量是很浪费内存的
1234567891011for i = 1, 2 do c = "唐老狮"endprint(c) --这个c在出了循环体后依然可以调用function Fun() tt = "1231231 ...