<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>xingchen&apos;s blog</title><description>xingchenのblog</description><link>https://xingchen-blog.com/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.15.4</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年11月12日 22:18:26</lastBuildDate><item><title>Lua入门（更新中）</title><link>https://xingchen-blog.com/posts/notes/lua01/</link><guid isPermaLink="true">https://xingchen-blog.com/posts/notes/lua01/</guid><description>一个详细的lua入门攻略</description><pubDate>Wed, 11 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;一，前情提要&lt;a href=&quot;#一前情提要&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;本文章是我将近期学习的lua语法整理并分享。主要是复习用，也可以学习入门，由于我不想从0开始解释什么是变量，什么是函数，所以阅读本文章，&lt;strong&gt;可能需要有一定编程基础&lt;/strong&gt;。&lt;br /&gt;
这篇文章可能会有纰漏，欢迎大家批评指出。目前博客没有开放评论区，麻烦发送邮箱至  &lt;strong&gt;&lt;a href=&quot;#&quot;&gt;jinzi0619@163.com&lt;/a&gt;&lt;/strong&gt; 。或者在”&lt;a href=&quot;https://github.com/xingchen-jin/Firefly&quot; target=&quot;_blank&quot;&gt;https://github.com/xingchen-jin/Firefly&lt;/a&gt;” 。底下留言，本人实在是太懒狗了，喵。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二，HelloWorld&lt;a href=&quot;#二helloworld&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;让我们开始吧，首先是学习编程的固定节目，输出”你好，世界”，大家可以先看看下面的代码&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;str = &quot;你好，世界！&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print(&quot;Hello, World!&quot;);     -- Hello, World!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print(str)                -- 你好，世界！&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;不知道大家看出来没有，代码有奇怪的地方。只有第二行有”;“。没错，但是这样写是合法的，对于lua，一条语句末尾可以选择加不加”;“。这都是没有问题的。但是，我还是推荐统一点比较好。我是选择不加分号的。&lt;/p&gt;&lt;p&gt;第一行 &lt;code&gt;str = &quot;你好，世界！&quot;;&lt;/code&gt; 这是在给str变量赋值。对于lua，不需要在语句开头前严格声明变量类型。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;注：如果中文字符串输出&lt;strong&gt;乱码&lt;/strong&gt;，这大概率是系统终端不支持UTF-8编码导致&lt;/li&gt;
&lt;li&gt;解决方法1:  把编码格式改为GB2312,但是可能造成他人协作上的不便。&lt;/li&gt;
&lt;li&gt;解决方法2：将Windows系统的默认编码调整为UTF-8。但可能影响某些旧版软件的运行和使用。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三，lua数据类型&lt;a href=&quot;#三lua数据类型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在lua中，有以下数据类型：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;nil : 表示无效值（在条件表达式相当于false）&lt;/li&gt;
&lt;li&gt;boolean：布尔值&lt;/li&gt;
&lt;li&gt;number：表示双精度类型的实浮点数，所有的数值都是number&lt;/li&gt;
&lt;li&gt;string：字符串，用双引号或单引号表示。lua里 没有char
复杂类型：&lt;/li&gt;
&lt;li&gt;function：函数&lt;/li&gt;
&lt;li&gt;userdata：表示任意存储在变量中的C数据结构&lt;/li&gt;
&lt;li&gt;thread：表示独立线程，用于执行协同程序&lt;/li&gt;
&lt;li&gt;table：表&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四，注释&lt;a href=&quot;#四注释&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;-- 单行注释&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--[[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;多行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;注释&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]]--&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五，运算符&lt;a href=&quot;#五运算符&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h4&gt;算术运算符&lt;a href=&quot;#算术运算符&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;有 + - *  / % ^  //
没有自增自减 ++ —&lt;/p&gt;&lt;p&gt;^符号可能有点陌生，它是乘幂运算符，比如5 ^ 2 结果是25&lt;br /&gt;
//符号是整除运算符，5//2 输出结果 2
-号如果单独放在变量/常量前，代表负号，比如 -A就是A的相反数&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;条件运算符&lt;a href=&quot;#条件运算符&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;&amp;gt; &amp;lt; &amp;gt;= &amp;lt;= == ~=&lt;/code&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;逻辑运算符&lt;a href=&quot;#逻辑运算符&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;and  or  not&lt;/code&gt;
lua中 也遵循逻辑运算的 “短路” 规则&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print( true and false)  -- false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print( true and true)   -- true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print( false and true)  -- false,不进行and后的判断，直接返回结果&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print( true or false)  -- true ，不进行or后的判断，直接返回结果&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print( false or false)  -- false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print( not true)  -- false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六，字符串相关&lt;a href=&quot;#六字符串相关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h4&gt;获取长度&lt;a href=&quot;#获取长度&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;print(#s)&lt;/code&gt;输出字符串s的长度，一个汉字占3个长度，一个英文字符 占1个长度&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;注: 本质上#是来获取字节序列长度的，所以对于汉字，可能在不同编码下所占长度不同。比如最常见的UTF-8编码是3字节，而GB2312编码是2字节。&lt;/li&gt;
&lt;li&gt;因为这个特性，#来获取长度，可能造成不便。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;字符串多行打印&lt;a href=&quot;#字符串多行打印&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--lua中也是支持转义字符的&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print(&quot;游戏是\n第九艺术&quot;) --游戏是&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--第九艺术&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;s = [[今天&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;天气&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;真好呀&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;我们去散步吧&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print(s)    --今天&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--天气&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--真好呀&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;&lt;span&gt;--我们去散步吧&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;字符串拼接&lt;a href=&quot;#字符串拼接&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;字符串拼接 通过“ &lt;strong&gt;..&lt;/strong&gt;”
&lt;code&gt;print( &quot;123&quot; .. &quot;456&quot; )&lt;/code&gt;输出123456
也可以拼接number&lt;/p&gt;&lt;p&gt;同时，lua字符串还有个函数**string.format()**用于格式化字符串。&lt;br /&gt;
比如&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print(string.format(&quot;再见，%d&quot;, 2026)) -- 再见，2026&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--%d :与数字拼接&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--%a：与任何字符拼接&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--%s：与字符配对&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;转字符串&lt;a href=&quot;#转字符串&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;使用&lt;strong&gt;tostring()&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;字符串提供的一些公共方法&lt;a href=&quot;#字符串提供的一些公共方法&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;&quot;abCdefgCd&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--小写转大写的方法&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string.upper&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--大写转小写&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string.lower&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--翻转字符串&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string.reverse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--字符串索引查找&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string.find&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;Cde&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--截取字符串&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string.sub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--字符串重复&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string.rep&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--字符串修改&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string.gsub&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;str&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;Cd&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;**&quot;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--字符转 ASCII码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;string.byte&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Lua&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--ASCII码 转字符&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string.char&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;条件分支&lt;a href=&quot;#条件分支&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;lua的条件分支逻辑和主流的高级语言区别不大，记住格式即可。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;注：lua中没有switch语法&lt;/li&gt;
&lt;/ul&gt;&lt;section&gt;&lt;h4&gt;单分支&lt;a href=&quot;#单分支&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;格式为，条件为true时进入分支&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; 条件 &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;分支&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;多分支&lt;a href=&quot;#多分支&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;多分支在单分支基础上，多了elseif 和else&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; 条件 &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;分支1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;elseif&lt;/span&gt;&lt;span&gt; 条件 &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;分支2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;elseif&lt;/span&gt;&lt;span&gt; 条件 &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;分支3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;else&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;分支&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;当所有都不满足时进入else&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;循环&lt;a href=&quot;#循环&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h4&gt;for循环&lt;a href=&quot;#for循环&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;for循环，包含结尾&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--默认递增 i会默认+1,从2输出到5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--如果要自定义增量 直接逗号后面写&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--如果要自定义增量 直接逗号后面写&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;while循环&lt;a href=&quot;#while循环&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;while&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;num&lt;/span&gt;&lt;span&gt; &amp;lt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;--满足条件进入循环体&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;num&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;num&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;num&lt;/span&gt;&lt;span&gt; + &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;repeat(do - while)最特殊&lt;a href=&quot;#repeatdo---while最特殊&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;格式为&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;repeat&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;循环体&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;until&lt;/span&gt;&lt;span&gt; 条件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--例子&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;repeat&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;num&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;num&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;num&lt;/span&gt;&lt;span&gt; + &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;until&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;num&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--满足条件跳出 结束条件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;必定循环一次，满足条件则退出&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;函数（function）&lt;a href=&quot;#函数function&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在lua中，函数和数字，字符串一样，是一个数据类型，一种值。&lt;br /&gt;
函数的作用是让代码方便复用的。在使用上可以把一个常用的程序段作为函数，用到的时候调用。&lt;br /&gt;
现在让我们看看lua中函数长什么样吧。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;无参无返回&lt;a href=&quot;#无参无返回&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;F1&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;无参无返回函数&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;F1&lt;/span&gt;&lt;span&gt;))   &lt;/span&gt;&lt;span&gt;--function&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;F1&lt;/span&gt;&lt;span&gt;()   &lt;/span&gt;&lt;span&gt;--调用函数，输出无参无返回函数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;函数类型是function。&lt;br /&gt;
而上面的格式其实是lua的语法糖，这种格式更接近主流使用的高级语言风格。&lt;br /&gt;
现在让我们看看第二种格式。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;F2&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;无参无返回函数)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;F2&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;第二种格式有点类似C#中的委托和事件，将匿名函数作为变量存起来。&lt;br /&gt;
函数是一种变量，第一种格式其实会被翻译成&lt;code&gt;F1 = function() ... end&lt;/code&gt;&lt;br /&gt;
还有一点需要注意的是，尽管我们两种方式的输出结果一致。但这两种声明方式，却并非等价。请保持耐心，先让我讲讲其他内容，再继续说明。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;有参有返回&lt;a href=&quot;#有参有返回&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;F3&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;123&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;temp&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;temp2&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;temp3&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;temp4&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;F3&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;1&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;temp&lt;/span&gt;&lt;span&gt;)    &lt;/span&gt;&lt;span&gt;--1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;temp2&lt;/span&gt;&lt;span&gt;)   &lt;/span&gt;&lt;span&gt;--123&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;temp3&lt;/span&gt;&lt;span&gt;)   &lt;/span&gt;&lt;span&gt;--true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;temp4&lt;/span&gt;&lt;span&gt;)   &lt;/span&gt;&lt;span&gt;--nil&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;lua函数可以有多个返回值，我们可以用多个变量，去接收。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;当接收数量大于返回数量，多的会直接复制nil 。&lt;/li&gt;
&lt;li&gt;当接收数量小于返回数量，缺失的部分会直接舍弃。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;变长参数&lt;a href=&quot;#变长参数&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;F4&lt;/span&gt;&lt;span&gt;( ... )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--变长参数使用 用一个表存起来&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;arg&lt;/span&gt;&lt;span&gt; = {&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;--遍历表&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,#&lt;/span&gt;&lt;span&gt;arg&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;arg&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;F4&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;123&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;)  &lt;/span&gt;&lt;span&gt;--依次打印传入参数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;我们还没有讲到表，不过这里可以看作一个数组。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;函数嵌套与闭包&lt;a href=&quot;#函数嵌套与闭包&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;我们可以通过一个函数返回一个函数的方式实现函数嵌套。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;F5&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;123&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;f6&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;F5&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;f6&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;--123&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;上面的步骤是这样的：首先 F5 会返回一个匿名函数，我们用变量 f6 接收，然后再调用这个返回的函数，最后打印 123。&lt;/p&gt;&lt;p&gt;而&lt;strong&gt;闭包&lt;/strong&gt;是在这个基础上，&lt;strong&gt;利用了“延长外部变量生命周期”的机制&lt;/strong&gt;。&lt;br /&gt;
我们现在听到闭包，可能会一头雾水，其实不用害怕，闭包其实并不复杂，我们先来看一个例子：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;F6&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;-- 延长传入参数的生命周期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt; + &lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;f7&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;F6&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f7&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;)) &lt;/span&gt;&lt;span&gt;-- 15&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;我们在调用 F6 时传入了参数 10，返回的函数&lt;strong&gt;捕获（记住）&lt;/strong&gt; 了这个参数。也就是说，实际上返回的函数，内部已经&lt;strong&gt;绑定了当时 &lt;code&gt;x = 10&lt;/code&gt; 的状态&lt;/strong&gt;。所以当我们调用 &lt;code&gt;f7(5)&lt;/code&gt; 时，相当于执行了 &lt;code&gt;10 + 5&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;变量生命周期&lt;a href=&quot;#变量生命周期&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;在lua中，我们默认声明的变量都是全局变量&lt;/strong&gt;,这跟很多其他的高级语言有着显著区别，其他往往会默认私有或可继承变量。
而声明局部变量，需要在变量前加上local关键字。
举个例子，&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;F8&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;F8&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;--nil&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;--2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;两种函数声明方式的区别（坑点!!!）&lt;a href=&quot;#两种函数声明方式的区别坑点&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;现在我们回到讲无参函数时，提到的两种声明方式。&lt;br /&gt;
他们&lt;strong&gt;最核心的区别&lt;/strong&gt;是，在 &lt;strong&gt;&lt;code&gt;local&lt;/code&gt; 局部变量下的递归行为&lt;/strong&gt;&lt;/p&gt;&lt;section&gt;&lt;h5&gt;写法 A：局部函数声明&lt;a href=&quot;#写法-a局部函数声明&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;F1&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; + &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;--这里为避免溢出,提供了一个终止条件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;F1&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-- 输出 &quot;F1&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;F1&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-- ✅ 合法，可以正常递归调用自己&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;F1&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;原理&lt;/strong&gt;：Lua 在解析 &lt;code&gt;local function F1&lt;/code&gt; 时，会&lt;strong&gt;先声明变量 &lt;code&gt;F1&lt;/code&gt;，然后再赋值函数体&lt;/strong&gt;。所以在函数内部可以访问到 &lt;code&gt;F1&lt;/code&gt; 自身。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;写法 B：局部变量赋值匿名函数&lt;a href=&quot;#写法-b局部变量赋值匿名函数&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;F2&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; + &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;--这里为避免溢出,提供了一个终止条件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;F2&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;F2&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-- ❌ 会报错：attempt to call a nil value (global &apos;F2&apos;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;原理&lt;/strong&gt;：Lua 在解析 &lt;code&gt;local F2 = ...&lt;/code&gt; 时，会&lt;strong&gt;先计算右侧的表达式，再赋值给左侧&lt;/strong&gt;。在执行到 &lt;code&gt;function()&lt;/code&gt; 内部时，外部的 &lt;code&gt;F2&lt;/code&gt; 还是 &lt;code&gt;nil&lt;/code&gt;，所以会报错。如果非要这么写递归，必须提前声明：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;F2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;F2&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; = &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; + &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;--这里为避免溢出,提供了一个终止条件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;return&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;F2&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;-- 输出 &quot;F2&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;F2&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-- ✅ 此时正常&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;F2&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;-- 输出 &quot;F2&quot; 并尝试递归调用自己&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;注意&lt;/strong&gt;：在自己实践时，最好新开一个文件，因为这些函数可能已经声明过。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;表(table)&lt;a href=&quot;#表table&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在lua中，大多数复杂类型都是table&lt;br /&gt;
我们可以用table表示一个数组，一个字典，甚至是一个类。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;数组&lt;a href=&quot;#数组&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;section&gt;&lt;h5&gt;一维数组&lt;a href=&quot;#一维数组&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;用表声明一个数组很简单&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; = {&lt;/span&gt;&lt;span&gt;99&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;114&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;nil&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;78&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;nil&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--lua中 索引从1开始&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]) &lt;/span&gt;&lt;span&gt;--99&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;]) &lt;/span&gt;&lt;span&gt;--nil&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;]) &lt;/span&gt;&lt;span&gt;--false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;]) &lt;/span&gt;&lt;span&gt;--nil&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;需要注意的是&lt;strong&gt;下标&lt;/strong&gt;从&lt;strong&gt;1&lt;/strong&gt;开始，&lt;strong&gt;超出&lt;/strong&gt;访问边界会返回&lt;strong&gt;nil&lt;/strong&gt;
&lt;code&gt;print(#a)  --5&lt;/code&gt;
”#“是通用的获取长度的关键字,但是当表中存在&lt;strong&gt;空洞（存在nil)时&lt;/strong&gt;，往往不会返回我们想要的结果。
而且离谱的是，就结果而言，不同的环境可能有不同的值。对于我的环境，输出的&lt;strong&gt;结果是5&lt;/strong&gt;，省略末尾的nil。而有些环境会&lt;strong&gt;返回2&lt;/strong&gt;。也就是遇到nil就不计数了。&lt;/p&gt;&lt;p&gt;顺带一提我的情况是末尾的nil都省略。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; = {&lt;/span&gt;&lt;span&gt;nil&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;nil&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;nil&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(#&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;--0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;所以，最好不要通过“#”去得到数组长度&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;二维数组&lt;a href=&quot;#二维数组&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;依旧是下标从1开始。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; = {{&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;},{&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;},{&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;9&lt;/span&gt;&lt;span&gt;}}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;][&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]) &lt;/span&gt;&lt;span&gt;--1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;][&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]) &lt;/span&gt;&lt;span&gt;--4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;自定义索引&lt;a href=&quot;#自定义索引&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;我们可以在为数组添加自定义索引，但是这其中有很多 &lt;strong&gt;“深坑”&lt;/strong&gt;。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;aa&lt;/span&gt;&lt;span&gt; = {[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;,[-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;aa&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]) &lt;/span&gt;&lt;span&gt;--1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;aa&lt;/span&gt;&lt;span&gt;[-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;]) &lt;/span&gt;&lt;span&gt;--4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;aa&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;])  &lt;/span&gt;&lt;span&gt;--2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;aa&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;])  &lt;/span&gt;&lt;span&gt;--3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;aa&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;])  &lt;/span&gt;&lt;span&gt;--5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;没有定义的索引从1开始，所以索引1对应的是数字2，然后索引3对应数字5。 好像是把索引忽略了，对于未定义索引从1开始。
“aa = {[1] = 1,2,3,[-1] = 4, 5}  — print(aa[1])输出2&lt;/p&gt;&lt;p&gt;接下来获取长度&lt;code&gt;print(&quot;数组长度：&quot;..#aa) --数组长度：3&lt;/code&gt;&lt;/p&gt;&lt;p&gt;让我们换一个数组&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--情况1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bb&lt;/span&gt;&lt;span&gt; = {[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;] =&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,[&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;数组长度：&quot;&lt;/span&gt;&lt;span&gt;..#&lt;/span&gt;&lt;span&gt;bb&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;--数组长度：5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;我们明明跳过了下标3，实际上只有四个数，结果是5。&lt;/p&gt;&lt;p&gt;那我分别列出其他几种情况&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--情况2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bb&lt;/span&gt;&lt;span&gt; = {[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;] =&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,[&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;数组长度：&quot;&lt;/span&gt;&lt;span&gt;..#&lt;/span&gt;&lt;span&gt;bb&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;--数组长度：2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--情况3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bb&lt;/span&gt;&lt;span&gt; = {[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;] =&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,[&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;数组长度：&quot;&lt;/span&gt;&lt;span&gt;..#&lt;/span&gt;&lt;span&gt;bb&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;--数组长度：6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;,#&lt;/span&gt;&lt;span&gt;bb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;bb&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--情况4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bb&lt;/span&gt;&lt;span&gt; = {[&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;] =&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,[&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;] = &lt;/span&gt;&lt;span&gt;7&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;数组长度：&quot;&lt;/span&gt;&lt;span&gt;..#&lt;/span&gt;&lt;span&gt;bb&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;--数组长度：3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;情况2，跳了两个数，中断长度。&lt;/li&gt;
&lt;li&gt;情况3，连续跳两个数，不中断读取。遍历后会发现中间空的部分是nil&lt;/li&gt;
&lt;li&gt;情况4，最后跳一个属，最后一个数不记录长度。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;这些深坑是lua底层实现原理造成的，理论上找出底层代码，就可以分析为什么。嘻嘻，我没找&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;pairs和ipairs迭代器遍历&lt;a href=&quot;#pairs和ipairs迭代器遍历&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;通过上面的学习，我们了解了用#来获取长度的不可靠性。那不用#的方式，如何实现表的遍历呢，对于这种情况，lua提供了两个迭代器供我们使用。&lt;br /&gt;
先声明一个表
“a = {[0] = 1, 2, [-1]=3, 4, 5, [5] = 6}&lt;/p&gt;&lt;section&gt;&lt;h5&gt;ipairs&lt;a href=&quot;#ipairs&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;ipairs遍历,还是&lt;strong&gt;从1开始&lt;/strong&gt;往后遍历的,&lt;strong&gt;小于等于0&lt;/strong&gt;的值得不到.
只能找到连续索引的 键 如果&lt;strong&gt;中间断序&lt;/strong&gt;了,它也&lt;strong&gt;无法遍历&lt;/strong&gt;出&lt;strong&gt;后面&lt;/strong&gt;的内容&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ipairs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ipairs遍历键值&quot;&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;&quot;_&quot;&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--[[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ipairs遍历键值1_2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ipairs遍历键值2_4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ipairs遍历键值3_5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ipairs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;ipairs遍历键&quot;&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--[[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ipairs遍历键1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ipairs遍历键2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ipairs遍历键3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;ipairs遍历表，第一个索引变量为键（下标），第二个索引变量为值。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h5&gt;pairs&lt;a href=&quot;#pairs&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;p&gt;pairs可以把所有的键找到，&lt;strong&gt;遍历整张表&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pairs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;pairs遍历键值&quot;&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;&quot;_&quot;&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--[[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pairs遍历键值1_2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pairs遍历键值2_4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pairs遍历键值3_5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pairs遍历键值0_1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pairs遍历键值5_6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pairs遍历键值-1_3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;in&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pairs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;do&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;pairs遍历键&quot;&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;--[[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pairs遍历键1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pairs遍历键2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pairs遍历键3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pairs遍历键0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pairs遍历键5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;pairs遍历键-1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;字典&lt;a href=&quot;#字典&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;类和结构体&lt;a href=&quot;#类和结构体&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>记录我第一次参加的GameJam</title><link>https://xingchen-blog.com/posts/games/first-gamejam/</link><guid isPermaLink="true">https://xingchen-blog.com/posts/games/first-gamejam/</guid><description>游戏开发好难</description><pubDate>Fri, 23 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;老实说，这是一次失败的GameJam。&lt;/strong&gt;
这次参加TapTap聚光灯活动，本来有一个美术同学的，但实在是太忙了，只能自己搞了。
说实话比赛前几天都在摸鱼忙各种别的事，真正的开发得是国庆假期以后，也就是实际两周多3天左右。&lt;/p&gt;
&lt;section&gt;&lt;h4&gt;比赛实际开发第一周&lt;a href=&quot;#比赛实际开发第一周&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;比赛初期我先想玩法，卡牌策略+猫咪+文明模拟，应该有搞头，开干。结果做寻路，找猫的美术，做一些基础的数据结构都花掉了快一周。坏了，完不成了，我不该小看游戏开发周期的。
怎么办 ----- 砍玩法。内耗一天后我把文明模拟砍掉，聚焦猫咪本身，将环境局限在公园，文明模拟最后只保留了领地建立逻辑。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h4&gt;比赛实际开发第二周&lt;a href=&quot;#比赛实际开发第二周&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;进入开发最后一周了，看看手上的游戏连一个原型的影子都没出来，只能爆肝了，于是周一做地图，周二简单UI，周三做卡牌系统。。。这样子吧周期压缩。最后又是熬了一个通宵，终于把系统都做好了，结果也没啥时间深入玩法多添加些卡牌，完善领地系统什么就把游戏上交。&lt;/p&gt;&lt;p&gt;我其实想，如果国庆假期不忙，或者多加点人手，也许结局会不一样，但没有假如，我不得不承认客观上这就是一次失败的GameJam，我没能做出我想做出的游戏。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h4&gt;收获&lt;a href=&quot;#收获&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;程序方面大Level Up。中途程序开发时进了好几次心流好爽。&lt;br /&gt;
抗压能力Level Up。&lt;br /&gt;
更重要的是心态开始不一样了。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h4&gt;心里话&lt;a href=&quot;#心里话&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;这次比赛参加的人真的好多，也看到许许多多优秀的作品，这时比较自己的半成品，做的什么玩意。&lt;/p&gt;&lt;p&gt;玩法很浅，想法很多没能实现。这个游戏是我独自一人完成，我是学程序的，美术什么的用的现有的素材。结果游戏还不如别人ai生成出来的，落差很大，也许我根本就不适合做游戏。但还是不想放弃，这十几天真的感到很充实快乐。我要学更多的程序，接触美术，体验游戏设计的艺术。我不知道结局怎样，我还不该在这里停下。&lt;/p&gt;&lt;p&gt;游戏试玩链接&lt;a href=&quot;https://tap.cn/ls0xX2EtQ&quot; target=&quot;_blank&quot;&gt;https://tap.cn/ls0xX2EtQ&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>Cinemachine</title><link>https://xingchen-blog.com/posts/notes/cinemachine/</link><guid isPermaLink="true">https://xingchen-blog.com/posts/notes/cinemachine/</guid><description>Unity相关知识</description><pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;Cinemachine Brain&lt;a href=&quot;#cinemachine-brain&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;绑在主相机上，读取虚拟相机共同控制主相机。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;基本属性&lt;a href=&quot;#基本属性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Live Camera（only read）：当前在使用的虚拟相机的Transform，定位虚拟相机&lt;/li&gt;
&lt;li&gt;Live Blend（only read）：当前虚拟相机切换的过程，会显示从哪转换到哪&lt;/li&gt;
&lt;li&gt;Show Debug Text:  勾选后可以在game视窗中看见属性1和2.&lt;/li&gt;
&lt;li&gt;Show Camera Frustum: 勾选后在场景显示相机的视锥体&lt;/li&gt;
&lt;li&gt;Ignore Time Scale: 控制相机行为是否受时间缩放行为影响&lt;/li&gt;
&lt;li&gt;World Up Override: 默认情况下，“上方”是世界坐标系的y轴，如果相机在旋转过程中相机的y轴与“上方”夹角大于90度，unity会自动调整视角，使之小于90度。&lt;/li&gt;
&lt;li&gt;Update Method: 相机更新的同步，与生命周期哪个环节同步，可以是物理引擎或渲染同步，
&lt;ul&gt;
&lt;li&gt;Smart Update：根据实际情况，自动选择同步&lt;/li&gt;
&lt;li&gt;Manual Update：自己编写代码同步&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Blend Update Method: 相机间切换行为的同步设置，只能选择物理引擎和渲染&lt;/li&gt;
&lt;li&gt;Default Blend: 默认的相机的切换模式，可以选择Custom自定义曲线&lt;/li&gt;
&lt;li&gt;Custom Blends: 可以建立资源文件，针对不同的相机切换定制不同的切换模式&lt;/li&gt;
&lt;li&gt;Events：相机事件，在切换时调用（我不太确定具体触发时间）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Virtual Camera&lt;a href=&quot;#virtual-camera&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;虚拟相机的本质是相机的配置文件，在不同使用场景提供不同的配置。应该避免在运行时，对单个虚拟相机做过多的修改&lt;/p&gt;&lt;section&gt;&lt;h3&gt;基本属性&lt;a href=&quot;#基本属性-1&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Status：状态分为三种(激活)，Standby（未被使用但在运行），Disabled（禁用）；可以点击Solo立即激活&lt;/li&gt;
&lt;li&gt;Game Window Guides&amp;lt;显示虚拟相机的一些提示信息&amp;gt;&lt;/li&gt;
&lt;li&gt;Save During Play：保存运行时的修改信息&lt;/li&gt;
&lt;li&gt;Priority&amp;lt;优先级&amp;gt;，Cinemachine Brain会使用优先级高的（Timeline中无任何作用）&lt;/li&gt;
&lt;li&gt;**Follow：跟随该物体移动&lt;/li&gt;
&lt;li&gt;**Look At：跟随该物体转动&lt;/li&gt;
&lt;li&gt;StandbyUpdate：当相机处于待机状态时，相机的刷新方式，其中Round Robin为轮替刷新，大概每一帧选一个相机刷新&lt;/li&gt;
&lt;li&gt;Lens（None）：
&lt;ul&gt;
&lt;li&gt;Vertical FOV：视野角度&lt;/li&gt;
&lt;li&gt;Near Clip Plane：近裁剪平面，小于该数值的对象不进行渲染&lt;/li&gt;
&lt;li&gt;Far Clip Plane: 远裁剪平面，大于该数值的对象不进行渲染&lt;/li&gt;
&lt;li&gt;Dutch：斜角镜头角度&lt;/li&gt;
&lt;li&gt;Advanced
&lt;ul&gt;
&lt;li&gt;Mode Override：可以选择相机的渲染模式，正交，透视，物理，选择后Lens会提供不同的接口。**注：这个选项会修改Camera的真实属性，且不会自动复原在相机不用时&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Transition：虚拟相机切换时的属性设置
&lt;ul&gt;
&lt;li&gt;Blend Hint：相机的切换行为的空间特征
&lt;ul&gt;
&lt;li&gt;None：对角度位置做差值，线性切换&lt;/li&gt;
&lt;li&gt;Spherical Position：以LookAt为球心做球形的切换&lt;/li&gt;
&lt;li&gt;Cylindrical Position：以LookAt为中心做圆柱形的切换，水平做圆型，垂直做线性&lt;/li&gt;
&lt;li&gt;Screen Space Aim When Targets Differ&amp;lt;两方lookat目标不一致时&amp;gt;，在位置上会根据世界坐标系下做线性切换，在角度上根据两个相机构成的屏幕空间的夹角间做切换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Inherit Position：表示相机被激活时不让相机移动到虚拟相机位置，而是虚拟相机移动到相机位置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Body&amp;lt;与follow关联&amp;gt;&lt;/li&gt;
&lt;li&gt;Aim&amp;lt;与lookat关联&amp;gt;&lt;/li&gt;
&lt;li&gt;Noise：为相机添加晃动效果&lt;/li&gt;
&lt;li&gt;Extensions：可以添加一些额外的功能，比如相机碰撞检测&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Body&lt;a href=&quot;#body&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Transposer&lt;a href=&quot;#transposer&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;虚拟相机将在某个固定的偏移或距离上跟随目标移动。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Follow Offset：跟随的偏移量&lt;/li&gt;
&lt;li&gt;Binding Mode：锁定的设置
&lt;ul&gt;
&lt;li&gt;Lock To Target On Assign&amp;lt;锁定自己和目标距离&amp;gt;，锁定在On Assign的时候，只要是非游戏状态下，follow有对象，就会一直处于On  Assign状态，在游戏状态需要重新指定Follow对象，才会是On Assign状态（重新激活相机也是）&lt;/li&gt;
&lt;li&gt;World Space：锁定在世界坐标下&lt;/li&gt;
&lt;li&gt;Lock To Target With World Up：虚拟相机可以绕Follow对象，沿世界坐标系下的Y轴旋转&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Damping：相机移动的阻尼大小&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Orbital Transposer 环绕相机&lt;a href=&quot;#orbital-transposer-环绕相机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;选中这个模式会看见一个红色圆环，相机的跟随会限制在红色圆环内，也就是绕环运动&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Follow Offset：跟随偏移，Y圆环高度，Z圆环半径，X相机在圆环切线方向的偏移&lt;/li&gt;
&lt;li&gt;Recenter To Target Heading&amp;lt;相机自动回到heading方向的后方&amp;gt;&lt;/li&gt;
&lt;li&gt;Heading：可以设置Bias进行偏移，PositionDelta是根据目标上一帧的位移决定在什么位置，也就是目标运动方向，Velocity跟PositionDelta，但它用的是刚体速度，没有则自动用PositionDelta&lt;/li&gt;
&lt;li&gt;X Axis：
&lt;ul&gt;
&lt;li&gt;Value：虚拟相机在圆环的位置&lt;/li&gt;
&lt;li&gt;Value Range：在圆环运动范围&lt;/li&gt;
&lt;li&gt;Speed：转速设置&lt;/li&gt;
&lt;li&gt;Accel Time&amp;lt;转速从0到最大的时间&amp;gt;&lt;/li&gt;
&lt;li&gt;Decel Time：从最大归零的时间&lt;/li&gt;
&lt;li&gt;Input Axis Value：当前输入值，Invert可以反向操作&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Framing Transposer&lt;a href=&quot;#framing-transposer&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;当我们屏幕与相机关系相对固定时采用&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Target Movement Only&amp;lt;不受阻尼影响立即旋转&amp;gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3rd&lt;a href=&quot;#3rd&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;可以水平直线移动相机，十分适合射击游戏的瞄准，或其他右肩视角和左肩视角的转换。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Aim&lt;a href=&quot;#aim&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Same As Follow Target&lt;a href=&quot;#same-as-follow-target&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;与目标角度保持一致&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Composer&lt;a href=&quot;#composer&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;打开Game Window guides可以具体观察&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Tracked Object Offset&amp;lt;在对象位置的基础上做一定偏移&amp;gt;，可以打开Game Window guides观察，此时黄点位置就是目前瞄准的位置。&lt;/li&gt;
&lt;li&gt;Lookahead
&lt;ul&gt;
&lt;li&gt;Lookahead Time：预测一定时间后的位置进行偏移&lt;/li&gt;
&lt;li&gt;Lookahead Smoothing：可以让预测算法更加平滑&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dead Zone：显示透明区域，在该区域内就不会转动
&lt;ul&gt;
&lt;li&gt;Screen X/Y：确定中心位置&lt;/li&gt;
&lt;li&gt;Dead Zone Width/Height&amp;lt;长和宽&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Soft Zone：显示蓝色区域，在该区域内，相机会通过转动使黄点到达Dead Zone&lt;/li&gt;
&lt;li&gt;红色区域是黄点绝对不会落入的区域&lt;/li&gt;
&lt;li&gt;Center On Active：勾选后在相机启用时会把目标放在屏幕正中央，否则会放在最近的Dead Zone的边缘的位置&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;State Driven Camera状态驱动相机&lt;a href=&quot;#state-driven-camera状态驱动相机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Animated Target：动画状态目标&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>网站推荐</title><link>https://xingchen-blog.com/posts/reasource/</link><guid isPermaLink="true">https://xingchen-blog.com/posts/reasource/</guid><description>一些用于游戏开发和学习的好站</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;学习用&lt;a href=&quot;#学习用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h4&gt;1，Unity用户手册&lt;a href=&quot;#1unity用户手册&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href=&quot;https://docs.unity.cn/cn/2022.3/Manual/UnityManual.html&quot; target=&quot;_blank&quot;&gt;Unity User Manual 2022.3 (LTS) - Unity 手册&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2,C#手册&lt;a href=&quot;#2c手册&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href=&quot;https://learn.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/&quot; target=&quot;_blank&quot;&gt;C# 文档 - 入门、教程、参考。 - A tour of C# | Microsoft Learn&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3，【Unity3D】Unity3D技术栈&lt;a href=&quot;#3unity3dunity3d技术栈&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/m0_37602827/article/details/128731256?spm=1001.2014.3001.5506&quot; target=&quot;_blank&quot;&gt;【Unity3D】Unity3D技术栈_unity技术栈-CSDN博客&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;4，菜鸟教程C#&lt;a href=&quot;#4菜鸟教程c&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href=&quot;https://www.runoob.com/csharp/csharp-tutorial.html&quot; target=&quot;_blank&quot;&gt;C# 教程 | 菜鸟教程&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;5，面试题&lt;a href=&quot;#5面试题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/zhangay1998/article/details/131687288?spm=1001.2014.3001.5501&quot; target=&quot;_blank&quot;&gt;2026年Unity面试题大全，共十万字面试题总结【收藏一篇足够面试，持续更新】_unity面试题2023-CSDN博客&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;6，计算机八股&lt;a href=&quot;#6计算机八股&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href=&quot;https://xiaolincoding.com/&quot; target=&quot;_blank&quot;&gt;小林coding - 从图解计算机到后端面试全攻略&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h1&gt;资源素材&lt;a href=&quot;#资源素材&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h1&gt;&lt;section&gt;&lt;h4&gt;0，Unity中国资源商店&lt;a href=&quot;#0unity中国资源商店&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href=&quot;https://assetstore.u3d.cn/&quot; target=&quot;_blank&quot;&gt;Unity 中国资源商店 - 优质3D 2D游戏制作资源平台&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;1，模之屋&lt;a href=&quot;#1模之屋&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href=&quot;https://www.aplaybox.com/model/model&quot; target=&quot;_blank&quot;&gt;专业模型创作分享社区_模之屋_PlayBox&lt;/a&gt;&lt;/p&gt;&lt;p&gt;免费非商用模型/动作下载&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;2，Mixamo&lt;a href=&quot;#2mixamo&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://www.mixamo.com/&quot; target=&quot;_blank&quot;&gt;Mixamo&lt;/a&gt;&lt;/p&gt;&lt;p&gt;免费人形动作素材&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;3，  Poly Haven 3D模型&lt;a href=&quot;#3--poly-haven-3d模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://polyhaven.com/zh&quot; target=&quot;_blank&quot;&gt;Poly Haven&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;4 Itch.io&lt;a href=&quot;#4-itchio&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://itch.io/&quot; target=&quot;_blank&quot;&gt;https://itch.io/&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;5，免费可商用音乐&lt;a href=&quot;#5免费可商用音乐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://peritune.com/#google_vignette&quot; target=&quot;_blank&quot;&gt;PeriTune - 免费音乐素材&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;GameJam&lt;a href=&quot;#gamejam&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h4&gt;1，GMTK   2027 - 8- 12&lt;a href=&quot;#1gmtk---2027---8--12&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href=&quot;https://itch.io/jam/gmtk-2027&quot; target=&quot;_blank&quot;&gt;GMTK游戏创作马拉松2027 - itch.io&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;2，GGJ&lt;a href=&quot;#2ggj&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href=&quot;https://globalgamejam.org/&quot; target=&quot;_blank&quot;&gt;Global Game Jam&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;收集&lt;a href=&quot;#收集&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href=&quot;https://www.taptap.cn/game-jam-list&quot; target=&quot;_blank&quot;&gt;GameJam 活动列表 - TapTap&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;插件手册&lt;a href=&quot;#插件手册&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;1，Behavior Desiginer&lt;a href=&quot;#1behavior-desiginer&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://opsive.com/support/documentation/behavior-designer-pro/concepts/what-is-a-behavior-tree/&quot; target=&quot;_blank&quot;&gt;行为树基础 - Opsive&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h2&gt;AI工具&lt;a href=&quot;#ai工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h4&gt;像素绘画&lt;a href=&quot;#像素绘画&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;a href=&quot;https://www.pixellab.ai/&quot; target=&quot;_blank&quot;&gt;https://www.pixellab.ai/&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>Animator</title><link>https://xingchen-blog.com/posts/notes/animator/</link><guid isPermaLink="true">https://xingchen-blog.com/posts/notes/animator/</guid><description>Unity相关知识</description><pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;Animator的属性&lt;a href=&quot;#animator的属性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Controller：动画控制器&lt;/li&gt;
&lt;li&gt;Avatar：骨骼绑定&lt;/li&gt;
&lt;li&gt;ApplyRootMotion：是否开启rootMotion&lt;/li&gt;
&lt;li&gt;Update Mode：刷新模式，重新计算每个骨骼节点，
&lt;ul&gt;
&lt;li&gt;normal：与帧率同步（Update（））&lt;/li&gt;
&lt;li&gt;Animate Physics：与物理引擎同步（FixedUpdate（））&lt;/li&gt;
&lt;li&gt;Unscaled Time：忽略时间标尺TimeScale，其他与Normal一样&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Culling Mode：剔除模式，当某个物体不被摄像机看到如何处理
&lt;ul&gt;
&lt;li&gt;Always Animate： 不进行剔除&lt;/li&gt;
&lt;li&gt;Cull Update Transform：会剔除IK之类的操作&lt;/li&gt;
&lt;li&gt;Cull Completely：完全停止动画&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;动画状态的基本属性&lt;a href=&quot;#动画状态的基本属性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Tag：设定标签，在代码中可以统一管理&lt;/p&gt;&lt;p&gt;Motion：动画判断/动画树&lt;/p&gt;&lt;p&gt;Speed：播放速度（不能在代码中修改）&lt;/p&gt;&lt;p&gt;Multiplier&amp;lt;可以选择设定的变量&amp;gt;，实际播放速度时与speed乘积（从而可以用脚本修改速度）&lt;/p&gt;&lt;p&gt;&lt;strong&gt;额外知识&lt;/strong&gt;：如setFloat（）可以传入哈希值；而哈希值就是通过哈希函数把输入转换成固定的输出，于是可以做到不比较输入本身，而是比较哈希值来确定输入内容。哈希要解决的比较核心的问题就是哈希冲突，这里不过多介绍。
&lt;a href=&quot;https://baike.baidu.com/item/HASH/390310&quot; target=&quot;_blank&quot;&gt;Hash（散列函数）_百度百科&lt;/a&gt;&lt;/p&gt;&lt;p&gt;常见哈希算法：MD5，SHA-256等&lt;br /&gt;
由于整型比字符串进行比较性能更优，unity提供了Animator.StringToHash(string s)&lt;br /&gt;
来进行将字符串变为哈希值。&lt;/p&gt;&lt;p&gt;Motion Time：播放动画片段特定时间点[0,1]&lt;/p&gt;&lt;p&gt;Mirror&amp;lt;镜像动画&amp;gt;（只对人形有用）&lt;/p&gt;&lt;p&gt;Cycle Offset：刚开始播放时的偏移[0,1]&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Foot IK&lt;a href=&quot;#foot-ik&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;IK即反向动力学，对应正向动力学FK。FK正向的从起点寻找目标，IK从目标反推起点。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;FK：由骨骼的根节点到末梢节点一次计算其旋转位置和缩放来决定每一块骨骼的最终位置。&lt;/li&gt;
&lt;li&gt;IK：反过来计算，比如角色想先确定手和脚位置，然后再由最终位置，反向计算父节点的旋转和缩放
而动画状态这里的Foot IK是利用IK的一种动画矫正机制。
略微调整脚部骨骼位置至相对应的IK Goal（初始的，手动调整IK Goal不会影响FootIK，需要设置权重才能靠近修改后的）&lt;br /&gt;
SetIKPositionWeight(AvatarIKGoal.RightFoot,1f) 调整右脚IK权重为1&lt;br /&gt;
SetIKPosition（） 调整IKGoal位置。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;WriteDefault&lt;a href=&quot;#writedefault&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Unity的Animator会在OnEnable时，记录当前若干属性，若某一属性在动画曲线中未被修改则会用，默认值来覆盖&lt;br /&gt;
可以参考的blogs：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cnblogs.com/Esfog/p/Unity_WriteDefaults.html&quot; target=&quot;_blank&quot;&gt;Unity的Write Defaults-&amp;gt;从一个例子谈起 - Esfog - 博客园&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.csdn.net/yjy99yjy999/article/details/82730948&quot; target=&quot;_blank&quot;&gt;Write Defaults的作用-CSDN博客&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.csdn.net/rickshaozhiheng/article/details/77838379&quot; target=&quot;_blank&quot;&gt;[Unity] AnimatorStates中的write defaults详解-CSDN博客&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;动画状态转换&lt;a href=&quot;#动画状态转换&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在不同动画状态间可以设置不同的转换（Transition），同一对状态间可以设置多个转换。
有勾选Solo优先转换不考虑其他转换，Mute永远不执行。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;hasExitTime：默认勾选，经过某段时间进行转换。&lt;/li&gt;
&lt;li&gt;ExitTime：开始转换时间（比例值）&lt;/li&gt;
&lt;li&gt;Fixed Duration&amp;lt;设置过渡时间单位&amp;gt;（s或%）&lt;/li&gt;
&lt;li&gt;Transition Offset&amp;lt;进入下一个动画状态的偏移量&amp;gt;。&lt;/li&gt;
&lt;li&gt;Interruption Source&amp;lt;表示哪些转换可以打断当前转换&amp;gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;动画状态转换条件（Conditions）&lt;a href=&quot;#动画状态转换条件conditions&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;执行动画转换需要满足ExitTime和Conditions两个条件。
conditions可以和参数关联，设置转换条件。可以通过脚本修改参数做到动画转换的控制。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;多条条件之间关系为逻辑与。&lt;/li&gt;
&lt;li&gt;而Transitions之间的条件关系为逻辑或。
当设置Trigger为条件时，要注意若当前的条件开始未被执行，则trigger一直处于激活状态。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Interruption动画过渡打断&lt;a href=&quot;#interruption动画过渡打断&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;521&quot; height=&quot;54&quot; src=&quot;/_astro/Pasted%20image%2020260806170033.DDz5VKS2_Z16nPjo.webp&quot; /&gt;
当Interruption Source设置为&lt;strong&gt;current State&lt;/strong&gt;，那么当前的转换就可以被部分同样的出发点出发的状态转换，为什么是部分，因为当勾选Ordered Interruption时，当前转换只能被优先级更高的打断。&lt;br /&gt;
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;513&quot; height=&quot;169&quot; src=&quot;/_astro/Pasted%20image%2020260806170152.BHj74S-x_1h1p7p.webp&quot; /&gt;
选中出发状态，Transitions排序越靠上优先级越高。&lt;/p&gt;&lt;p&gt;当选为&lt;strong&gt;next State&lt;/strong&gt;时，ordered被禁选。这时可以被终点状态出发的任何状态打断。&lt;br /&gt;
当多个转换被激活，优先执行优先级高的转换。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;除此之外&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Current State Then Next State:   当前状态优先，同时考虑下一状态。&lt;/li&gt;
&lt;li&gt;Next State Then Current State：下一状态优先，同时考虑当前状态。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;角色移动动画时会出现的两个问题&lt;a href=&quot;#角色移动动画时会出现的两个问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;移动速度与动画播放速度不匹配&lt;/li&gt;
&lt;li&gt;角色出现滑步（个人认为是因为角色的位移与骨骼运动不匹配导致的）
解决这两个问题就分别要用到混合树和rootMotion了。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;单变量混合树（1D BlendTree)&lt;a href=&quot;#单变量混合树1d-blendtree&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;当我们移动角色时需要切换多个动画片段，这时就可以用到混合树（BlendTree）来进行过渡。
混合树可以右键直接创建。&lt;/p&gt;&lt;p&gt;在混合树的inspector窗口可以在motion添加动画片段栏位，这些动画的切换是通过变量平滑控制的。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Blend Type：混合树类型控制&lt;/li&gt;
&lt;li&gt;parameter：参数选择&lt;/li&gt;
&lt;li&gt;在1D的示意图中，横轴是参数的值，纵轴则是动画片段在blend tree的权重。&lt;/li&gt;
&lt;li&gt;不同权重动画可以进行混合播放&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动画片段管理面板&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Motion：具体动画&lt;/li&gt;
&lt;li&gt;Threshold&amp;lt;动画切换阈值&amp;gt;&lt;/li&gt;
&lt;li&gt;speed&amp;lt;动画播放速度&amp;gt;&lt;/li&gt;
&lt;li&gt;最后一列位是否镜像动画&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;rootMotion&lt;a href=&quot;#rootmotion&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;rootmotion会通过相对运动来移动游戏对象。
在Animator组件勾选ApplyRootMotion，可以让角色在每次循环播放动画片段不返回起点而是接着运动。
这样就可以让动画片段控制角色移动，这时角色速度受动画判断播放速度控制。
注：root motion会考虑角色的scale&lt;/p&gt;&lt;section&gt;&lt;h4&gt;Generic&lt;a href=&quot;#generic&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;在Generic中Unity会通过指定根骨骼来应用root motion&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Bake Into Pose&amp;lt;相关transform当作动画而不是root&amp;gt; motion来处理。若变化较大会有红灯提示。&lt;strong&gt;勾选后游戏对象不会跟着移动，反之则会跟着移动&lt;/strong&gt;。所以有时像碰撞检测异常可能是这原因。
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;639&quot; height=&quot;41&quot; src=&quot;/_astro/Pasted%20image%2020260807200542.B9DWsM2Q_ZFlPi1.webp&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Based Upon：对于Generic，可以选择Root Node Rotation（Generic）或Original，前者是让动画朝向由角色的根骨骼（unity会计算，一般不准）决定，后者是由动画本来朝向决定，由美术在制作动画时设定好&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Offset&amp;lt;偏移量&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;Humanoid&lt;a href=&quot;#humanoid&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;在Humanoid中由于使用Avatar系统，动画文件不再包含对具体骨骼的描述，所以不能指定根骨骼来应用root motion。
unity为了解决这个问题，通过分析骨骼结构，计算出模型的重心center of mass（又称body transform），unity又会通过重心在水平平面的投影，作为根节点，被称为root transform;
RootMotion会把动画文件中描述的Root Transform的坐标和角度值，转换为相对位移和相对转角，并以此来移动游戏对象。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;854&quot; src=&quot;/_astro/Pasted%20image%2020260807193639.DMLhu_AO_ad3qi.webp&quot; /&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Based Upon：Body Orientation/Center of Mass，计算出的重心作为朝向，一般不太准。
Feet：用脚部骨骼&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Root Motion 和 Blend Tree&lt;a href=&quot;#root-motion-和-blend-tree&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在Inspector中可以使用Compute Thresholds根据动画片段设置阈值，可以自动算出移动速度的平均值。注意这里的阈值是针对原本的骨骼的，而不同骨骼角色使用动画，移动速度会有所区别。
&lt;strong&gt;那么如何控制角色的移动速度呢？&lt;/strong&gt;
可以在使用animator.speed/=animator.humanScale,就可以让同一个状态机下不同角色的移动速度保持一致。不过最好是把1/animator.humanScale的值传给multiplier,只改变移动时的动画播放速度。&lt;/p&gt;&lt;p&gt;若想修改速度，把动画播放速度设置为目标速度/阈值，把阈值设为目标速度，但实际上速度可能并不是恒定的，而是上下波动，这是因为rootMotion的移动速度本来就不一定匀速。&lt;/p&gt;&lt;p&gt;我们可以把animator的速度给予rb组件，注意若把y分量上的赋值，人物会在下落时速度恒定一个很低的值，因为rb速度不断被重置，所以y分量上的不赋值就解决了。但是如果受到水平分量上的力又会出现同样的问题。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Animation Layer和Avatar Mask实现动画组合&lt;a href=&quot;#animation-layer和avatar-mask实现动画组合&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在Animator面板中可以创建多个Layer,在Layer可以点击齿轮就行设置
&lt;img alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;422&quot; height=&quot;196&quot; src=&quot;/_astro/Pasted%20image%2020260808220819.CMvM4IaL_2bzto7.webp&quot; /&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Weight&amp;lt;权重&amp;gt;，0则是不使用&lt;/li&gt;
&lt;li&gt;Mask：动画蒙板，禁用Avatar部位或骨骼&lt;/li&gt;
&lt;li&gt;Blending：可以选择覆盖Override或添加Additive（混合），选择Additive时该层级对应的avatar mask上必须有实际的动画curve才能添加。&lt;/li&gt;
&lt;li&gt;Sync：同步，选中后可以选择当前层级与哪个层级保持一致&lt;/li&gt;
&lt;li&gt;IK Pass：是否可以IK操作&lt;/li&gt;
&lt;/ul&gt;&lt;section&gt;&lt;h3&gt;角色疲劳感制作&lt;a href=&quot;#角色疲劳感制作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;可以使用Additive模式加设置权重的方式添加疲劳感。
创建一个Layer作为疲劳层级，添加疲劳动画，添加模板（一般禁用四肢，为了在疲劳下四肢也能移动），然后在脚本中修改权重（animator.SetLayerWeight（））来达到逐渐疲劳的效果。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Sync和Timing做受伤状态&lt;a href=&quot;#sync和timing做受伤状态&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当我们制作例如受伤状态，需要把一整套的受伤动画代替原有的动画，可以把新的Layer里复制一整套原有的层级，但随着开发，原有会有变化。
这时可以用Sync同步，无论被同步如何改变，同步方都可以保持一致。而同步只是同步状态和状态间的转换关系，不会同步内部状态信息。比如这时后让一个空Layer同步原Layer，里面的动画片段都是空的。这样可以让新的Layer放入不同的动画表示进入了新的状态，比如受伤。你可以让角色处于受伤状态就行行走之类的操作，而不用手动设置新的转态转换是如何转换的。
&lt;strong&gt;但是不同的动画片段的时长不一定相同&lt;/strong&gt;
所以Unity会缩放进行同步的Layer里的时长，默认与被同步Layer里的一致。
&lt;strong&gt;Timing（只能在Override下使用）&lt;/strong&gt;&lt;br /&gt;
Timing可以让同步层级与被同步层级共同决定动画时长。而权重决定时长更靠近哪个，当同步Layer的权重为1，则完全听同步的，如果为0.5则取平均时长，0则完全听被同步的。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;Rigging配合IK&lt;a href=&quot;#rigging配合ik&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;使用步骤&lt;a href=&quot;#使用步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;1，&lt;strong&gt;先导入Rigging Animation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;2，选中角色物体的Animator可以，点击Rig Setup,创建Rig Builder组件
&lt;ul&gt;
&lt;li&gt;点击Bone Render SetUp可以绘制骨骼（供在场景的点击）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3，创建空子物体添加Rig组件，再传给Rig Builder，这样就可以管理Rig了&lt;/li&gt;
&lt;li&gt;4，在Rig下新加子物体添加Two Bone IK Constraint组件作为约束
&lt;ul&gt;
&lt;li&gt;这个组件就是旋转Root和Mid两根骨骼，把Tip尽量放入Target上&lt;/li&gt;
&lt;li&gt;Hint：指定手肘关节位置防止扭曲&lt;/li&gt;
&lt;li&gt;Maintain Target Offset：是否保留tip与target原有差异&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;遇到问题&lt;a href=&quot;#遇到问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不能在playMode下移动target，将Animator中片段均选择为WriteDefault问题解决&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;**还有一个究极大坑，在playmode下修改target的引用是无效的，它会继续使用缓存中的，改进方法有把原先引用改到目标位置，或者重新构建RigBuilder刷新缓存来达到更换引用目的。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;关于Curve&lt;a href=&quot;#关于curve&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;可以在动画片段的Inspector窗口中可以添加Curve，是一个参数，在动画播放时修改，如果在Animator有同名参数，会把值传递过去，这样就可在脚本中进行读取等操作。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2D混合树&lt;a href=&quot;#2d混合树&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;</content:encoded></item><item><title>Unity暑期学习经历分享</title><link>https://xingchen-blog.com/posts/2026-08-01-unity-summer-learning-sharing/</link><guid isPermaLink="true">https://xingchen-blog.com/posts/2026-08-01-unity-summer-learning-sharing/</guid><description>分享学习经历</description><pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;概要&lt;a href=&quot;#概要&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这篇博客主要分享我从6月下旬开始，作为初学者看的一些课以及踩的坑。我的目标时游戏客户端，考虑到暑期这时已经准大三，时间紧迫，学的有些急，但总体这一个月下来收获还不错。
&lt;strong&gt;我的学习笔记也全都上传至github仓库&lt;/strong&gt;欢迎star或fork。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;👉 &lt;strong&gt;&lt;a href=&quot;https://github.com/xingchen-jin/learn&quot; target=&quot;_blank&quot;&gt;xingchen-jin/learn&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;银鸟工作室-SC101&amp;amp;SC102 （推荐指数★★★★★）&lt;a href=&quot;#银鸟工作室-sc101sc102-推荐指数&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;主讲教师：刘品村&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;优点：全是优点&lt;br /&gt;
缺点：没有缺点&lt;br /&gt;
总评：&lt;/p&gt;&lt;p&gt;这是银鸟工作室的公益课，课程时长适中，但涵盖内容极其丰富。课程内容通过讲解知识点为主，实践为辅的教学方法，可以让初学者快速了解学习unity常用基础知识。你可以通过SC101快速学习c#基础语法，2d/3d物理系统，协程与事件，场景与存档，动画，ui等入门必会知识。而SC102可以进阶的学习C#用法，设计模式，程序化生成等进阶知识。&lt;br /&gt;
如果有一定编程基础，科班想快速入门Unity，这是一门非常不错的课程，当然我非常建议在每节课结束后，自己独立的去实现课上内容，遇到不会的可以问ai，以及参考老师写的代码。&lt;/p&gt;&lt;p&gt;刚好老师的独游工作室，在这个暑假发布了自己第一款游戏Demo，玛卡之歌，画风治愈可爱，感兴趣的可以支持一波。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;麦扣老师-3DRPG （推荐指数★★★★☆）&lt;a href=&quot;#麦扣老师-3drpg-推荐指数&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;我只看了前面免费的部分，当然也足够了。
优点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;1，简单易上手&lt;/li&gt;
&lt;li&gt;2，老师讲解的详细&lt;/li&gt;
&lt;li&gt;3，游戏比较完整&lt;/li&gt;
&lt;li&gt;4，课程免费&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;缺点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;1，非常基础&lt;/li&gt;
&lt;li&gt;2，没什么设计模式，有单例模式和事件呼叫的简单实现。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;总评：&lt;br /&gt;
如果像我已经学了银鸟的课，想快速的制作自己第一款demo，那么这门课还是不错的入门。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;麦扣老师 -麦田物语（推荐指数★★★☆☆）&lt;a href=&quot;#麦扣老师--麦田物语推荐指数&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这是我7月学的最后一门课，花费两周多时间，课很长，我每天起早贪黑的学，才能在这么短时间完成，我并不推荐学我这样做，学东西更重要的是吸收的全不全面。&lt;/p&gt;&lt;p&gt;优点：
涵盖内容丰富，有单例模式，对象池，2d瓦片地图编辑，图像资源简单处理，对话系统，背包系统，MVC模式，UI系统，Tilemap，2d灯光设置，NPC的A星算法寻路，UI Tookit，SO实现数据驱动编辑数据，事件监听系统降低耦合。&lt;/p&gt;&lt;p&gt;缺点：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;1，太长&lt;/li&gt;
&lt;li&gt;3，教程时代比较久，有新的教程&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;总评：
如果是目标做2d独立游戏，或有充足的时间，这门课可以成为你完成自己的梦想的强大助力。这个教程课时很长，整个游戏比较完整，框架可扩展性还是不错的。我当时看的时候因为过于急功近利，所以很多东西掌握的不太牢靠，所以这门课一定一定要耐心看完，并自己独立再上手做一遍。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;暑期后续规划以及个人感想&lt;a href=&quot;#暑期后续规划以及个人感想&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;在8月份，学习Games101图形学基础。完成一款独立制作完成度不错的3DARPGdemo，使用状态机，inputSystem等。&lt;/p&gt;&lt;p&gt;我是一个极其容易内耗的人，常常会沉浸在焦虑中。我害怕自己会做不好，学不会，我怕自己是一个没用的人，无法满足他人的期待，怕自己做的事浪费了时间。这些焦虑不断鞭策的我，但结果就是学也没学好，玩也不尽兴。&lt;/p&gt;&lt;p&gt;大学期间为主要是跟随着学校学习，我在大二的时候，以Java大作业为契机，复刻了我的童年经典，口袋妖怪。我把它上传到B站和Github，得到了极大的满足，也开始对游戏开发起了兴趣。
但之后还是跟着学校学习，并没有开始自学，直到6月下旬左右收到考试的通知。我意识到已经这么晚了便打醒了我。&lt;/p&gt;&lt;p&gt;之后我收集网上信息，以及企业发在招聘网上的用人需求，定下学Unity。并在完成大作业之后，同步看银鸟的课学习Unity和期末复习。我们这学期重要的课有计算机组成和操作系统，是我重点复习目标。剩下的python，数据库等课靠平时的积累分数也不算太差。所以还是有比较充足的时间学习Unity的。最后顺利通过期末周，开始暑期的系统学习。&lt;/p&gt;&lt;p&gt;对我来说学习的最大动力就是兴趣，之后我会继续坚持做自己感兴趣的事，愿你我都能够朝着梦想走的更远。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;感谢你的阅读&lt;a href=&quot;#感谢你的阅读&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;/section&gt;</content:encoded></item><item><title>HELLO WORLD</title><link>https://xingchen-blog.com/posts/again-start/</link><guid isPermaLink="true">https://xingchen-blog.com/posts/again-start/</guid><description>分享编程学习经历</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这是我的第一篇个人博客，用了Firefly框架。后续我会更新一些关于编程与游戏开发的相关内容。&lt;/p&gt;</content:encoded></item></channel></rss>