【Unity笔记】Lua基础语法_unity lua语法-程序员宅基地

技术标签: unity  Lua  lua  开发语言  

在线调试工具

菜鸟教程

语言

编译语言

  • 先编译在运行
  • 编译过程中会发现问题

脚本语言

  • 不运行看不到问题
  • 功能更新,更新C#,快速修正问题

Lua

  • lua是一种轻量小巧的语言,用标准的C语言编写并以源码形式开放
  • 设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和制定功能

Lua特点

  • 轻量级:标准C语言编写并开放源码,编译后仅一百余K
  • 扩展性,Lua提供了易于使用扩展的接口和机制,由宿主语言(通常是C或者C++)提供一部分功能,Lua可以使用他们,就行是本来就是内置功能一样
  • 使用领域
    • 游戏行业
    • web领域(Nginx)服务器
    • 嵌入式,自动驾驶等
  • 可以与其他语言通讯,C#调用C++,C++调用Lua

基础语法

01输出

print("测试")
print("aabcdefg")
print("xxxxx","第二个参数","第三个参数")

02注释

print("这段代码会运行")
--print("我被注释掉了,所以不会运行")
--[[
    我是多行注释
    不管我写多少行
    都不会影响代码运行
]]

03变量

  • Lua会自动推到类型
  • 只需要给定名称,再给变量值,可以不写分号(写不写都可以)
  • 不能轻易定义全局变量,会容易被修改
--新建三个变量,并赋值
year = "didhaid ada"
month = true
day = 7
--打印出三个变量的值
print(year,month,day)
-- 内置变量
-- 特点:下划线+大写字母
-- 查看Lua版本
print(_VERSION)

-- 调用一个不存在的变量
-- 类型是nil,等同于C#的null
print(id)

-- 销毁一个已经定义的变量
name=nil

-- 全局变量和局部变量
-- data="hsxd"--定义一个全局变量
local data="hsxd"-- 定义一个局部变量(作用域为当前文件)

04数据类型

  • 数字
  • 字符串
  • bool
  • 表Table
local name="Unity"

-- 获得变量类型,type(...)
-- type()是函数结构,一个代码片段,可以重复调用执行,有参数和返回值
print(type(name))

-- 获得type()返回值类型
-- type()返回值类型是string,为空返回"nil"字符串
print(type(type(name)))
print(type(bb)=="nil")

-- 多数据类回归拿到number类型下
print(type(123.5))
print(type(true))
print(type('hxsd'))

05字符串

-- 单行定义
local str1="abc"
print(str1)
local str2="def"
print(str1)

-- 多行定义字符串
-- 完全还原字符串内部的定义结构,如换行符都是存储的
local str3=[[
one
two]]
print(str3)

-- str1+str2 用 ..
print(str1 .. str2)
-- Lua对两个字符串相加时,会自动转换成数字类型
print("1" + "2")

-- 获取字符串长度
print("长度:".. #str1)

06字符串相关函数

-- 字符串大小写写化
print(string.upper("abc"))
print(string.lower("ABC"))

-- 查找
-- 参数被查找的字符串,查找内容
-- 返回值:起始位置和结束位置
-- 下标从1开始,并且多返回值
print(string.find("abcdefg","cde"))
-- 3   5

-- 字符串反转
print(string.reverse("abcdef"))

-- 截取字符串
-- 方式一,起始位置到结尾
print(string.sub("abcdef",3))
-- cdef

-- 方式二,起始位置和结束位置,C#是截取长度
-- 负数时倒数第几个
print(string.sub("abcdef",3,-2))
print(string.sub("abcdef",3,#"abcdef"-1))
-- cde

-- 字符串格式化
-- 参数:需要被格式化的字符串(包含占位符),格式化的内容
print(string.format("Im the %d player,other is %d",1,2))

-- 字符串重复
print(string.rep("abc",4))

-- ASCI 码转字符
print(string.char(65))

-- 字符转ASCI
print(string.byte("A"))

--字符串替换
-- 原始串,替换内容,替换后内容
print(string.gsub("abcd","bc","**"))

07数组Table

local data={
    }
-- 起始索引是1开始
-- 类型可以混合
-- 索引可以成负数
-- 也可以给0索引
-- 索引可以断开
-- 初始化时没有索引的值,从1开始累加
data={
    "abc",123,[-1]=100,[0]=99,[4]=233,"afafafaf"}
print(type(data))
print(data[3])

-- 获取长度
-- #data,会计算从1开始连续的数据
print(#data)

-- 修改
data[1]="def"
print(data[1])

-- 二维数组
local data2={
    {
    "aa","bb"},{
    11,22}}
print(data2[2][1])-- 11

-- 数组再lua中使用Table实现的

08运算符

-- 2的3次方
print(2^3)

-- C#!=不等于,Lua ~=
print(1~=2)

-- Lua没有++ ,--
local  i = 0
i=i+1

-- Lua 没有+=,-=,*=

09 条件判定

判断

  • 嵌套
  • Lua无Switch
local conl=false

-- then 代表起始大括号
-- end 代表结束大括号
-- else 代表结束和起始大括号
-- elseif 后面得根then
if(conl)
then
    print("条件1达成")
elseif(true)
then
    print("条件3达成")
else
    print("条件2达成")
end
if(true)
then
    if(true)
    then
        print("进入第二层")
    end
end

循环

-- 循环
local num = 1
while(num<3)
do
    print(num)
    num=num+1
end
local  num = 1
repeat
    print(num)
    num=num+1
until(num>5)
repeat
    if(1)
    then 
        print("")
        break
    end
    if(2)
    then 
        print("")
        break
    end
    if(3)
    then 
        print("")
        break
    end
until(false)

for

local data={
    "aa","bb","cc"}

-- 参数1:变量初始值,遍历Lua表使用1
-- 参数2:增长到多少
-- 参数3:增长步长
for i=1,#data,2
do
    print(data[i])
end
-- aa cc

-- 倒叙
for i=#data,1,-1
do
    print(data[i])
end

迭代器

-- 迭代器[遍历table]
-- one 不加中括号的字符串索引
-- "aa" "bb" 自动加1,2索引
-- [4] 制定数字索引
-- [-1] 制定负数索引
-- ["two"] 加中括号的字符串索引

local data={
    one="cc","aa","bb",[4]=3,[-1]=4,["two"]="dd"}


-- 连续索引迭代器
-- 连续数字索引迭代器,只会获取从1开始的数字索引,必须是连续的
for k,v in ipairs(data)
do
    print("k:".. k..",v:"..v)
end

print(".................")
-- 所有数值迭代器
-- 相对于ipairs去掉了i,相当于取消int迭代器
-- 获取table长度稳定方法,使用所有数值迭代器
for k,v in pairs(data)
do
    print("k:".. k..",v:"..v)
end

10 函数

-- 脚本型语言,从上往下执行
-- 需要先定义,后执行
-- 函数
function func1()
    print("这是func1")
end

func1()
-- 将函数定义为一个变量,函数是一个数据类型
local func2=function()
    print("这是func2")
end

-- 可以多于形参,不能少于形参
local  func3 = function(a,b)
    print(a+b)
end

func3(5,7)
func3(5,7,9)

-- 累加
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)

  • 返回值
-- 返回多个值
function func5()
    return 99,100
end
-- 接受多个值
local num1,num2=func5()

print(num1)
print(num2)

11Table

--  Table支持数据索引存储疏忽
-- Table支持字符串索引(关联索引)存储数据
-- 用表实现面对对象

local data={
    one="cc","aa","bb",[4]=3,[-1]=4,["two"]="dd"}

print(data[2])
print(data["one"])
print(data.two)

-- 函数也是种数据类型
-- func1索引下定义一个函数
data.func1=function()
    print("data表中func1函数")
end

data.func1()
----------------------------------
data.func2=function()
    print(data.two)
end

data.func2()
-------------------------------
-- 第一种self写法
-- 成员函数定义是,显示加入self变量,对应C#的this
-- 函数内部可以通过self获取当前table的其他值
data.func3=function(self)
    print("func3"..self.two)
end
-- :代表把当前表传递给self
data:func3()

-- 第二种self写法,
-- 隐式给self赋值
function data:func4()
    print("func4"..self.two)
end
data:func4()

12 子文件加载和元表

请添加图片描述

-- 实现代码的切分

-- 预加载目录
print(package.path)

-- 将提供的Lua文件中的代码执行一下
-- 文件名种包含“.”等特殊符号会导致加载错误
-- 文件扩展名“.lua”不需要添加,会自动添加
require("01.HelloWorld")-- 错误

热更新

-- 值会加载一次
-- 表会标记已经加载的文件记录
-- package.loaded 存储文件加载路径
print(package.loaded["subfile/subfile1"])
package.loaded["subfile/subfile1"]=nil

-- 每次加载文件时,会检查package.loaded 内容
-- 如果向重新加载,需要清理,置为nil
require("subfile/subfile1")
  • 变量传递
-- config文件

-- 全局变量
APPNAME ="HSXD"

local config = {
    }

config.appName="hxsd"

return config



-- 获取另一个文件的返回值
-- 子文件的return会返回给主文件变量
local config= require("subfile/config")
print(config.appName)
print(APPNAME)

13元表

local t1={
    1,2,3}
-- 期望打印table是,以{1,2,3}方式显示
print(t1[1])
print(t1[2])
print(t1[3])


-- 打印时,将表作为字符串输出
-- 这种办法,Lua提供特性,metatable扩展
setmetatable(
    t1, -- 需要进行元表扩展的数据表
    {
          -- 拥有扩展t1的元表,只要再元表种实现一些特殊的函数
            -- t1就可以实现特殊的功能
        __tostring = function(t)-- 元方法,被当成字符串使用,有则自动调用
            local format="{"
            for k,v in pairs(t)
            do
                print(v)
                format=format.."("..k ..",".. v .. "),"
            end

            format=format.."}"
            return format
        end
    }
)
-- t1会传递给t
print(t1)

mytable = setmetatable(
    {
     10, 20, 30 }, 
    {
    
        __tostring = function(mytable)
        sum = 0
        for k, v in pairs(mytable) do
                    print(k..','..v)
                    sum = sum + v
            end
        return "表所有元素的和为 " .. sum
        end
    }
)
print(mytable)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/leave_snow/article/details/126475242

智能推荐

torch加载bert预训练模型计算文本相似度_使用bert模型和pytorch实现文本相似度检测系统-程序员宅基地

文章浏览阅读653次。torch加载bert预训练模型计算文本相似度_使用bert模型和pytorch实现文本相似度检测系统

初入C语言_1_/、入了“c'′-程序员宅基地

文章浏览阅读362次。1.什么是C语言?2.一个简易的C语言程序3.C语言中的数据类型4.常量与变量目录1.什么是C语言?2.一个简易的C语言程序3.C语言中的数据类型4.常量与变量5.字符串+转义字符+注释5.字符串+转义字符+注释..._/、入了“c'′

关于i--, --i 的经典题目-程序员宅基地

文章浏览阅读91次。【代码】关于i++, i--的经典题目。

M2使用Anaconda下载python3.6.7_anaconda mac m2没法下载-程序员宅基地

文章浏览阅读380次。我下载的是python3.6.7,在csdn查询“anaconda版本和python版本的对应”,找到了python3.6.7可以对应Anaconda3-2020.02-MacOSX-x86_64。最新版本【适配mac m芯片】的anaconda不能找到python3.8还是3.7之前的包,要先查证好再下载anaconda。2. mac使用m2芯片,下载x86版本转换需要用到rosetta(先下载,系统会自动转换)1. 下载了最新版本的Anaconda,找不到python包,无法下载。_anaconda mac m2没法下载

2023 ChatGPT系统开源源码GPT v4.0 v3.5_gpt镜像站源码-程序员宅基地

文章浏览阅读359次。开源ChatGPT系统源码GPT4.0 3.5源码,支持插件!网站爬虫(从网页链接提取内容)搜索引擎(查询搜索引擎获取最新消息)实时天气(获取实时天气)_gpt镜像站源码

ChatGPT绘画生成软件MidTool:智能艺术的新纪元-程序员宅基地

文章浏览阅读623次,点赞9次,收藏7次。MidTool的出现,不仅是技术进步的象征,更是人类创造力和想象力的新起点。它打破了艺术创作的传统边界,让每个人都有机会成为艺术家,让每个创意都有可能成为现实。随着人工智能技术的不断发展,MidTool将继续引领智能艺术的新潮流,开启智能创意时代的无限可能。_chatgpt绘画生成软件

随便推点

Messidor数据集下载-程序员宅基地

文章浏览阅读819次。Messidor数据集下载_messidor数据集下载

【正点原子STM32连载】第十六章 基本定时器中断实验 摘自【正点原子】APM32E103最小系统板使用指南_apm32怎么打开中断总开关-程序员宅基地

文章浏览阅读953次,点赞20次,收藏18次。1)实验平台:正点原子APM32E103最小系统板2)平台购买地址:https://detail.tmall.com/item.htm?id=6092947574203)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongbanAPM32E103内部有多种多个定时器(TMR),本章介绍APM32E103基本定时器的使用,基本定时器是一类只能实现定时功能、没有外部接口的定时器。通过本章的学习,读者将学习到基本定时器的使用。本章分为_apm32怎么打开中断总开关

程序员调BUG写照_程序员调 bug 的写照-程序员宅基地

文章浏览阅读500次。_程序员调 bug 的写照

2023 EMOJI表情包合成微信小程序源码_微信小程序 emoji-程序员宅基地

文章浏览阅读708次。主要玩法也就是两个emoji表情相加然后自动组合成一个全新的emoji表情,全AI自动设计,用户就选择好玩的即可,拥有丰富的流量主功能_微信小程序 emoji

MATLAB for循环-程序员宅基地

文章浏览阅读10w+次,点赞58次,收藏223次。MATLAB for循环MATLAB中 for 循环是一个重复的控制结构,可以有效地写一个循环,只是执行的次数是特定的。MATLAB for 循环语法:MATLAB中的 for循环的语法如下:for index = values ...endfor 循环的值有下述三种形式之一:格式 描述 initval:endval 将索引变量从初始到终值递增1,并重复执行程序语句,直到索引值大于终值。 initval:step:endval _matlab for循环

python 输出“Hello, world”_怎么用cmd写出hello worldpython-程序员宅基地

文章浏览阅读1.4w次,点赞3次,收藏6次。  目的:制作第一个项目,输出“Hello, world”首先查看自己电脑上的python版本号,方法打开cmd输入python如果提示:不是内部或外部命令,也不是可运行的程序或批处理文件。那么需要设置环境变量。我的电脑--&gt;属性--&gt;高级系统设置--&gt;高级--&gt;环境变量--&gt;找到Path把自己安装好的python加到这里,别忘记需要分号隔开。 ..._怎么用cmd写出hello worldpython

推荐文章

热门文章

相关标签