04-entity · git:20260818.b1ccba0 · 2026-08-18 · sha256 c9531b832f631016

04-entity git:20260818.b1ccba0A

Immutable. This exact content is served forever at /api/v1/blob/c9531b832f631016.

# 04 — 实体开发

> 适用版本:Fabric 1.14.4

---

## 约束

### 核心原则

- 实体必须在 `Registry.register(Registry.ENTITY_TYPE, id, type)` 中注册(1.14.x 没有 `Registries`)
- 属性在实体类里重写 `initAttributes()`。没有 `FabricDefaultAttributeRegistry`
- Yarn 枚举是 `EntityCategory`,不是后来的 `SpawnGroup` / Mojmap `MobCategory`
- 不要用 Forge `RegistryObject`
- 渲染器只在 `ClientModInitializer` 注册

---

## Decision Flow

```
IF 静态实体
  → EntityType.Builder.create(..., EntityCategory.MISC)

IF 有行为实体
  → EntityType.Builder.create(..., EntityCategory.CREATURE)
  → 重写 initAttributes()
```

## 基本实体注册

```java
public class MyPigEntity extends PigEntity {
    public MyPigEntity(EntityType<? extends MyPigEntity> type, World world) {
        super(type, world);
    }

    @Override
    protected void initAttributes() {
        super.initAttributes();
        this.getAttributeInstance(EntityAttributes.MAX_HEALTH).setBaseValue(20.0);
    }
}

public static final EntityType<MyPigEntity> MY_PIG = Registry.register(
    Registry.ENTITY_TYPE,
    new Identifier(MOD_ID, "my_pig"),
    EntityType.Builder.<MyPigEntity>create(MyPigEntity::new, EntityCategory.CREATURE)
        .size(0.9f, 1.4f)
        .build(null)
);
```

## 实体渲染器(客户端)

```java
public class ExampleModClient implements ClientModInitializer {
    @Override
    public void onInitializeClient() {
        EntityRendererRegistry.register(MY_PIG, (dispatcher, context) ->
            new LivingEntityRenderer<MyPigEntity>(dispatcher, new MyPigEntityModel(), 0.5f)
        );
    }
}
```

## fabric.mod.json 配置

```json
{
  "entrypoints": {
    "main": ["com.example.examplemod.ExampleMod"],
    "client": ["com.example.examplemod.ExampleModClient"]
  }
}
```

## 常见错误

- 忘记 `client` entrypoint — 实体无渲染
- 把 1.16+ 的 `FabricDefaultAttributeRegistry` / `SpawnGroup` / `Registries` 抄到 1.14.4
- 用 Forge `RegistryObject` 包住 `Registry.register` 的返回值