匿名
未登录
中文
讨论
贡献
创建账号
登录
Minecraft基岩版开发Wiki
搜索
致编者:请牢记我们的域名
wiki.mcbe-dev.net
!
致编者:欢迎加入本Wiki的官方交流
QQ群
或
Discord服务器
!
基岩版1.19.31
现已发布!(
了解更多
)
Inner Core
现已支持Xbox模组联机!(
了解更多
)
如果您是第一次来到本Wiki,欢迎
注册一个账户
点击顶部的“编辑”或“编辑源代码”按钮即可编辑当前页面
请知悉:在不登录时也可以编辑和新建页面,但是您当前的IP地址会记录在编辑历史中
编辑“
Molang
”(章节)
来自Minecraft基岩版开发Wiki
命名空间
页面
讨论
更多
更多
语言
变体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
页面操作
阅读
编辑
历史
刷新
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
==语法结构== ===基本语法=== Molang的语法结构大多基于简单的[[wzh:C语言|C语言]]语法。脚本可以由一个简单数学计算表达式构成,当需要更复杂的代码的时候,它也可以由多个语句组成。 ====简单表达式==== 简单表达式指仅包含一个语句的完整表达式,例如: <syntaxhighlight lang="cpp" start="0"> math.sin(query.anim_time * 1.23) </syntaxhighlight> <br> ====复杂表达式==== 复杂表达式指包含两个及两以上语句的完整表达式,每个语句都按顺序求值。复杂表达式中每个语句句末必须使用<code>;</code>结尾,最后一句句末也需要<code>;</code>,例如: <syntaxhighlight lang="cpp" start="0"> temp.moo = math.sin(query.anim_time * 1.23); temp.baa = math.cos(query.life_time + 2.0); return temp.moo * temp.moo + temp.baa; </syntaxhighlight> 在复杂表达式中,也就是当有多个语句的句末皆以<code>;</code>结尾时,若无<code>return</code>语句或其他语句求值,将直接返回0.0。<code>return</code>语句将用来退出当前Molang脚本作用域并计算其后表达式的值,类似C语言。 ===大小写区分=== 除字符串外,Molang中的所有内容都是对大小写不敏感。 ===关键字=== {{Ambox|small=left|text=所有不在下表列出范围内的字符,将作保留以供将来使用。}} {| class="sortblem wikitable collapsible" ! 关键字 ! 描述 |- | 1.23 |数值常量。 |- | <span style="letter-spacing:5px;">!</span>&<span style="letter-spacing:5px;">&</span><nowiki>|</nowiki><span style="letter-spacing:5px;"><nowiki>|</nowiki></span><span style="letter-spacing:5px;"><</span><<span style="letter-spacing:5px;">=</span><span style="letter-spacing:5px;">></span>><span style="letter-spacing:5px;">=</span>=<span style="letter-spacing:5px;">=</span>!= |[[Molang#逻辑运算符|逻辑运算符]]。 |- | style="letter-spacing:5px;" | */+- |基本的算术运算符。 |- |= |赋值运算符。 |- | style="letter-spacing:5px;" | () |用于控制运算表达式的先后顺序的圆括号。 |- | style="letter-spacing:5px;" | {} |用于控制执行作用域的[[Molang#{}花括号作用域定界符|花括号]]。 |- | ?? |[[Molang#空值合并运算符|空值合并运算符]],用于定义在变量丢失或活动对象不存在时的值。 |- | <div style="white-space: nowrap;">geometry.<''texture_name''></div> |用于对[[几何]]文件内命名的引用。 |- | <div style="white-space: nowrap;">material.<''texture_name''></div> |用于对[[材质]]文件内命名的引用。 |- | <div style="white-space: nowrap;">math.<''function_name''></div> |预设[[Molang#数学函数|数学函数]],用于进行各种数学运算。 |- | <div style="white-space: nowrap;">query.<''function_name''></div> |预设[[Molang#查询函数|查询函数]],用于对游戏内各项数据进行查询。 |- | <div style="white-space: nowrap;">temp.<''variable_name''></div> |临时变量。 |- | <div style="white-space: nowrap;">texture.<''texture_name''></div> |用于对[[纹理]]命名的引用。 |- | <div style="white-space: nowrap;">variable.<''variable_name''></div> |实体变量。 |- | ?: |三元条件运算符。当问号左边的表达式为真,则将问号与冒号中间表达式的值作为整个表达式的取值,反之则将冒号后面表达式的值作为整个表达式的取值。 |- | ? |二元条件运算符。当运算符左边的表达式为真,则将右边表达式的值作为整个表达式的取值,反之直接输出0。 |- | this |该脚本(在指定上下文的情况下)最终写入值的当前值。 |- | return |用于在[[Molang#复杂表达式|复杂表达式]]中计算其后的语句并停止脚本的执行,然后返回计算出的值。 |- | <nowiki>-</nowiki>> |[[Molang#->指针运算符|指针运算符]],用于访问来自不同实体的数据。 |- | <div style="white-space: nowrap;">context.<''variable_name''></div> |上下文变量。 |- | loop |用于重复执行一段或多段语句N次。 |- | for_each |用于遍历迭代一个实体数组。 |- | break |用于提前退出{{samp|loop}}或{{samp|for_each}}的作用域。 |- | continue |用于跳过{{samp|loop}}或{{samp|for_each}}迭代语句的剩余部分,并进入到下一次迭代。 |- | style="letter-spacing:5px;" |[] |用于访问数组的方括号。 |} ===逻辑运算符=== {| class="wikitable collapsible" !运算符 !<div style="white-space:nowrap; padding:0em 6em 0em 6em;">描述</div> !示例 |- |! |逻辑非运算符(一元运算符)。用于反转其后表达式的真假,使一个表达式的结果从<code>true</code>变为<code>false</code>,从<code>false</code>变为<code>true</code>。 |<code>!query.is_sleeping</code> |- |&& |逻辑与运算符(二元运算符)。用于将两个表达式连接成一个。只有当两个表达式都为<code>true</code>,整个表达式的结果才能为<code>true</code>。 |<code>query.health == 10 && query.is_moving</code> |- |<nowiki>||</nowiki> |逻辑或运算符(二元运算符)。用于将两个表达式连接成一个。只要其中任意一个表达式为<code>true</code>整个表达式都为<code>true</code>。 |<code>query.moving <nowiki>|| </nowiki>query.is_swimming</code> |- |< |小于运算符。用于比较左右两边表达式数值的大小,左边小于右边即为<code>true</code>,反之则为<code>false</code>。 |<code>query.health < 5</code> |- |<= |小于等于运算符。用于比较左右两边表达式数值的大小,左边小于或等于右边即为<code>true</code>,反之则为<code>false</code>。 |<code>query.block_face <= 2</code> |- |>= |大于等于运算符。用于比较左右两边表达式数值的大小,左边大于或等于右边即为<code>true</code>,反之则为<code>false</code>。 |<code>math.ceil(query.health) >=query.on_fire_time</code> |- |> |大于运算符。用于比较左右两边表达式数值的大小,左边大于右边即为<code>true</code>,反之则为<code>false</code>。 |<code>query.day > 7</code> |- |== |等于运算符。当左边与右边表达式的结果相等时即为<code>true</code>,反之则为<code>false</code>。 |<code>query.block_face == query.cardinal_player_facing</code> |- |!= |不等于运算符。当左边与右边表达式的结果不相等时即为<code>true</code>,反之则为<code>false</code>。 |<code>query.body_x_rotation != query.body_y_rotation</code> |} ===优先级=== 当不使用圆括号时,Molang运算符遵循下表顺序来确定先运算哪个表达式,这与C或C++类似。下表中优先级从上往下依次降低,优先级较高的运算符在表达式中会先进行计算。当运算符具有相同的优先级时,它们按从左往右的顺序进行计算,但三元条件运算符除外,它将会从右往左计算。使用圆括号可以直接控制计算顺序,一般用于更复杂的表达式。 {| class="wikitable collapsible" !优先级组 !<div style="white-space:nowrap; padding:0em 6em 0em 6em;">描述</div> |- |逻辑非 |逻辑非“!”逻辑运算符。 |- |乘除 |乘法“*”和除法“/”算术运算符。 |- |加减 |加法“+”和减法“-”算术运算符。 |- |比较 |“<”、“<=”、“>”、“>=”关系运算符。 |- |相等检查 |相等“==”和不相等“!=”关系运算符。 |- |逻辑与 |逻辑与“&&”逻辑运算符。 |- |逻辑或 |逻辑或“<nowiki>||</nowiki>”逻辑运算符。 |- |三元条件 |三元条件运算符“?:”。当有多个三元条件运算符时,从右往左计算。 |- |空值合并 |[[Molang#空值合并运算符|空值合并运算符]]“??”。 |} ===变量=== 一个变量的生命周期可以是以下三种之一:临时变量、实体变量和上下文变量。 *临时变量是可读写的,并且依照C语言的规则,它们应在它们所定义的作用域中是有效的。出于性能原因,在当前的脚本执行中,临时变量的生存周期仍是全局的,并且可能在它们所定义的最外层作用域之外仍能返回一个有效值,故在复杂的表达式中需多加注意。 *实体变量是可读写的,并在实体的生命周期内将其值存储在实体上。在当前时刻这些变量都不会被保存,所以退出和重新加载世界将使它们重新初始化。同样,如果实体从世界中消失,实体上的任何变量都将丢失。 *上下文变量是只读的,并且只对运行它们的脚本有效。游戏内部定义了这些变量。 ===值=== *所有的数字值都是浮点数。 *布尔值都会被转换并存储为浮点值,false和true分别转换为0.0和1.0。 *对于布尔检测,等于0.0的浮点值为假,不等于0.0的值为真。 *对于数组下标,浮点数将采用C语言形式的强制转换转换为整型,当出现负数时钳制为0,数字过大时顶封到与数组长度相同。 *其他支持的类型有: #[[几何]] #[[纹理]] #[[材质]] #活动对象引用 #活动对象引用数组 #字符串 #[[Molang#结构体|结构体]] *错误(如被零除、变量丢失、空引用等)通常返回0.0值。 ===查询函数=== 查询函数允许Molang脚本读取游戏数据。如果查询函数不含带参数,则括号<code>()</code>可以不写。有关查询函数的完整列表,可参见下方的[[Molang#查询函数清单|查询函数清单]]。 ===别名=== 为了减少打字负担并在阅读和编写Molang时提高可读性,以下关键字的别名可以使开发者在编写过程中更轻松。下表左侧和右侧的功能相同。 ====别名映射==== {| class="sortblem wikitable" !全名 !别名 |- |context.moo |c.moo |- |query.moo |q.moo |- |temp.moo |t.moo |- |variable.moo |v.moo |} 下方是一个示例: <syntaxhighlight lang="cpp" start="0"> math.cos(query.anim_time * 38) * variable.rotation_scale + variable.x * variable.x * query.life_time; </syntaxhighlight> 该示例也可以也可以写成: <syntaxhighlight lang="cpp" start="0"> math.cos(q.anim_time * 38) * v.rotation_scale + v.x * v.x * q.life_time </syntaxhighlight> 这两种语法还可以根据需要来混合使用,例如: <syntaxhighlight lang="cpp" start="0"> math.cos(q.anim_time * 38) * variable.rotation_scale + v.x * variable.x * query.life_time </syntaxhighlight> ===结构体=== 与C语言不同,数据结构是通过使用方法隐式定义的。它们的目的是更有效地传递数据,例如传递<code>v.location</code>而非<code>v.x</code>、<code>v.y</code>和<code>v.z</code>。例如: <syntaxhighlight lang="cpp" start="0"> v.location.x = 1; v.location.y = 2; v.location.z = 3; v.another_mob_set_elsewhere->v.first_mobs_location = v.location; </syntaxhighlight> 下方给出的更多脚本示例中,每个都会返回<code>1.23</code>: <syntaxhighlight lang="cpp" start="0"> v.cowcow.friend = v.pigpig; v.pigpig->v.test.a.b.c = 1.23; return v.cowcow.friend->v.test.a.b.c; </syntaxhighlight> <syntaxhighlight lang="cpp" start="0"> v.cowcow.friend = v.pigpig; v.pigpig->v.test.a.b.c = 1.23; v.moo = v.cowcow.friend->v.test; return v.moo.a.b.c; </syntaxhighlight> <syntaxhighlight lang="cpp" start="0">v.cowcow.friend = v.pigpig; v.pigpig->v.test.a.b.c = 1.23; v.moo = v.cowcow.friend->v.test.a; return v.moo.b.c; </syntaxhighlight> <syntaxhighlight lang="cpp" start="0"> v.cowcow.friend = v.pigpig; v.pigpig->v.test.a.b.c = 1.23; v.moo = v.cowcow.friend->v.test.a.b; return v.moo.c; </syntaxhighlight> <syntaxhighlight lang="cpp" start="0"> v.cowcow.friend = v.pigpig; v.pigpig->v.test.a.b.c = 1.23; v.moo = v.cowcow.friend->v.test.a.b.c; return v.moo; </syntaxhighlight> 嵌套或递归的结构可以拥有任意深度。也就是说,尽量不要将一个完整的结构体复制到其他结构中,以免由于被复制的结构体层次过深导致游戏在遍历时出现内存溢满,也不要将结构体做得太深,因为每深一层游戏都会损失部分性能。 ===字符串=== Molang中的字符串用单引号引起来,例如:<code>'minecraft:pig'</code>或<code>'hello world!'</code>。空字符串定义为两个相对的单引号,此时对字符串的操作仅支持<code>==</code>和<code>!=</code>。<ref group="注">字符串不支持<code>'</code>字符,因为目前不支持字符转义。</ref> ===参数=== 函数的参数写在函数末尾的圆括号中,每两个参数之间使用<code>,</code>隔开,例如: <syntaxhighlight lang="cpp" start="0"> math.random(0,3) </syntaxhighlight> 函数名<code>math.random</code>与参数括号<code>(0,3)</code>之间不能有空格,每个参数两边允许有任意数量的空格。 Molang中并不是所有的函数都能使用参数;不同函数中参数的位置不同,作用也不同。
摘要:
请注意您对Minecraft基岩版开发Wiki的所有贡献都被认为是在知识共享署名-非商业性使用-相同方式共享下发布,请查看在
Minecraft基岩版开发Wiki:版权
的细节。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源。
请勿私自提交受版权保护的材料!
您也可以将取自Mojang(及其网站、说明、指南、艺术概念、渲染图、出版物、第三方网站组件,以及其他此类Mojang已对外公开的受保护材料)的内容上传至Minecraft基岩版开发Wiki。所有权力、署名与利益在合适时仍归属Mojang,也不依照许可被授权。
取消
编辑帮助
(在新窗口中打开)
该页面属于1个隐藏分类:
Category:使用DynamicPageList3的dplreplace解析器函数的页面
我们提供服务需要使用Cookie。您使用我们的服务,即表示您同意我们使用Cookie。
更多信息
确定
导航
导航
首页
最近更改
随机页面
社区门户
新闻动态
计划
沙盒
关于
导航
开发
附加包
模组SDK
ModPE Installer
BlockLauncher
Inner Core
ModdedPE
基岩版专用服务器
ElementZero
Cloudburst Nukkit
合作伙伴
Mineprogramming Wiki
bedrock.dev
友情链接
中文 Minecraft Wiki
我的世界中文论坛
MCDevs Wiki
Inner Core 中文社区
wiki工具
wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志
其他项目
变体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體