SlideShare ist ein Scribd-Unternehmen logo
1 von 16
Mobの作り方
Minecraft Modding会 in Kyoto
Ajenda
自己紹介
Mobとは
Mobの中身
実装例(人形MOD)
まとめ
Tips
自己紹介
名前:いわゆき(@iwa_yuki)
作ったもの
◦ アリスの人形MOD(AliceDollsMOD)
◦ 鉱石グモMOD(OreSpiderMOD)
◦ etc…
http://forum.minecraftuser.jp/viewtopic.php?f=13&t=832
Mobとは
動物
• ウシ
• ブタ
• ニワトリ
• etc…
モンスター
• ゾンビ
• スケルトン
• クリーパー
• etc...
ボス
• エンダードラゴン
• ウィザー
その他
• アイアンゴーレム
• スノーゴーレム
Minecraft内での生き物全般。
動物、モンスター、ボスなどが含まれる。
プレイヤーは含まない場合が多い。
Mobの中身
• 機能を記述するEntity
• 見た目を記述するModel
• 描画方法を記述するRender
• 動作を記述する(EntityAI)
「Mobを作る」ためには…
これらのクラス(またはこれらのクラスを
継承したクラス)を継承して
作りたいMobのクラスを実装すればよい
EntityAIを使わないMobもいる
実装例(人形MOD)
EntityAliceDoll.java
◦ EntityLivingを継承
◦ 右クリックでの動作モード変更
DataWatcherでサーバ・クライアント間を同期
NBTでセーブ・ロード
(参考:オオカミ)
◦ インベントリ
Iinventoryインターフェースを実装
(参考:チェスト付カート)
◦ チャンクローダー
ForgeChunkManager$LoadingCallbackインター
フェースを実装
(参考:ChickenBones氏のChickenChunks)
実装例(人形MOD)
ModelAliceDoll.java
◦ 人間型なのでModelBipedを継承
◦ 各人形のモデルデータは「Techne」で作成
したものを使用する(←超便利)
◦ 一つのモデルで複数の人形に対応するため、
インスタンスごとに異なる形状を保持できる
ようにしている
実装例(人形MOD)
RenderAliceDoll.java
◦ 人間型なのでRenderBipedを継承
◦ 手持ちアイテム、頭にかぶれるアイテムの描
画位置・大きさを微調整(←すごく面倒)
◦ 防具は人間型Mobなら標準で対応しているの
で、基本的にModelを差し替えるだけ
◦ 歩く、手を振るなどの挙動も標準で対応して
いるので、特に難しくはない
実装例(人形MOD)
EntityAI
◦ EntityAIBaseを継承
◦ 基本的な動作(ランダムに歩く、近くのプレ
イヤーを見る、etc…)は既存AIを流用
◦ 人形独自の動作(Mob探知、鉱石採掘、アイ
テム収集、etc…)は自作
◦ Mob作成において一番の鬼門となる
人形MOD作成にかかった工数の7割程度はAIのアル
ゴリズム検討と実装、動作検証。。。
逆に既存AIの流用や簡単なAIの追加で済むMobであ
れば、工数はほとんどかからない(ex.鉱石グモ)
まとめ
MobはMinecraftの生物全般を表す
MobはソースコードではEntity, Model,
Render,EntityAIを継承したクラスで記
述される
モデリングはTechneを使うと便利
独自機能が多いと実装は大変(特にAI)
だが、既存のMobに近ければ割と簡単
既存コード、先人の知恵を活用しよう
Tips:Entityの登録
Entityを登録するにはregisterGlobalEntityIDと
registerModEntityを使う
Entityの登録はModのinitで行う
EntityRegistry.registerGlobalEntityID(
登録するMobのEntityクラス,
登録するMobの名前,
登録するMobのID);
EntityRegistry.registerModEntity(
登録するMobのEntityクラス,
登録するMobの名前,
登録するMobのID,
Mod自身のインスタンス,
描画される最大距離,
同期間隔,
速度を同期するかどうか);
Tips:Renderの登録
EntityとRenderを対応付けするためには
registerEntityRenderingHandlerを呼び出す
対応付けはModのinitで行う
ただしクライアント側のみでよいのでProxy
を使用して処理を振り分ける
RenderingRegistry.registerEntityRenderingHandler(
登録するMobのEntityクラス,
登録するMobのRenderのインスタンス);
@SidedProxy(
clientSide="ClientProxy",
serverSide="CommonProxy")
public static CommonProxy proxy;
proxy. registerRenderers();
CommonProxy.
registerRenderers(
)
ClientProxy.
registerRenderers(
)Client
Server
Tips:AIの動作(1)
AIはsetMutexBitsで設定した値(mutexBits)に
よりAI同士が同時に動作可能か判定している
2つのAIのmutexBitsのANDを計算する
→結果が0の時は同時に動作可能
→結果が0以外の時は競合する
EntityAIArrowAttack
(mutexBit=3)
EntityAIWander
(mutexBit=1)
EntityAIWatchCloses
t
(mutexBit=2)
競合する 競合する
同時に動作可能
Tips:AIの動作(2)
AIを実行するかどうかはshouldExecute、
AIを実行し続けるかどうかは
continueExecutingで指定する
AIの実行開始時にstartExecuting、終了
時にresetTask、それ以外は1Tickごとに
updateTaskが呼ばれる
sholdExecute
continueExecuting
startExecuting updateTask
resetTask
true
fals
e
truefals
e
Tips:複数種類のMobを
一つのEntityで扱う
人形MODでは機能、AI、Modelの異なる人形
を一つのEntityで扱っている
Entityの各種パラメータ、AIの初期化、Model
の生成・初期化など人形の種類ごとに異なる
処理は人形管理クラス(DollRegistory)で一元
管理して、Entity・Renderから適宜呼び出す
ことで実現
RenderAliceDol
l
EntityAliceDoll
DollRegistory
DollShanghai DollHorai
DollRussia etc…
Tips:特定の条件にあうEntityを
抽出する
World.selectEntitiesWithinAABBを使うと、
特定条件にあうEntityを抽出できる
抽出する条件はIEntitySelectorインター
フェースを実装したクラスのインスタン
スを渡すことで実現
World.selectEntitiesWithinAABB(
抽出したいEntityのクラス,
抽出範囲を表すAxisAlignedBBインスタンス
IEntitySelectorを実装したクラスのインスタンス);
public class CustomSelector implements IEntitySelector{
public boolean isEntityApplicable(Entity entity){
// 抽出対象ならtrueを返す
}
}

Weitere ähnliche Inhalte

Andere mochten auch

Minecraft1日目を生き残る方法
Minecraft1日目を生き残る方法Minecraft1日目を生き残る方法
Minecraft1日目を生き残る方法
Akira Kozakai
 

Andere mochten auch (19)

マインクラフトでプログラミングを楽しむ
マインクラフトでプログラミングを楽しむマインクラフトでプログラミングを楽しむ
マインクラフトでプログラミングを楽しむ
 
論理回路シミュレータ Logisim の使い方
論理回路シミュレータ Logisim の使い方論理回路シミュレータ Logisim の使い方
論理回路シミュレータ Logisim の使い方
 
【minecraft】レッド​ストーン回路赤石論理学【配布資料】
【minecraft】レッド​ストーン回路赤石論理学【配布資料】【minecraft】レッド​ストーン回路赤石論理学【配布資料】
【minecraft】レッド​ストーン回路赤石論理学【配布資料】
 
Modding会 in Kyoto
Modding会 in KyotoModding会 in Kyoto
Modding会 in Kyoto
 
Minecraft1日目を生き残る方法
Minecraft1日目を生き残る方法Minecraft1日目を生き残る方法
Minecraft1日目を生き残る方法
 
7days war - Minecraft
7days war - Minecraft7days war - Minecraft
7days war - Minecraft
 
Clrh87 minecraftでのタートルのご紹介
Clrh87 minecraftでのタートルのご紹介Clrh87 minecraftでのタートルのご紹介
Clrh87 minecraftでのタートルのご紹介
 
Obsのプラグイン作ってみた
Obsのプラグイン作ってみたObsのプラグイン作ってみた
Obsのプラグイン作ってみた
 
マイクラキッズのトリセツ〜マイクラばかりしている子ども、どう扱ったらいいの?〜
マイクラキッズのトリセツ〜マイクラばかりしている子ども、どう扱ったらいいの?〜マイクラキッズのトリセツ〜マイクラばかりしている子ども、どう扱ったらいいの?〜
マイクラキッズのトリセツ〜マイクラばかりしている子ども、どう扱ったらいいの?〜
 
超低消費電力無線センサでミクさんと生活してみた
超低消費電力無線センサでミクさんと生活してみた超低消費電力無線センサでミクさんと生活してみた
超低消費電力無線センサでミクさんと生活してみた
 
バスい~く
バスい~くバスい~く
バスい~く
 
システマについて
システマについてシステマについて
システマについて
 
pyconjp2015_talk_Translation of Python Program__
pyconjp2015_talk_Translation of Python Program__pyconjp2015_talk_Translation of Python Program__
pyconjp2015_talk_Translation of Python Program__
 
ご注文はライブラリですか?
ご注文はライブラリですか?ご注文はライブラリですか?
ご注文はライブラリですか?
 
プログラミング学習とScratch raspi python
プログラミング学習とScratch raspi pythonプログラミング学習とScratch raspi python
プログラミング学習とScratch raspi python
 
見た目だけのデザインと意味を持つデザイン
見た目だけのデザインと意味を持つデザイン見た目だけのデザインと意味を持つデザイン
見た目だけのデザインと意味を持つデザイン
 
Csfpt ppcr mars 2017
Csfpt ppcr mars 2017Csfpt ppcr mars 2017
Csfpt ppcr mars 2017
 
You are valuable
You are valuableYou are valuable
You are valuable
 
C All 2008 7 22
C All 2008 7 22C All 2008 7 22
C All 2008 7 22
 

Mobの作り方