Files
netease-modsdk-wiki/docs/mconline/90-知识库获奖教程/0-材质光影/1-发光自定义实体.md
boybook 760c2dd9ad 2.6
2025-12-01 20:59:16 +08:00

389 lines
10 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 发光自定义实体
> 本篇教程获得第一期知识库必看教程奖。
>
> 获奖作者:魔灵工作室-创造者MC。
⚠️警告:本教程默认您会自定义实体。
⚠️警告:本教程最好使用电脑。
✅提示:本教程国际版和网易版通用。
✅提示:本教程最后有示例包可供参考。
让我们先看看本教程的最终效果:
<iframe frameborder="0" height="600" width="800" allowfullscreen="allowfullscreen" src="http://cc.163.com/v/core/externplayer/63e36ff129279d2f4acfc025/"/>
本教程Addon层次结构
```yaml
- TMSLightDemoRP
- animations
- entity
- models
- entity在models文件夹内
- render_controllers
- textures
- TMSLightDemoBP
- entities
```
请先按照上面的文件夹层次结构创建好你的Addon。
首先我们打开Blockbench本教程使用4.4.1版本)新建一个基岩版模型。
![img](./images/1_0.png)
我们随便造个模型。
![img](./images/1_1.png)
生成一下贴图。
![img](./images/1_2.png)
现在是这个样子。
![img](./images/1_3.png)
`ctrl+s`,把模型和贴图保存到指定的文件夹里。
![img](./images/1_4.png)
接下来是重头戏我们要让贴图动起来。这里我使用AE做动态贴图大家也可以用其他软件只要最后你得到一张张的逐帧图片就可以。
![img](./images/1_5.png)
注意本教程不教AE如何使用这不是这个教程的重点请自行学习或用你熟悉的工具软件代替。
用你的贴图新建一个合成注意帧速率和持续时间的设置一般1秒就够了。我们选择25帧每秒也就是说最后会得到25张图片。
![img](./images/1_6.png)
给纹理图片加个效果。简单起见,我这里使用“色相/饱和度”效果,做一个动态颜色变化。
![img](./images/1_7.png)
设置一下关键帧。
![img](./images/1_8.png)
现在播放预览一下,效果应该是这样的。
![img](./images/1_9.gif)
接下来进行输出添加到渲染队列一定要注意红框中的设置我们最后得到的是png序列图片。
![img](./images/1_10.png)
选择输出位置。
![img](./images/1_11.png)
最后点击渲染按钮,得到这些图片。
![img](./images/1_12.png)
这时你可能会产生一个疑问,这么多图片,难道我们每一张都要手动处理吗?太麻烦了吧。
别急,继续看。
打开Photoshop。
![img](./images/1_13.png)
打开我们在AE渲染得到的第一张纹理图片。
![img](./images/1_14.png)
接下来是一个批量处理图片的技巧我们利用Photoshop自带的“动作”功能即可批量处理图片非常方便
打开“动作”面板(找不到的可以在软件顶部菜单栏中的“窗口”中找到)点击红框内的按钮,新建一个动作(你也可以点击旁边的文件夹按钮,新建一个组,再在里面新建一个动作),然后会弹出一个对话框。
![img](./images/1_15.png)
点击弹出对话框右边的“记录”按钮后会看到这里的圆点按钮变红并呈现按下去的样子。此时您在ps内的操作都会被自动记录接下来不要有任何多余的操作哦
![img](./images/1_16.png)
然后开始处理图片,让指定区域发光。(这里处理成发光的方法有很多,我这里只写了其中一种方法)。
切换到“通道”面板点击红框内的加号按钮新建一个alpha通道。
![img](./images/1_17.png)
默认alpha通道是全黑的按一下ctrl+i键让alpha通道全白如下图所示。
![img](./images/1_18.png)
然后我想要的效果是只让模型的东西南北四个面发光顶面和底面不发光我们借助Blockbench看一下纹理的哪些部分是东西南北面。
![img](./images/1_19.png)
然后回到ps里选择RGB通道用矩形选框工具选中东西南北四个面得到选区。
![img](./images/1_20.png)
再点击alpha通道向选区内填充黑色黑色区域即为完全发光区域若填充不同程度的灰色还能有不同程度的发光效果
![img](./images/1_21.png)
回到RGB通道按下ctrl+shift+s进行另存为操作注意此时动作仍然在记录选择保存类型为tga。
![img](./images/1_22.png)
点击保存按钮后弹出如下图所示对话框这里一定要选32位/像素并勾选上压缩非常重要如果不选32位/像素图片会不带alpha通道。如果不勾选压缩图片会有足足1MB的大小
![img](./images/1_23.png)
确定后再观察下动作面板,已经记录了存储动作。然后我们就可以点击红框内的按钮,结束记录了。
![img](./images/1_24.png)
再看一下文件夹注意tga图片的大小如果是1MB那很可能你没有勾选压缩
![img](./images/1_25.png)
接下来是体现“动作”功能的时候了我们把其他未处理的图片都拖入ps中注意关掉ps中原来的图片
待所有图片打开完毕后,点击顶部菜单栏上的`文件`->`自动`->`批处理`
![img](./images/1_26.png)
设置好下图红框内的选项动作7是我刚刚录制的动作的名称
![img](./images/1_27.png)
点击确定按钮ps就会为每一张图片执行咱们之前录好的动作执行结束后去文件夹里看一下把原来png格式的图片删除结果如下。可以用ps打开几个看看对不对
![img](./images/1_28.png)
接下来又是重头戏先理一下思路到这里我们完成了addon的创建模型的制作以及模型纹理的初步处理。
现在我们可以看到这些纹理图片的命名明显不合适我们需要批量重命名这些文件。我这里提供了一个自己用Python写的小工具可实现文件的批量重命名。
下载链接:[python自动化](https://creatormc.lanzoul.com/ie1P70ceaawj)。
下载后解压,我们把这个文件复制到这里。
![img](./images/1_29.png)
使用他需要先把我们的纹理文件夹重命名成`tms`
![img](./images/1_30.png)
然后在资源管理器的地址栏上输入cmd并回车在这个位置打开命令提示符窗口。
![img](./images/1_31.png)
随后输入如下图所示的内容并回车
警告此处需要python2.7的运行环境(下同)
输入:
```bash
python 批量重命名.py template_dynamic_light_entity_
```
这里的文件名后面的参数,表明了重命名文件的前缀,就是说重命名的图片文件的名字的前面的部分,程序会挨个遍历`tms`文件夹内的图片并给前缀名字加上从0开始的编号形成新的名字。
![img](./images/1_32.png)
执行完后再次观察文件夹,我们发现名字都变成我们想要的形式了。
![img](./images/1_33.png)
然后我们再从上面下载的压缩包中复制这个文件到此处。这个程序就如文件名的意思一样,帮助我们直接生成动态贴图对应的自定义实体客户端文件。
![img](./images/1_34.png)
相同的方法,执行下图命令。这里最后一个参数的意思是纹理贴图所在的目标文件夹的路径,和前一个程序一样,在最后会加上编号。
输入:
```bash
python 生成客户端实体定义文件.py textures/moling/template_dynamic_light_entity_
```
![img](./images/1_35.png)
执行完后再看文件夹出现了一个新的json文件。
![img](./images/1_36.png)
把这个文件剪切到表层的entity文件夹里。用代码编辑器这里我用的是vscode萝卜青菜各有所爱打开注意下图黄色框内的内容替换成我们自己的模型和identifier。
![img](./images/1_37.png)
注意路径位置,我这里发生了改变,上图黄色框中的图片路径,不是真实的图片路径,我们去移动一下图片(注意下图红框内的路径)。
![img](./images/1_38.png)
这样两边就对应起来了然后我们改一下materials如下图所示。这是一种发光材料。
![img](./images/1_39.png)
现在就差一点了,加油,坚持就是胜利!
我们现在再打开Blockbench然后打开我们的模型给他加个1秒的空动画这里为什么这么做继续往下看会有解释这里先跟着做注意动画是循环的
![img](./images/1_40.png)
注意是1秒。
![img](./images/1_41.png)
然后回到代码编辑器,把我们的动画加上,让他默认一直播放。
![img](./images/1_42.png)
到这里可能有人已经注意到了,我们还缺一个渲染控制器。
接下来,把上面下载的压缩包内的这个文件拿过来。
![img](./images/1_43.png)
然后按照相同的方法执行,这次文件名后面不需要有参数。
![img](./images/1_44.png)
执行完后,渲染控制器也被生成了。
![img](./images/1_45.png)
我们把渲染控制器放进`render_controllers`文件夹内,然后我们打开观察一下,这个渲染控制器里面到底写了什么。
下图就是生成的渲染控制器,我们可以看到红框内的表达式`query.anim_time * 30`这是什么意思呢?
前面的`query.anim_time`是一个`molang`查询他会返回自当前动画开始以来的时间这就是为什么我们前面需要加个1秒的空动画的原因就是想要让这个查询生效。后面的*30就没什么了只是让他变化的速度快一些达到连续切换图片的效果形成“动态”纹理。
![img](./images/1_46.png)
理所当然的,加了渲染控制器,我们肯定也要改变一下客户端实体定义文件。给这个文件的渲染控制器改成我们生成的这个渲染控制器。如下图所示。
![img](./images/1_47.png)
然后简单写个行为,保证这个实体能正常生成即可。
![img](./images/1_48.png)
然后就可以进游戏测试啦!就会出现一开始的视频里的效果!
![img](http://worldtj.photo.store.qq.com/psc?/world/O0cFsaTfOlqjIAnYAvw8WhB*.xzBY2DMPr4siDGSOAxCrAp.DW00iRuC4n*bNWxfFsMD4MEhTzBWoe1kC6gJoHtZ87lv*KXsjTXHwVjRVEo!/b=&bo=XgFeAV4BXgERHyg!&ek=1&tl=1)
🆓本期教程示例:[动态发光自定义实体Demo](https://creatormc.lanzoul.com/iCmjl0ceahaj)。
🆓Python自动化工具[python自动化生成json](https://creatormc.lanzoul.com/ie1P70ceaawj)。