提供: Minecraft Modding Wiki
移動先: 案内検索

この記事は1.8のブロック追加を読んだ事を前提としています。

この記事は"Minecraft Forge Universal 11.14.4.1563~"を前提MODとしています。

Wood pickaxe.png
初心者向けのチュートリアルです。
C block.png
Blockに関係のあるチュートリアルです。

簡単なOBJモデル利用ブロックの追加方法

ブロックの追加

注意:一度入れたMODを外すと、再び入れてもテクスチャが反映されなくなります。デバッグ時にご注意を。

通常のブロック追加と同様の箇所の解説は省きます。1.8のブロック追加を参照のこと。

ソースコード

  • SampleOBJMod.java
package com.example.examplemod;

import net.minecraft.block.Block;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.client.model.obj.OBJLoader;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;

/**
 * Modエントリークラス
 */
@Mod(modid = SampleOBJMod.MOD_ID,
        name = SampleOBJMod.MOD_NAME,
        version = SampleOBJMod.MOD_VERSION,
        dependencies = SampleOBJMod.MOD_DEPENDENCIES,
        acceptedMinecraftVersions = SampleOBJMod.MOD_ACCEPTED_MC_VERSIONS,
        useMetadata = true)
public class SampleOBJMod {

    /** ModId文字列 */
    public static final String MOD_ID = "sampleobjmod";
    /** MOD名称 */
    public static final String MOD_NAME = "SampleOBJMod";
    /** MODのバージョン */
    public static final String MOD_VERSION = "0.0.1";
    /** 早紀に読み込まれるべき前提MODをバージョン込みで指定 */
    public static final String MOD_DEPENDENCIES = "required-after:Forge@[1.8-11.14.4.1563,)";
    /** 起動出来るMinecraft本体のバージョン。記法はMavenのVersion Range Specificationを検索すること。 */
    public static final String MOD_ACCEPTED_MC_VERSIONS = "[1.8,1.8.9]";
    /** ブロック登録名 */
    public static final String BLOCK_REGISTER_NAME = "sample_obj_block";
    /** このクラスのインスタンス。GUI実装するなどしなければ不要。他のMODのエントリークラスのインスタンスも取得可能 */
    @Mod.Instance(MOD_ID)
    public static SampleOBJMod INSTANCE;

    /** サンプルブロックのインスタンス */
    public static Block sampleOBJModelBlock;

    /** PreInitialization処理。ブロック・アイテムの登録、Messageクラスの登録、ItemMeshDefinition、CustomStateMapperの登録を行う */
    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        /* ブロックのインスタンス生成 */
    	sampleOBJModelBlock = new SampleOBJBlock();

        /*ブロックの登録。登録文字列はMOD内で被らなければ何でも良い。*/
        GameRegistry.registerBlock(sampleOBJModelBlock, BLOCK_REGISTER_NAME);

        if (event.getSide().isClient()) {
            /* OBJファイルの配置先ドメイン名登録。基本的にmodidの小文字を登録 */
            OBJLoader.instance.addDomain(MOD_ID);
            /*手持ち描画用のModelResourceLocation登録*/
            ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(sampleOBJModelBlock), 0, new ModelResourceLocation(MOD_ID + ":" + BLOCK_REGISTER_NAME, "inventory"));
        }
    }

}
  • SampleOBJBlock.java
package com.example.examplemod;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;

public class SampleOBJBlock extends Block {

    /**
     * コンストラクタ
     */
    public SampleOBJBlock() {
        super(Material.ground);
        /*ブロックの内部名設定*/
        this.setUnlocalizedName("blockSampleOBJ");
        /*クリエイティブタブ設定*/
        this.setCreativeTab(CreativeTabs.tabBlock);
        /*ブロックの大きさを設定*/
        this.setBlockBounds(0.25F, 0, 0.25F, 0.75F, 0.625F, 0.75F);
    }

    /**
     * 通常のブロックの形かどうか
     * @return true:通常のブロックと同じ。false:違う場合。
     */
    @Override
    public boolean isNormalCube() {
        return false;
    }

    /**
     * 1*1*1の大きさのブロックかどうか
     * @return true:1*1*1の立方体、false:違う場合。
     */
    @Override
    public boolean isFullCube() {
        return false;
    }

    /**
     * 不透過ブロックかどうか。
     * @return true:不透過。false:透過
     */
    @Override
    public boolean isOpaqueCube() {
        return false;
    }

}
  • sample_obj_block.json

assets/sampleobjmod/blockstates/sample_obj_block.json

{
    "forge_marker": 1,
    "defaults": {
        "model": "sampleobjmod:sample_obj_block.obj",
        "transform": "forge:default-block"
    },
    "variants": {
        "normal": [{}],
        "inventory": [{}]
    }
}
  • sample_obj_block.obj

assets/sampleobjmod/models/block/sample_obj_block.obj

# mtllib 使用するマテリアル定義ファイル(.mtl)
mtllib sample_obj_block.mtl

# 頂点の定義
v 0.250000 0.625000 0.750000
v 0.250000 0.000000 0.750000
v 0.750000 0.625000 0.750000
v 0.750000 0.000000 0.750000
v 0.750000 0.625000 0.250000
v 0.750000 0.000000 0.250000
v 0.250000 0.625000 0.250000
v 0.250000 0.000000 0.250000

# UV座標の定義(各値は 0.0~1.0 の範囲に収まっていること)
vt 0.25000 0.37500
vt 0.75000 0.37500
vt 0.75000 1.00000
vt 0.25000 1.00000
vt 0.25000 0.25000
vt 0.75000 0.25000
vt 0.75000 0.75000
vt 0.25000 0.75000

# 法線ベクトルの定義
vn 0.00000 0.00000 1.00000
vn 1.00000 0.00000 0.00000
vn 0.00000 0.00000 -1.00000
vn -1.00000 0.00000 0.00000
vn 0.00000 1.00000 0.00000
vn 0.00000 -1.00000 0.00000

# グループの定義。以下で定義される面の所属するグループ
g sample

# マテリアルの指定。以下で定義される面に適用するマテリアル
usemtl mat_sample

# 面(ポリゴン)の定義。四角形と三角形のみ有効。頂点番号/UV番号/法線番号
f 2/4/1 4/3/1 3/2/1 1/1/1
f 4/4/2 6/3/2 5/2/2 3/1/2
f 6/4/3 8/3/3 7/2/3 5/1/3
f 8/4/4 2/3/4 1/2/4 7/1/4
f 1/8/5 3/7/5 5/6/5 7/5/5
f 8/8/6 6/7/6 4/6/6 2/5/6
  • sample_obj_block.mtl

assets/sampleobjmod/models/block/sample_obj_block.mtl

# newmtl マテリアル名
newmtl mat_sample

# Kd 色(R G B)
Kd 1.00000 1.00000 1.00000

# d 不透明度(0.0 透明 ~ 1.0 不透明)
d 1.00000

# map_Kd テクスチャのResourceLocation
map_Kd sampleobjmod:blocks/sample_obj_block

解説

SampleOBJMod.java

/* OBJファイルの配置先ドメイン名登録。基本的にmodidの小文字を登録 */
            OBJLoader.instance.addDomain(MOD_ID);

OBJLoaderにドメイン名を登録する処理。 登録しないと、OBJファイルの走査対象フォルダとならない。

/*手持ち描画用のModelResourceLocation登録*/
            ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(sampleOBJModelBlock), 0, new ModelResourceLocation(MOD_ID + ":" + BLOCK_REGISTER_NAME, "inventory"));

手持ち描画用の登録処理。 手持ちはアイコンでやりたい場合も、そのアイコンのJSON名を登録する必要あり。

sample_obj_block.json

"forge_marker": 1,

forgeの形式のJSONであることを指定している。

"defaults": {
        "model": "sampleobjmod:sample_obj_block.obj",
        "transform": "forge:default-block"
    },

model:OBJモデルの場合OBJファイルを(.objまで含めて)指定。この場合は"assets/sampleobjmod/models/block/sample_obj_block.obj"を指定している。

sample_obj_block.obj

mtllib sample_obj_block.mtl

マテリアル定義ファイルの指定。ここで指定されたMTLファイルはOBJファイルと同時にロードされる。

sample_obj_block.mtl

map_Kd sampleobjmod:blocks/sample_obj_block

マテリアルで使用するテクスチャファイルの指定。この場合は"assets/sampleobjmod/textures/blocks/sample_obj_block.png"を指定している。