Javaは分からないけどマイクラMODを作りたい #1 Mod名変更と基礎について

以前、「VSCodeでマイクラMOD開発をしたい」というタイトルで環境を整えたのですが、その続編みたいな感じです。今回から「Javaは分からないけどマイクラMODを作りたい」というタイトルに変更して記載していきます。

はじめに

このシリーズは開発日記なので、あくまでもやってきた内容を日記がてらメモしていくようにします。また、この記事の通りにやればできるという保証はしません。トライ&エラーや気づいたことを書く予定です。

ちなみに、タイトルにもありますが私、Javaは書けません。なので、完全に手探りでやっていきます。ただ、C# はある程度書けるので「同じオブジェクト指向系ならイケるだろう」という感覚です。

環境構築に関してはこちらを見てください。

blog.takunology.jp

今回からバージョン 1.12.2 で進めていきますが、Forgeバージョンが違うくらいで Gradle バージョンや java バージョンは変わりません。同じ手順で進めれば問題なく動かせます。

1. ファイル構成を見てみる

とりあえず gradle build を行い、作業ディレクトリを VSCode から開いた様子です。ソースコードsrc/main/java/com/example/examplemod に入っていました。ファイル階層深すぎなのでは...?

f:id:takunology:20200310194812p:plain

確かにC#と似ていますね。final の意味は分かりませんが、MODID はMODのID、NAME は MODの名前、VERSION はMODのバージョンを表していそうです。

package って何ですかね?C#でいうプロジェクトに相当するのでしょうか...?

2. Mod名を変えてみる

とりあえず MODID やら NAME やらを変えてみたいと思います。あとクラス名も気に入らないので変更します。ここはC#と同じように変えれば問題ないと思います。

public static final String MODID = "takunologymod";
public static final String NAME = "TakunologyMod";
public static final String VERSION = "1.0.0";

クラス名を変えると @Mod で参照している部分も変更しないとだめですね。

@Mod(modid = TakunologyMod.MODID, name = TakunologyMod.NAME, version = TakunologyMod.VERSION)
public class TakunologyMod
{
 //以下略

そもそも @ マークにはどんな意味があるんでしょうかね。C#だと [ ] つけてアノテーションを宣言しますが、別物なのでしょうか。

あと、マイクラのMOD情報は src/main/resources/mcmod.info に書かれているようです。ここは読めばわかりそうなので適当に変えていきます。

[
[
{
  "modid": "takunologymod",
  "name": "TakunologyMod",
  "description": "It is my first modding!",
  "version": "${version}",
  "mcversion": "${mcversion}",
  "url": "",
  "updateUrl": "",
  "authorList": ["Takunology"],
  "credits": "The Forge and FML guys, for making this example",
  "logoFile": "",
  "screenshots": [],
  "dependencies": []
}
]

3. とりあえず動かしてみる

MOD名とかいろいろ変えたので実行してみます。実行するには gradle runClient コマンドを使用します。

f:id:takunology:20200310222937p:plain

何かいい感じに動いてますね。

4. いろいろ調べてみた

4.1 package

やはりC#でいうプロジェクトに相当するようです。プログラム実行に必要なクラスたちをまとめて収納しておくみたいで、各クラスの先頭には必須です。これを書かないとどのパッケージ(プロジェクト)に属しているか迷子になってしまうようです。

.NET系(C#)では名前空間 namespace でどのプロジェクトに属しているかを教えてあげます。また、先頭は大文字で区別するのが一般的ですが、Javaの場合は小文字から始めるようですね。

C#ではソリューションにプロジェクト単位で管理していますが、Javaドメインを逆にして管理し、世界中のパッケージとかぶるのを防いでいるようです。マイクラMODの場合は 国.作者.MOD名 で管理しているようですね。

4.2 import

C#でいう Using ディレクティブです。使用するライブラリ等を記述できます。もちろん自作したクラスも宣言できます。

4.3 @マーク

アノテーションで合っていました。@Mod は Modの表示名や起動に必要な他のModなどを指定するのに使用するようです。@Instance はそのクラスのインスタンスを生成でき、import するだけで他のクラスからインスタンスを使用することができるようになるようです(次回使います)。@EventHandlerイベントハンドラそのままですね。トリガーによってイベントが呼び出されます。

ちなみに、Javaでよく見かける @Override は「スーパークラスのメソッドをサブクラスのメソッドで上書きする」ことを意味するそうです。C#で言えば override 修飾子で「基底クラスのメソッドを派生クラスのメソッドで上書き」です。

MOD開発ではスーパークラスをどんどん継承して書いていきます。大元はマインクラフトのシステム内部を構成しているクラスなので、オーバーライドなしでは全てのクラスをコピーして書かないといけません。オーバーライドを使うことで、自分の変えたい箇所(メソッド)だけを上書きして変更できるので楽できますね。あと、@overrideを付けておけばスーパークラスに、同じメソッドが存在するかどうかも調べられます。

4.4 FMLのEventたち

FMLのEventたちというのはこういうものです。

  • FMLPreInitializationEvent
  • FMLInitializationEvent
  • FMLPostInitializationEvent

これらは初期化処理イベントを意味しています。

4.4.1 FMLPreInitializationEvent

設定ファイルの読み込みやブロックの登録など、ゲームを始める前に必要なデータを初期化しておくために必要なイベントです。あらかじめ用意されているアイテムやブロックを登録しておくことで、ゲームシステム全体で使用するすべてのオブジェクトを管理します。

4.4.2 FMLInitializationEvent

レシピやレンダー(スキンや背景などの画像データ)、Modで使用するデータの初期化を行うためのイベントです。

4.4.3 FMLPostInitializationEvent

上記2つである程度のゲームシステムで使用するデータはそろっていますが、そのほかに必要となるMod(連携するMod)やデータを初期化する必要がある場合に読み込むイベントです。

4.5 final 修飾子

final 修飾子はクラスやメソッドなどで意味が変わるようです。まず、クラスにつけると継承できなくなります。また、メソッドにつけるとオーバーライドできなくなります。さらに、変数につけると代入ができなくなります。

要するに「final で宣言したものは一切の変更を認めない」ということになりますね。変数に着けた場合は定数と同じ意味です。定数は変数名を大文字で書くようですので、final が付いている変数はすべて大文字になっています。

5. おわりに

とりあえずMod作成直後で気になる点はこれで解決できました。C#と似ている点があるので大分理解しやすかったです。