匿名
未登录
中文
讨论
贡献
创建账号
登录
Minecraft基岩版开发Wiki
搜索
致编者:请牢记我们的域名
wiki.mcbe-dev.net
!
致编者:欢迎加入本Wiki的官方交流
QQ群
或
Discord服务器
!
基岩版1.19.31
现已发布!(
了解更多
)
Inner Core
现已支持Xbox模组联机!(
了解更多
)
如果您是第一次来到本Wiki,欢迎
注册一个账户
点击顶部的“编辑”或“编辑源代码”按钮即可编辑当前页面
请知悉:在不登录时也可以编辑和新建页面,但是您当前的IP地址会记录在编辑历史中
编辑“
Molang
”
来自Minecraft基岩版开发Wiki
命名空间
页面
讨论
更多
更多
语言
变体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
页面操作
阅读
编辑
历史
刷新
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
{{trans|n}} {{Distinguish2|'''[[mcwzh:Mojang|Mojang]]'''}}{{featured article}} [[File:Molang.jpg|thumb|玩家渲染控制器中使用的Molang表达式。]] '''Molang'''是一种简单的基于表达式的语言,为实时且快速地计算数值而设计。它的设计重点是在JavaScript无法大规模执行的需要更高性能的系统中启用类似脚本的功能。Mojang提供这些底层系统中的脚本功能来支持用户修改模组,自定义[[实体]]、[[动画#渲染控制器|渲染]]和[[动画]]。 ==语法结构== ===基本语法=== 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中并不是所有的函数都能使用参数;不同函数中参数的位置不同,作用也不同。 ==运算表达== ===公共变量=== 通常,一个生物的变量被认为是该生物的私有变量,而另一个生物无法访问。要向其他生物开放此变量的只读访问权限,需要在所拥有实体的资源定义中对该变量设置<code>"public"</code>。另外,建议默认初始化变量。 <syntaxhighlight lang="json" line> { "format_version": "1.10.0", "minecraft:client_entity": { "description": { ... "scripts": { "variables": { "variable.oink": "public" }, "initialize": [ "variable.oink = 0;" ], ... }, ... } } } </syntaxhighlight> <br> ===<span style="letter-spacing:5px;">{}</span>花括号作用域定界符=== 通过用<code>{</code>和<code>}</code>符号限定,可以将一系列语句划分为一个组。这主要用于[[Molang#loop|循环]]和条件语句中: <syntaxhighlight lang="cpp" start="0"> (v.moo > 0) ? { v.x = math.sin(q.life_time * 45); v.x = v.x * v.x + 17.3; t.sin_x = math.sin(v.x); v.x = t.sin_x * t.sin_x + v.x * v.x; v.x = math.sqrt(v.x) * v.x * math.pi; } </syntaxhighlight> <br> ===loop=== “loop”函数用于多次执行表达式,其包含两个参数:<code>loop(''count'',''expression'');</code>,第一个参数用于设置循环次数,第二个参数为需要循环执行的表达式。为了安全起见,Mojang对该函数设置了循环次数限制,其循环计数器最大次数为1024。另外,尽量不要将过多循环函数套用。 使用该函数可以编写出一些特别的功能,例如[[wzh:斐波那契数|斐波那契数]]计算器: <syntaxhighlight lang="cpp" start="0"> v.x = 1; v.y = 1; loop(10, { t.x = v.x + v.y; v.x = v.y; v.y = t.x; }); </syntaxhighlight> <br> ===for_each=== 为了遍历一个数组,需要使用“for_each”函数(例如<code>query.get_nearby_entities</code>将返回一个包含实体的数组)。它需要三个参数:<code>for_each(''variable'', ''array'', ''expression'');</code>,其中的第一个参数可以是任何的变量,包括<samp>temp.</samp>和<samp>variable.</samp>,使用<samp>temp.</samp>可以防止污染实体的变量空间;第二个参数是一个数组;第三个参数是为数组中的每个元素执行的任何Molang表达式。 ===->指针运算符=== 查询函数的一些返回值,或者存储在临时/实体/上下文变量中的值可以是对另一个实体的调用。“->”运算符允许脚本访问变量或对该实体进行查询。例如,下面的示例将查询当前实体四米范围内的所有羊(如果该实体是羊,则包括其自身),如果每只羊正上方的方块带有<samp>stone</samp>标签,则增加变量<code>v.x</code>: <syntaxhighlight lang="cpp" start="0"> "v.x = 0; for_each(v.pig, query.get_nearby_entities(4, 'minecraft:sheep'), { v.x = v.x + v.pig->query.relative_block_has_all_tags(0, 1, 0, 'stone'); });" </syntaxhighlight> 如果“->”运算符的左侧有错误(值为<code>null</code>,该实体之前已被清除,或者存在其他问题),则表达式不会计算右边的值,并返回0。 ===break=== 该运算符用于提前退出“[[Molang#loop|loop]]”或“[[Molang#for_each|for_each]]”。例如: <syntaxhighlight lang="cpp" start="0"> v.x = 1; v.y = 1; loop(10, {t.x = v.x + v.y; v.x = v.y; v.y = t.x; (v.y > 20) ? break;}); </syntaxhighlight> 根据C风格的语言规则,这将立即退出最内部的活动循环。 如果使用下方示例: <syntaxhighlight lang="cpp" start="0"> v.x = 0; loop(10, {loop(10, {v.x = v.x + 1; (v.x > 5) ? break;});}); </syntaxhighlight> 当<code>v.x</code>大于5时,“break”语句将终止内部循环,并继续处理外部循环的脚本。由于<code>v.x</code>未在外部循环之间重置,因此第二次进入内部循环时,这将使<code>v.x</code>再添加1,然后再次退出内部循环,从而导致<code>v.x</code>的最终值为6+1+1+1+…+1=15。 ===continue=== “continue”函数按照C风格的语言规则执行函数,当前仅在循环中受支持。使用该函数可跳到当前循环的下一个迭代。关于内部/外部循环的更多详细信息,请参见上方的“[[Molang#break|break]]”。 下方示例将导致<code>v.x</code>变为6.0,因为一旦达到该值,剩余增量将被跳过。<ref group="注">在这种人为设计的情况下最好打破循环,因为它比继续执行所有的10次迭代更高效。</ref> <syntaxhighlight lang="cpp" start="0"> v.x = 0; loop(10, { (v.x > 5) ? continue; v.x = v.x + 1; }); </syntaxhighlight> <br> === ?<span style="letter-spacing:5px;">?</span>空值合并运算符=== 与[[wzh:C♯|C#]]中的空值合并运算符的工作方式类似,使用空值合并运算符可以引用可能存在或可能不存在的变量,而不会看到内容错误。以前,如果变量不存在,则会出现内容错误。这是为了确保变量始终正确初始化,以避免未初始化的变量错误,但这需要初始化脚本,或者在某些情况下需要一些复杂的解决方案来确保变量被初始化。现在,如果提前知道某个变量不会在脚本的第一次运行中初始化,则可以使用该运算符: <syntaxhighlight lang="cpp" start="0"> variable.x = (variable.x ?? 1.2) + 0.3; </syntaxhighlight> 上述示例中,如果有效,则使用<code>variable.x</code>的值;如果<code>variable.x</code>无效,则会使用<code>1.2</code>。 下方列出了变量无效的情况: *尚未初始化 *对已删除实体的引用 *无效的引用 *包含错误内容 “??”运算符仅对<code>variable.</code>、<code>temp.</code>和<code>context.</code>有效,它们包含对数字或实体的引用,但不包含诸如[[材质]]、[[纹理]]或[[几何]]等资源(因为这些必须存在且有效,否则这属于内容错误)。如果第一个参数出现错误,它将返回第二个参数。<ref group="注">Molang的法则是:如果某个内容出错或值不正确,则会将其转换为0.0(并且通常会在屏幕上抛出[[内容日志]]报错)。内容错误可能会阻止将内容上传到市场。</ref> ==分域示例== {{ambox|text=翻译后需按照本Wiki的格式重新组织文本语言。}} ===实体脚本定义=== 在定义文件中有一个预计算值的部分,这些值在动画和渲染控制器被处理之前立即执行,并存储在实体中。其目的是预先计算您可能希望在脚本中再次使用的任何昂贵的复杂值,长作用域索引变量更新,或者通常是任何一次性计算的呈现刻。 <syntaxhighlight lang="json" line> "scripts": { "pre_animation": [ "variable.my_constant = (Math.cos(query.modified_distance_moved * 38.17) * query.modified_move_speed;", "variable.my_constant2 = Math.exp(1.5);" ] }, </syntaxhighlight> ===动画与动画控制器文件=== 这些动画皆是数字操作,用于控制播放哪些动画以及如何设置其骨骼动画。 <code>variable.variable_name</code> 与 <code>query.function_name</code> 指的是当前正被渲染的实体。 使用其可访问语言中的任何内容,但不包含诸如[[材质]]、[[纹理]]或[[几何]]等资源(因为这些必须存在且有效,否则这将是内容错误)。 ===渲染控制器=== 这里有几种不同的表达方式,其中上下文可表明其允许与否。与动画控制器一样,实体访问器指的是当前实体,但是取决于其上下文中内容还可以访问[[材质]]、[[纹理]]与[[几何]]。这里有两种不同的渲染控制器: *数组定义(可选) *资源使用(必需) “数组定义”部分允许您根据需要按资源类型创建资源数组,以便您在“资源使用”部分中引用。 ====数组表达式==== 对于三种资源类型([[材质]]、[[纹理]]与[[几何]]),其中任意一种都可以定义为一个资源数组。资源的名称是定义文件中的好名字(nice-name,可能指的是机器可识别的变量名)。下面以以材质为例: <syntaxhighlight lang="json" line> "arrays": { "materials": { "array.my_array_1": ["material.a", "material.b", "material.c"], "array.my_array_2" : ["material.d", "material.e"], "array.my_array_3" : ["array.my_array_1", "material.my_array_2"], "array.my_array_4" : ["array.my_array_2", "material.my_array_3"], "array.my_array_5" : ["array.my_array_1", "material.my_array_1", "material.my_array_4"], "array.my_array_6" : ["array.my_array_1", "material.f"], ... }, </syntaxhighlight> 请注意,数组的所有元素必须是同一类型。即[[纹理]]数组只能包含[[纹理]]为元素,其他亦然。 一个数组可以引用零个或多个数组(如果需要,包括重复的数组)且同样可以引用零个或多个材质(再说一遍!如果需要,可以包括重复的数组)的任意组合,且可以有任意个数组,每个数组包含任意个元素。同理,如果数组的成员中包含数组,则它们的长度也不必相同。在“资源使用”部分中为数组编制索引时,要使用数字表达式。若表达式值为负,则会以零为索引。任何非负索引都将转换为整数,并根据数组的大小进行整理,原理如下: <syntaxhighlight lang="json" line> index = max(0, expression_result) % array_size </syntaxhighlight> ====[[客户端|资源]]表达式==== 资源表达式必须根据上下文返回特定类型的单个资源。 例如,在 <code>geometry</code> 组,必须生成将生成单个geometry的表达式。一些例子: 以每秒一次的速率在geometry数组中循环 <syntaxhighlight lang="json" line> "geometry": "array.my_geometries[query.anim_time]" </syntaxhighlight> 根据实体标志选择geometry <syntaxhighlight lang="json" line> "geometry": "query.is_sheared ? geometry.sheared : geometry.woolly" </syntaxhighlight> 使用特定的geometry <syntaxhighlight lang="json" line> "geometry": "geometry.my_geo" </syntaxhighlight> 睡眠时使用特定的geometry,否则根据余弦曲线遍历数组,当余弦曲线为负时,几乎有一半的时间使用数组第1个内容。 <syntaxhighlight lang="json" line> "geometry": "query.is_sleeping ? geometry.my_sleeping_geo : array.my_geos[math.cos(query.anim_time * 12.3 + 41.9) * 10 + 0.6]" </syntaxhighlight> ====资源段落==== =====[[几何]]===== geometry部分指定渲染时要使用的geometry。您可以在定义文件中指定尽可能多的渲染控制器,单个渲染控制器仅关注如何渲染单个geometry。注意,geometry可以使用任意数量的骨骼和多边形进行任意复杂的操作。 =====[[材质]]===== “材质”部分指定如何映射geometry的骨骼的材质。单个材质将映射到整个geometry上。材质的表达式按所列顺序计算。每个语句的第一部分是要应用材质的模型骨骼的名称,第二部分是要使用的材质。模型部件名可以使用 <code>*</code> 进行通配符匹配。例如 : <syntaxhighlight lang="json" line> "materials": [ { "*": "Material.default" }, { "TailA": "array.hair_colors[variable.hair_color]" }, { "Mane": "array.hair_colors[variable.hair_color]" }, { "*Saddle*": "variable.is_leather_saddle ? material.leather_saddle : material.iron_saddle" } ], </syntaxhighlight> #This will start by applying Material.default to all model parts. #It will set the material on a model part named <code>TailA</code> to the result of the expression <code>Array.hairColors[variable.hair_color]</code>. This will look up some previously created variable on the entity named hair_color and use that to index into a material array called <code>array.hair_colors</code> defined in this render controller. This will overwrite the Material.default material set in the line above. #It will look up the same material as the expression is identical, and apply it to the <code>Mane</code> model part. #If will find any model part starting with, ending with, or containing <code>Saddle</code> (case sensitive) and change its material to either <code>material.leather_saddle</code> or <code>material.iron_saddle</code> depending on the previously set entity variable <code>variable.is_leather_saddle</code>. ==函数表达== {{:Molang/函数表达}} ==内置变量== {{:Molang/内置变量}} ==实验性运算符== 未来的一些[[Molang#关键字|运算符]]可能暂时属于{{exg}},它们将在此处列出。目前Mojang尚未添加任何实验性运算符。 ==版本化变更== {{:Molang/版本化变更}} ==历史== {{:Molang/历史}} ==漏洞 == {{issue list}} ==你知道吗== *从{{verlink|1.8.0.24}}起官方文档中开始出现Molang,而从{{verlink|1.16.200.51}}起,Mojang才开始在更新日志中写入关于Molang的更新内容。 *Molang最初就是为了[[动画]]、[[动画控制器]]和[[渲染控制器]]数据驱动而加入的。 *全局参数是旧版本游戏中Molang的一种关键字,它从{{verlink|1.10.0.3}}起被查询函数取代。全局参数有以下5种:{{cd|global.anim_time}}、{{cd|global.delta_time}}、{{cd|global.key_frame_lerp_time}}、{{cd|global.life_time}}和{{cd|global.frame_alpha}},它们分别对应现在的{{cd|[[Manual:query.anim_time|query.anim_time]]}}、{{cd|[[Manual:query.delta_time|query.delta_time]]}}、{{cd|[[Manual:query.key_frame_lerp_time|query.key_frame_lerp_time]]}}、{{cd|[[Manual:query.life_time|query.life_time]]}}和{{cd|[[Manual:query.frame_alpha|query.frame_alpha]]}}。 *在{{verlink|1.8.0.11}}及更早的版本中,查询函数的格式为{{cd|entity.flags.foo}}和{{cd|entity.member.foo}},并且函数名使用驼峰命名法而非现在的蛇形命名法;实体变量的格式为{{cd|entity.foo}};全局参数的格式为{{cd|params.foo}}。 ==参见== *[[纹理]] *[[材质]] *[[粒子]] *[[动画]] *[[附加包]] *[[实体]] ==注释== {{notelist}} <br> <br> {{Navbox_Addon}}
摘要:
请注意您对Minecraft基岩版开发Wiki的所有贡献都被认为是在知识共享署名-非商业性使用-相同方式共享下发布,请查看在
Minecraft基岩版开发Wiki:版权
的细节。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源。
请勿私自提交受版权保护的材料!
您也可以将取自Mojang(及其网站、说明、指南、艺术概念、渲染图、出版物、第三方网站组件,以及其他此类Mojang已对外公开的受保护材料)的内容上传至Minecraft基岩版开发Wiki。所有权力、署名与利益在合适时仍归属Mojang,也不依照许可被授权。
取消
编辑帮助
(在新窗口中打开)
本页使用的模板:
Molang/内置变量
(
编辑
)
Molang/函数表达
(
编辑
)
Molang/历史
(
编辑
)
Molang/版本化变更
(
编辑
)
Template:Ambox
(
查看源代码
)(受保护)
Template:Category handler
(
编辑
)
Template:Cd
(
编辑
)
Template:Code
(
编辑
)
Template:Distinguish2
(
编辑
)
Template:Exg
(
编辑
)
Template:Experience gameplay
(
编辑
)
Template:Featured article
(
编辑
)
Template:Fullurl
(
编辑
)
Template:Hatnote
(
编辑
)
Template:History
(
编辑
)
Template:IfEntry
(
编辑
)
Template:Issue list
(
编辑
)
Template:Msgbox
(
查看源代码
)(受保护)
Template:Navbox Addon
(
编辑
)
Template:Notelist
(
编辑
)
Template:Reverselink
(
编辑
)
Template:Samp
(
编辑
)
Template:Top icon
(
编辑
)
Template:Trans
(
编辑
)
Template:Translation
(
编辑
)
Template:Verlink
(
编辑
)
Template:Version link
(
编辑
)
Module:Arguments
(
编辑
)
Module:Array
(
编辑
)
Module:Category handler
(
编辑
)
Module:Category handler/blacklist
(
编辑
)
Module:Category handler/config
(
编辑
)
Module:Category handler/data
(
编辑
)
Module:Category handler/shared
(
编辑
)
Module:Hatnote
(
编辑
)
Module:Message box
(
查看源代码
)(受保护)
Module:Message box/configuration
(
编辑
)
Module:Namespace detect/config
(
编辑
)
Module:Namespace detect/data
(
编辑
)
Module:No globals
(
编辑
)
Module:ProcessArgs
(
编辑
)
Module:Reverselink
(
查看源代码
)(受保护)
Module:Reverselink/Link
(
查看源代码
)(受保护)
Module:Yesno
(
编辑
)
该页面属于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工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志
其他项目
变体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體