zh_cn:tutorial:entity
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
zh_cn:tutorial:entity [2023/01/12 14:55] – [创建并注册一个实体] fix code errors tao0lu | zh_cn:tutorial:entity [2023/01/15 01:23] (current) – [创建一个实体] solidblock | ||
---|---|---|---|
Line 3: | Line 3: | ||
// | // | ||
- | 实体(Entity)是游戏世界里的一种可以根据附加的逻辑移动的物体,包括: | + | 实体(Entity)是游戏世界里的一种可以根据附加的逻辑移动的物体,包括: |
* 矿车 | * 矿车 | ||
* 箭 | * 箭 | ||
* 船 | * 船 | ||
- | 生物实体(Living Entity)是拥有生命值,并且可以造成伤害的实体。 | + | 生物实体(Living Entity)是拥有生命值,并且可以造成伤害的实体。 |
为了实现不同的功能,生物实体有着不同的分支类型,其中有: | 为了实现不同的功能,生物实体有着不同的分支类型,其中有: | ||
* '' | * '' | ||
Line 22: | Line 22: | ||
'' | '' | ||
- | 在这篇教程中,我们将研究创建一个方块实体,并继承自 '' | + | 在这篇教程中,我们将研究创建一个立方体实体,并继承 '' |
===== 创建并注册一个实体 ===== | ===== 创建并注册一个实体 ===== | ||
Line 44: | Line 44: | ||
</ | </ | ||
- | 你可以在 '' | + | 你可以在 '' |
- | Fabric提供一个 '' | + | |
- | Fabric提供的Builder类内置用于配置实体的 追踪数值(tracking values) | + | |
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
Line 52: | Line 50: | ||
| | ||
/* | /* | ||
- | * 使用 | + | * 使用“entitytesting: |
* | * | ||
* 这个实体注册在了 SpawnGroup# | * 这个实体注册在了 SpawnGroup# | ||
- | * 它有一个 .75 * .75 (或12个像素宽,即一个方块的3/ | + | * 它有一个 |
*/ | */ | ||
public static final EntityType< | public static final EntityType< | ||
Line 70: | Line 68: | ||
</ | </ | ||
- | 实体需要 //属性(Attributes)// 和 //渲染器(Renderer)// 才能起作用。 | + | 实体需要// |
===== 注册实体的属性 ===== | ===== 注册实体的属性 ===== | ||
Line 105: | Line 103: | ||
===== 注册实体的渲染器 ===== | ===== 注册实体的渲染器 ===== | ||
- | 最后一个需要注册的是实体的**渲染器**。渲染器一般通过提供模型来决定实体的 | + | 最后一个需要注册的是实体的**渲染器**。渲染器一般通过提供模型来决定实体的 |
- | '' | + | '' |
- | * '' | + | * '' |
* '' | * '' | ||
* 实体阴影的大小,'' | * 实体阴影的大小,'' | ||
- | 下面的代码展示了一个简单的实体渲染器,它的阴影大小是0.5f, 贴图的路径为 '' | + | 下面的代码展示了一个简单的实体渲染器,阴影大小是 0.5f,纹理的路径为 '' |
- | 注意:用到的贴图和模型将在下一步创建。 | + | 注意:用到的纹理和模型将在下一步创建。 |
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
/* | /* | ||
- | * 一个用来提供模型、阴影大小和贴图的渲染器 | + | * 一个用来提供模型、阴影大小和纹理的渲染器 |
*/ | */ | ||
public class CubeEntityRenderer extends MobEntityRenderer< | public class CubeEntityRenderer extends MobEntityRenderer< | ||
Line 139: | Line 137: | ||
public void onInitializeClient() { | public void onInitializeClient() { | ||
/* | /* | ||
- | | + | * 方块实体渲染器的注册,提供模型、阴影大小和纹理的渲染器。 |
- | * | + | |
- | * 实体渲染器也可以在实体基于上下文进行渲染前(EndermanEntityRenderer# | + | |
- | */ | + | |
EntityRendererRegistry.INSTANCE.register(EntityTesting.CUBE, | EntityRendererRegistry.INSTANCE.register(EntityTesting.CUBE, | ||
return new CubeEntityRenderer(dispatcher); | return new CubeEntityRenderer(dispatcher); | ||
Line 150: | Line 148: | ||
</ | </ | ||
- | ===== 创建模型和贴图 | + | ===== 创建模型和纹理 |
- | 完成实体创建的最后一步是创建模型和贴图。 | + | 完成实体创建的最后一步是创建模型和纹理。模型定义了实体的// |
- | 模型定义了实体的 //结构// ,而贴图提供了实体的颜色。 | + | |
- | 标准的模型在类的顶部提供并在构造方法中初始化"部位(parts)", 或 '' | + | 标准的模型在类的顶部提供并在构造方法中初始化“部位(parts)”,即 |
- | 然后在 '' | + | |
- | 注意 '' | + | |
- | + | ||
- | '' | + | |
- | * 当前模型对象 | + | |
- | * textureOffsetU, | + | |
- | * textureOffsetV, | + | |
- | + | ||
- | 贴图偏移值指在你的贴图文件中,当前模型贴图的位置。 | + | |
- | 我们的实体的一个简单的方块,所以 '' | + | |
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
Line 172: | Line 159: | ||
private final ModelPart base; | private final ModelPart base; | ||
| | ||
- | public CubeEntityModel() { | + | public CubeEntityModel(ModelPart modelPart) { |
- | base = new ModelPart(this, 0, 0); | + | base = modelPart.getChild(EntityModelPartNames.CUBE); |
} | } | ||
| | ||
Line 179: | Line 166: | ||
} | } | ||
</ | </ | ||
- | + | 在创建一个部位之后,我们需要添加一个形状(shape)。为此,我们必须为根部添加一个子形状。新部分的纹理位置在 '' | |
- | 在创建一个部位之后,我们需要为他添加一个形状(shape)。 | + | |
- | 注意,模型的原点从拐角处开始,所以你需要一些偏移让它居中: | + | |
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
Line 189: | Line 174: | ||
| | ||
public CubeEntityModel() { | public CubeEntityModel() { | ||
- | | + | |
- | base.addCuboid(-6, -6, -6, 12, 12, 12); | + | } |
+ | |||
+ | // 你可以使用 BlockBench,制作你的模型并为你的实体模型导出以得到这个方法。 | ||
+ | public static TexturedModelData getTexturedModelData() { | ||
+ | ModelData modelData | ||
+ | ModelPartData modelPartData = modelData.getRoot(); | ||
+ | modelPartData.addChild(EntityModelPartNames.CUBE, ModelPartBuilder.create().uv(0, 0).cuboid(-6F, 12F, -6F, 12F, 12F, 12F), ModelTransform.pivot(0F, | ||
} | } | ||
- | | ||
- | [...] | ||
} | } | ||
</ | </ | ||
- | O我们的实体模型现在有了一个12x12x12的方块(大约一个方块的75%),并以0, 0, 0为中心。 | + | 我们的实体模型现在有了一个 12x12x12 的方块(大约一个方块的75%),并以0, 0, 0为中心。'' |
- | '' | + | |
- | '' | + | |
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
Line 215: | Line 202: | ||
@Override | @Override | ||
public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { | public void render(MatrixStack matrices, VertexConsumer vertices, int light, int overlay, float red, float green, float blue, float alpha) { | ||
- | | + | |
- | matrices.translate(0, 1.125, 0); | + | |
- | + | }); | |
- | // 渲染方块实体 | + | |
- | base.render(matrices, | + | |
} | } | ||
} | } | ||
</ | </ | ||
- | + | 要完成我们的模型,我们还需要一个纹理文件。默认的纹理大小是64宽、32高的;你可以通过在 '' | |
- | 我们还需要添加一个贴图文件来完成它。默认的贴图大小是64宽、32高的; | + | |
- | 你可以通过改变模型构造函数里的 | + | |
- | 我们使用64x64的贴图: | + | |
{{https:// | {{https:// | ||
Line 235: | Line 217: | ||
private final ModelPart base; | private final ModelPart base; | ||
| | ||
- | public | + | public |
- | this.textureHeight = 64; | + | |
- | this.textureWidth = 64; | + | |
- | | + | |
[...] | [...] | ||
+ | return TexturedModelData.of(modelData, | ||
} | } | ||
| | ||
Line 247: | Line 227: | ||
===== 生成你的实体 ===== | ===== 生成你的实体 ===== | ||
+ | 记得将客户端入口点添加到 fabric.mod.json 中,像这样: | ||
+ | <code json> | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ], | ||
+ | " | ||
+ | " | ||
+ | ] | ||
+ | }, | ||
+ | </ | ||
- | 你可以在游戏内使用 ''/ | + | 你可以在游戏内使用 ''/ |
{{https:// | {{https:// | ||
+ | **注意:**如果你的实体没有继承 '' |
zh_cn/tutorial/entity.1673535333.txt.gz · Last modified: 2023/01/12 14:55 by tao0lu