你的第一个生物
你的第一个生物
这篇教程带你从零做一只简单的攻击型怪物,名字叫 Bloblet(小绿团)。
教程会教你实体(entity)基础用法——凡是比方块更“能动”的东西,全都靠实体实现。
前提:你已经有一个基础模组 mymod,要编辑 mymod/init.lua。
版本要求:Luanti 5.5.0 及以上。
实体定义
实体用 core.register_entity 注册,最简写法:
1 | core.register_entity("mymod:bloblet", {}) |
拿到生成权限后,用指令召唤:/spawnentity mymod:bloblet
现在它只是个无贴图白方块,接下来我们一步步完善。
视觉外观
外观写在 initial_properties 里:
visual = "cube":用立方体显示visual_size:大小(这里设为 0.5 倍)textures:6 个面的贴图(上、下、X+、X-、Z+、Z-)
1 | initial_properties = { |
基础物理(重力+碰撞)
让怪物会掉下来、有碰撞:
physical = true:开启物理collisionbox:碰撞箱(中心向外扩展)on_activate:激活时加重力
1 | initial_properties = { |
可被攻击(血量+选择箱)
给怪物加血量,让玩家能打它:
1 | initial_properties = { |
基础行为逻辑
追逐玩家
on_step 每帧执行:
- 找最近的玩家
- 朝目标移动
- 保留 Y 轴速度(防止浮空)
1 | on_step = function(self, dtime) |
跳上方块
加 stepheight 让它能跨上1格高:
1 | stepheight = 1.01, |
面朝玩家
让红色正面永远对着你:
1 | self.object:set_rotation(vector.new(diff.x, 0, diff.z):dir_to_rotation()) |
攻击玩家
加攻击计时器,2 秒冷却,靠近 1 格内造成伤害:
1 | on_activate = function(self) |
自然生成
每 10 秒在玩家附近随机尝试生成:
- 随机位置
- 射线检测找地面
- 距离玩家大于 10 格才生成
1 | local function try_spawn() |
完整代码(直接复制可用)
1 | core.register_entity("mymod:bloblet", { |
下一步进阶方向
- 给怪物画真正的贴图
- 加入动画模型
- 增加随机漫步、逃跑、回血等行为
- 支持攻击其他实体
- 做友好/敌对不同阵营
- 加粒子特效、声音
- 优化生成逻辑(不在玩家眼前刷出)
- 直接用现成生物库模组,不用重复造轮子