Unity—lua基础语法
Lua
语言执行方式
编译型语言:代码在运行前需要使用编译器,先将程序源代码编译为可执行文件,再执行
C/C++ Java C# Go Objective-C
解释型语言(脚本语言)
需要提前安装编译语言解析器,运行时使用解析器执行代码
JavaScript Phthon PHP SQL Lua
特点:运行才能调试,运行速度稍慢,开发速度快
Lua是什么
一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能
Lua特点
轻量级,可扩展
使用领域
游戏行业
- 魔兽世界客户端,大话西游2等知名网游中有Lua的身影
- 现代众多热更新手游也常用Lua写游戏逻辑,便于做热更新
- Lua在skynet等现代网络游戏框架中有广泛应用
使用方式
需要高性能的程序部分,使用c/c++实现。需要快速实现功能部分,使用Lua实现
Unity3D:使用如xLua插件(API的Lua调用),实现游戏核心代码使用C#实现(打包时il2cpp,编译为c++),游戏逻辑使用Lua开发(王者荣耀)
Lua寄宿性的,寄在宿主语言下的一种语言
注释
Lua的单行注释--
Lua的多行注释—[[多行注释]]
定义变量
name="hxsd"--Lua会自动推到类型变量
print(name)
--内置变量
--特点:下划线加大写字母
print(_VERSION) --查看Lua的版本
--可以调用一个不存在的变量,值是nil,等同于C#中的null
print(id)
--销毁一个已经定义的变量
name=nil
--全局变量和局部变量
name1="abc"--全局
local name2="def"--局部
--一般开发中,轻易不会使用全局变量
local name="Unity"
--获得变量类型,使用type()
print(type(name))
输出:string
--获得type()返回值的类型
print(type(type(name)))
输出:string
--对于一个没有定义的变量获取类型
print(type(bb))
输出:nil
--判断一个未定义的变量
print(type(bb)=="nil")
输出:true
print(type(12))
输出:number
print(type(12.3))
输出:number
print(type(true))
输出:boolean
--type是函数结构,是一个代码片段,可以重复调用执行,有参数有返回值
--字符串操作
--单行定义字符串
local str1="abc"
local str2="def"
--多行定义字符串
--完全的还原字符串内部的定义结构,和换行符都是存储的
local str3=[[
one
two
]]
print(str3)
--Lua字符串拼接
print(str1..str2)
输出:abcdef
--Lua对两个字符串相加时,会将它们转换为数字类型,转换失败会报错,如果转换成功,则进行加运算后,得到数字结果
print("1"+"2")
输出:3
--获取字符串长度
print(#str1)
输出:3
--字符串相关函数
--string.函数名()
--字符串大写化
print(string.upper(str1))
输出:ABC
--字符串小写化
print(string.lower(str1))
输出:abc
--Lua支持多返回值
--Lua字符串的下标是从1开始的
--字符串查找
--(参数1:被查找的字符串,参数2:查找的内容,返回值:起始找到的位置下标和结束找到的位置下标)
print(string.find("abcdefg","cde"))
输出:3 5
--字符串反转
print(string.reverse("abcdefg"))
输出:gfedcba
--截取字符串
--方式一(提供起始位置下标,截取到结尾)
print(string.sub("abcdefg",3))
输出:cdefg
--方式二(提供起始位置下标,提供结束位置下标)
print(string.sub("abcdefg",3,6))
输出:cdef
--截取到倒数第二个字符
local data="abcdefghijklmn"
print(string.sub(data,3,#data-1))
输出:cdefghijklm
--字符串格式化
--参数一:需要被格式化的字符串,其中包含占位符,%d表示数字;参数二:填入格式化字符串中的内容
print(string.formar(" Im the %d player,other is %d",1,2))
输出:Im the 1 player,other is 2
--字符串重复
print(string.rep("abc",2))
输出:abcabc
--ASCI码转字符串
print(string.char(65))
输出:A
--字符串转ASCI码
print(string.byte("A"))
输出:65
--字符串替换
--参数一:原始字符串;参数二:需要替换的内容;参数三:替换后的内容
--返回值:替换结果,替换次数
print(string.gsub("abcd","bc","**"))
输出:a**d
--table表 lua不存在数组概念,一切皆表
local data={}
--起始索引是1开始
--类型可以混合
--索引值可以为负数
--即使索引从1开始,也可以赋值0索引
--索引可以断开
--初始化时,对于没有索引的值,索引是从1向上累加的
--初始化提供索引的赋值方法,[索引值]=数值
data={"abc",123,[-1]=100,[0]=99,[5]=233}
print(data[1])
输出:abc
print(data[2])
输出:123
print(data[-1])
输出:100
print(data[0])
输出:99
print(data[5])
输出:233
--获取数组长度
--这种方式,获得的是从1索引开始,索引连续的数据个数,中间断开,计数结束
--这种方式不稳定
print(#data)
输出:a**d
--修改某一个值
data[1]="def"
print(data[1])
输出:def
local data2={{"aa","bb"},{11,22}}
print(data2[2][1])
输出:11
--数组在Lua中是用Table实现的
--操作运算符
--2的3次方
print(2^3)
输出:8.0
--C#不等于 !=;Lua中 ~=
print(2~=3)
输出:true
--Lua没有++ --
local i=0;
i=i+1;
--Lua没有+=、-=、*=
--逻辑判定
local conl=true
if(conl)
then
print("条件1达成")
end
输出:条件1达成
if(false)
then
print("条件1达成")
else
print("else达成")
end
输出:else达成
if(false)
then
print("条件1达成")
elseif(true)
then
print("else if达成")
else
print("else达成")
end
输出:else if达成
if(true)
then
if(true)
then
print("进入第二层if")
end
end
输出:进入第二层if
--Lua没有swith,所以可以使用if-else if-else的结构代替
--循环
local num=1
while(num<3)--当满足条件时,进入循环
do
print(num)
num=num+1
end
--local修饰的num,虽然是局部变量,但是作用域为当前文件,所以在循环体内,可以取得值
输出:
1
2
local num=1
repeat
print(num)
num=num+1
until (num>5)--直到条件满足时,跳出循环
输出:
1
2
3
4
5
local data={"aa","bb","cc","dd","ee"}
--参数1:变量i的初始值,遍历lua表,使用
--参数2:增长到多少
--参数3:增长步长,默认为1
for i=1,#data,2
do
print(data[i])
end
输出:
aa
cc
ee
--倒序遍历
for i=#data,1,-1
do
print(data[i])
end
输出:
ee
dd
cc
bb
aa
--迭代器(遍历table)
local data={one="cc","aa","bb",[3]=3,[-1]=4,["two"]="dd"}
--[[
one是不加中括号的字符串索引,"aa”"bb""自动加1,2索引
[4]指定数字索引[-1]指定负数索引
["two"]是加中括号的字符串索引写法
]]
--连续索引数值迭代器
for k,v in ipairs(data)
do
print("k:"..k..",v:"..v)
end
输出:
k:1,v:aa
k:2,v:bb
k:3,v:3
--[[
迭代器就是指向table的指针
连续数字索引迭代器,只会获取从1开始的数字索引,
且必须索引是连续的才能持续获得值
此处的for结构,可以理解为C#的foreach结构
]]
--所有数值迭代器
for k,v in pairs(data)
do
print("k:"..k..",v:"..v)
end
输出:
k:1,v:aa
k:2,v:bb
k:one,v:cc
k:-1,v:4
k:two,v:dd
k:3,v:3
--脚本型语言都是从上往下依次执行的
--先定义再调用
--第一种声明函数
function func1()
print("这是func1")
end
func1()--先定义再调用,没有问题
输出:
这是func1
--将函数定义为一个变量,函数是一种数据类型
local func2=function ()
print("这是func2")
end
func2()
输出:
这是func2
local func3=function (a,b)
print(a+b)
end
--函数的调用,参数可以多余形参,但不能少于形参
func3(5,7)
func3(5,7,9)
输出:
12
12
local func4=function (...)
--将无固定参数,转换为table
--arg的作用域是func4函数体
local arg={...}
local total=0
for k,v in pairs(arg)
do
total=total+v
end
print(total)
end
func4(1,2,3)
func4(1,2,3,4,5)
输出:
6
15
function func5()
return 99,100
end
--将多返回值,同时赋值给两个变量
local num1,num2=func5()
print(num1)
print(num2)
输出:
99
100
--Table支持数字索引存储数据
--支持字符串索引(关联索引)存储数据
local data={one="cc","aa","bb",[4]=3,[-1]=4,["two"]="dd"}
print(data[2])
print(data["one"])
print(data.two)
输出:
bb
cc
dd
--因为函数是一种数据类型
--所以将func1索引下定义了一个函数
data.func1=function ()
print("data表中的func1函数")
end
--所以data.func1调用数据,是个函数,也就调用了函数
data.func1()
输出:
data表中的func1函数
data.func2=function ()
print(data.two)
end
data.func2()
输出:
dd
--第一种self调用写法
--[[
成员函数定义时,显式加入self变量,对应C#的this关键字
函数内部可以通过self变量获取当前table的其他值或函数
]]
data.func3=function (self)
print(self.two)
end
--调用时,必须使用“:”,因为":"调用,会对self关键字赋值
data:func3()
输出:
dd
--第二种self调用写法
--隐式给self赋值
function data:func4()
print("func4:"..self.two)
end
data:func4()
输出:
func4:dd
--作业一:获取表的长度
--思路:所有数组迭代器,在for循环里作基数
function table_count(t)
local count=0
for k,v in pairs(t)
do
count=count+1
end
return count
end
local data={one="cc","aa","bb",[4]=3,[-1]=4}
print(table_count(data))
输出:5
--作业二:使用函数将无固定值的参数进行排序(冒泡),并返回参数个数及数据构成的table
function maopao(...)
local nums={...}
for i=1,#nums
do
for j=1,#nums-1
do
if(nums[j]>nums[j+1])
then
local tmp=nums[j]
nums[j]=nums[j+1]
nums[j+1]=tmp
end
end
end
return nums
end
local t=maopao(7,1,23,8)
print(t[1])
print(t[2])
print(t[3])
print(t[4])
输出:
1
7
8
23
元表,子文件
相关文章:
Unity—lua基础语法
Lua 语言执行方式 编译型语言:代码在运行前需要使用编译器,先将程序源代码编译为可执行文件,再执行 C/C Java C# Go Objective-C 解释型语言(脚本语言) 需要提前安装编译语言解析器,运行时使用解析…...

目标检测 TaskAlignedAssigner 原理
文章目录 TaskAlignedAssigner 原理和代码使用示例 TaskAlignedAssigner 原理和代码 原理主要是结合预测的分类分数和边界框与真实标注的信息,找出与真实目标最匹配的锚点,为这些锚点分配对应的目标标签、边界框和分数。 TaskAlignedAssigner 是目标检…...
Qt popup窗口半透明背景
半透明弹窗需要paintEvent()接口支持 方法一:使用setStyleSheet设置半透明样式,如果是子窗口,则可注释构建函数内属性设置 class TranslucentWidget : public QWidget { public: explicit TranslucentWidget(QWidget *parent nullptr)…...

游戏:元梦之星游戏开发代码(谢苏)
《元梦之星》是一款轻松社交派对游戏,玩家们可以化身星宝,体验纯粹的游玩乐趣,收获简单的快乐。无论i人e人,都能轻松找到属于自己的社交方式。 《元梦之星》的快乐,可以是闯关夺冠时的激动,谁是狼人推理的巧妙,峡谷3V3打赢团战的爽感。也可以是星梦广场开…...

TCP协议原理与Java编程实战:从连接建立到断开的完整解析
1.TCP协议核心:面向连接的可靠通信基石 TCP(Transmission Control Protocol,传输控制协议)是互联网的“可靠信使”,属于传输层协议,其核心在于面向连接和可靠传输。它通过严谨的握手机制与数据控制逻辑&am…...
Linux的top命令使用
Linux系统中top命令详解及使用技巧 一、基础功能 top命令用于实时监控系统性能和进程活动,可查看以下信息: - CPU使用率 - 内存使用情况 - 进程状态信息 - 系统负载数据 二、使用步骤 1. 打开终端输入命令:top 2. 查看实时更新的数据界面&a…...
Spring Cloud Gateway 限流实践:基于 Redis 令牌桶算法的网关层流量治理
一、引言 在微服务架构中,API 网关作为流量枢纽,需对进入系统的请求进行精细化限流,以保护下游服务免受流量冲击。Spring Cloud Gateway 结合 Redis 实现的令牌桶算法,为网关层限流提供了高效、分布式的解决方案。本文将深入解析其原理、配置及实践优化。 二、技术栈与原…...
可视化大屏实现全屏或非全屏
通过点击按钮实现全屏和非全屏效果展示 代码如下: <template> //点击icon图片进入全屏或非全屏<img :src"screenStatus ? /src/assets/noFull.png : /src/assets/full.png" alt"" click"enterFullScreen" /> </te…...
java8函数式接口(函数式接口的匿名实现类作为某些方法的入参)
文章目录 前置介绍通过 lambda 表达式,使用匿名类,实现函数式接口函数式接口和回调函数的关系函数式接口的应用 前置介绍 是 Java 8 引入的核心概念之一,指的是 仅包含一个抽象方法的接口。它可以被 FunctionalInterface 注解标记࿰…...
linux自有服务
文章目录 [TOC](文章目录)linux自有服务概述systemctl管理服务命令CentOS 7 之前CentOS 7 常用自有服务ntpd或systemd-timesyncd时间同步服务ntp同步服务器原理ntpd时间同步操作systemd-timesyncd同步原理systemd-timesyncd时间同步操作 firewalld防火墙计划任务crontab CentOS…...
UniApp网页版集成海康视频播放器
注意:本人全部集成好后使用最新的海康平台下载插件进行替换后就不能预览视频 使用Uni插件进行集成:海康视频H5播放器组件 - DCloud 插件市场 CSDN资源下载:https://download.csdn.net/download/wangdaoyin2010/90910975 注意:初…...
Filter和Interceptor详解(一文了解执行阶段及其流程)
Filter和Interceptor的区别 Filter(过滤器)和 Interceptor(拦截器)都是用于在请求处理前后插入额外逻辑的组件,下面依次介绍,并额外介绍Spring Gateway的过滤器(GlobalFilter/GatewayFilter&am…...

鸿蒙仓颉开发语言实战教程:实现商城应用详情页
昨天有朋友提到鸿蒙既然有了ArkTs开发语言,为什么还需要仓颉开发语言。其实这个不难理解,安卓有Java和Kotlin,iOS先后推出了Objective-C和Swift,鸿蒙有两种开发语言也就不奇怪了。而且仓颉是比ArkTs更加灵活的语言,虽然…...

GitAny - 無需登入的 GitHub 最新倉庫檢索工具
地址:https://github.com/MartinxMax/gitany GitAny - 無需登入的 GitHub 專案搜尋工具 GitAny 是一款基於 Python 的工具,允許你在無需登入的情況下搜尋當天最新的 GitHub 專案。它支援模糊搜尋、條件篩選以及倉庫資料的視覺化分析。 安裝依賴 $ pip…...

在飞牛nas系统上部署gitlab
在飞牛nas系统上部署gitlab需要使用docker进行部署,如下将介绍详细的部署流程。 文章目录 1. docker镜像2. 拉取镜像3. 运行容器4. 运行和访问gitlab5. 一些小配置5.1 url问题5.2 ssh端口5.3 其他配置 1. docker镜像 首先需要找一个gitlab的docker镜像地址&#x…...

深入理解 Redis 哨兵模式
Redis 哨兵模式深度解析:从原理到实践的全流程指南 在分布式系统架构中,Redis 作为高性能的内存数据库,其哨兵模式(Sentinel)是保障服务高可用性的核心方案。本文将从基础概念、运行机制出发,结合具体配置…...
SQL进阶之旅 Day 4:子查询与临时表优化
文章标题 【SQL进阶之旅 Day 4】子查询与临时表优化 文章内容 开篇:SQL进阶之旅的第4天 在“SQL进阶之旅”系列中,第4天的主题是子查询与临时表优化。这是SQL开发中不可或缺的一部分,尤其在处理复杂查询时,合理使用子查询和临…...

[特殊字符]《Qt实战:基于QCustomPlot的装药燃面动态曲线绘制(附右键菜单/样式美化/完整源码)》
1、将qcustomplot.cpp qcustomplot.h放入工程目录下引入qcustomplot 2、代码 .h #if defined(_MSC_VER) #pragma execution_character_set(...

力扣-最大连续一的个数
1.题目描述 2.题目链接 1004. 最大连续1的个数 III - 力扣(LeetCode) 3.代码解答 class Solution {public int longestOnes(int[] nums, int k) {int zero0,length0;for(int left0,right0;right<nums.length;right){if(nums[right]0){zero;}while…...

无人机避障——深蓝学院浙大栅格地图以及ESDF地图内容
Occupancy Grid Map & Euclidean Signed Distance Field: 【注意】:目的是为了将有噪声的传感器收集起来,用于实时的建图。 Occupancy Grid Map: 概率栅格: 【注意】:由于传感器带有噪声,在实际中基于…...

Postman基础操作
1.Postman是什么? Postman是接口测试的工具,简单来说它能模拟浏览器对服务器的某个接口发起请求并接收响应数据。 1.1 Postman工作原理 2.Postman发送请求 2.1 发送GET请求 我们知道GET请求是没用请求体的,所以我们需要将请求参数写在Param…...

【MPC控制 - 从ACC到自动驾驶】3 MPC控制器设计原理与参数配置:打造ACC的“最强大脑”
【MPC控制 - 从ACC到自动驾驶】MPC控制器设计原理与参数配置:打造ACC的“最强大脑” 在Day 1,我们认识了ACC自适应巡航和MPC这位“深谋远虑的棋手”。Day 2,我们一起给汽车“画像”,建立了它的纵向动力学模型,并把它翻…...

Unity3D仿星露谷物语开发52之菜单页面
1、目标 创建菜单页面,可通过Esc键开启或关闭。 当把鼠标悬停在上面时它会高亮,然后当点击按钮时标签页会被选择。 2、 创建PauseMenuCanvas (1)创建Canvas 在Hierarchy -> PersistentScene -> UI下创建新的Cavans命名为…...
待定事项之存储数据
#### 部署云服务器  ### 部署云服务器完整步骤 1. **连接到云服务器** bash ssh root<服务器IP> 2. **创建项目目录结构** bash mkdir -p /var/www/three/study/待办事项 3. **克隆项目仓库** bash cd /var/www…...
电脑装的数据越多,会不会越重
在这个数字化飞速发展的时代,有一个看似荒诞却又引人深思的问题:电脑装的数据越多,会不会越重? 先来说说大家的普遍认知,我们通常认为数据只是一些虚拟的代码和信息,存放在电脑的硬盘或其他存储设备中&…...
君正Ingenic webRTC P2P库libyangpeerconnection7编程指南
概述 libyangpeerconnection7是一个实现P2P媒体传输/数据通道的一个轻量级的webRTC库,基于metaRTC7.0的传输模块构建,支持H264/H265视频编码,通过 P2P 连接为用户提供高效、低延迟的音视频和数据通信。 君正版libyangpeerconnection7可适用…...

MySQL——复合查询表的内外连
目录 复合查询 回顾基本查询 多表查询 自连接 子查询 where 字句中使用子查询 单行子查询 多行子查询 多列子查询 from 字句中使用子查询 合并查询 实战OJ 查找所有员工入职时候的薪水情况 获取所有非manager的员工emp_no 获取所有员工当前的manager 表的内外…...

小米玄戒O1架构深度解析(一):十核异构设计与缓存层次详解
前言 这两天,小米的全新SOC玄戒O1横空出世,引发了科技数码圈的一次小地震,那么小米的这颗所谓的自研SOC,内部究竟有着什么不为人知的秘密呢?我们一起一探究竟。 目录 前言1 架构总览1.1 基本构成1.2 SLC缺席的原因探…...
Numba模块的用法(高性能计算)
文章目录 介绍核心装饰器与基础用法@jit(nopython=True):最常用的编译装饰器@njit的简写编译时指定类型签名并行加速(parallel=True)@cuda.jit: GPU 编程(CUDA)向量化函数(@vectorize)性能优化技巧调试与常见问题调试模式常见错误适用场景与局限性实例:加速蒙特卡洛模拟…...
Kafka自定义分区策略实战避坑指南
文章目录 概要代码示例小结 概要 kafka生产者发送消息默认根据总分区数和设置的key计算哈希取余数,key不变就默认存放在一个分区,没有key则随机数分区,明显默认的是最不好用的,那kafka也提供了一个轮询分区策略,我自己…...