Jump to content

Rune Factory 5 MOD作成手順


mjktkrchan

3328 views

ルーンファクトリー5のMOD作成手順をまとめておきます。

 

ポートレート(キャラの立ち絵)の変更はGimpやPhotoshopが使えれば簡単にできます。

3Dモデルの変更は学習用として書きましたが、スレッド内での情報交換等により動作するようになりました。

 

まず、.bandleファイル群のあるフォルダ

Steam:Rune Factory 5\Rune Factory 5_Data\StreamingAssets\aa\StandaloneWindows64

Switch:Data\StreamingAssets\aa\Switch

(Switch版はNSPファイルからSwitchExplorerやNxFileViewer等でダンプしてください)

 

このフォルダの中に56,707個もの.bandleファイルがあります。

これらはそれぞれ、「アリスのポートレート」とか「ベアトリスの3Dモデル(水着)」といった具合にそれぞれの.bandleファイルに入っています。

 

ファイル名では見分けがつかないのと、ファイル数が多すぎるので一括で全ての.bandleファイルを読み込んで検索し、変更したい.bandleファイル名を見つけます。

 

まず、「AssetStudioGUI」をダウンロードして起動してください。

https://github.com/Perfare/AssetStudio

 

「File」->「load folder」で上記の.bandleファイル群のフォルダを指定します。

読み込みに時間がかかり、途中で一度エラーが出ますがOKボタンで大丈夫です。

image.png.ddb6463ab782026261b5c122891d4212.png

 

 

 

ポートレートの編集

 

ここでは例としてベアトリスのポートレートを変更します。

「AssetStudioGUI」でフォルダの読み込みが終わったら、「Asset List」タブを選択し、「Filter Type」を「Texture2D」に設定し、検索のところに「BU_Bea_」とか入力してください。

表示された「BU_Bea_100」を選択すると、右側にポートレート画像が表示されます。

image.png.d3e7ec869f575a2e05e23fea044b79fd.png

 

各キャラを検索する時の文字列は以下のようになります。

アリス:BU_Ali

ベアトリス:BU_Bea

エルシェ:BU_Els

フーカ:BU_Fuq

ヒナ:BU_Hna

ルドミラ:BU_Ldm

レディア:BU_Led

ルーシー:BU_Luy

マルゲリータ:BU_Mag

みささぎ:BU_Mis

プリシラ:BU_Prs

リヴィア:BU_Riv

スカーレット:BU_Sca

 

検索すると出てくる「sactx-」で始まるテクスチャは表情のテクスチャです。

顔やその付近を編集した場合はこれらのファイルも編集する必要があります。

 

「BU_Bea_100」を編集したい場合は、「BU_Bea_100」を右クリックして「Show original file」をクリックしてください。

image.png.ab79142cdc7d61460113137f27dd0915.png

 

「BU_Bea_100」が格納されている.bandleファイルが選択された状態でエクスプローラーが出てきます。

image.thumb.png.cc383702383712f624fb78324efd1885.png

 

この.bandleファイルを編集したいので、「UABEA」を使ってこのファイルを開きます。

https://github.com/nesrak1/UABEA

ダウンロードして「UABEAvalonia.exe」を実行してください。

 

「File」->「Open」で対象の.bandleファイルを開きます。

image.png.97d0b75363ff193bf795671a710baac5.png

 

「Info」をクリックします。

image.png.66447cf582804879e8be2b6950196cfd.png

 

中のリストが多くてごちゃごちゃな場合が多いので、その時は「View」->「Filter」から「Texture2D」だけ表示したり、3Dの場合は合わせて「Mesh」に表示を絞ったり、Name順でソートしたりしてみてください。

image.png.0b3b87eec0f8c19e51f68aff98781325.png

 

「BU_Bea_100」を選択して「Plugins」をクリック。

image.png.85aabd4141f2a6c98cfc3467d031b326.png

 

「Export texture」を選択してOK、保存場所を指定してPNG形式でエクスポートできます。

image.png.2f5dba5a378bc299ebeb333cdeaacb07.png

 

エクスポートしたPNGファイルをGimpやPhotoshop等を使って編集します。

編集したら、そのファイルを「UABEA」で.bandleファイルにインポートします。

 

「BU_Bea_100」を選択して「Plugins」をクリックし、今度は「Edit texture」を選択してOK。

各項目はそのままで、「Load」ボタンをクリックし、編集したPNG画像を選択したら、「Save」ボタンをクリックします。。

image.png.f31ddff93a93ce611d5f87804b27ceea.png

 

「Modified」のところに「*」がついて、更新されたことがわかります。

「File」->「Save」したらこの画面を閉じます。

image.png.ecacce8e7f285d98cf12e37dfbbcd405.png

 

メイン画面に戻るので、「File」->「Save as」で名前を付けて保存してください。(.bandleファイル名は変えずに、保存先をオリジナルとは別の場所に保存します)

ファイル名は空欄なので、オリジナルの.bandleファイルの名前をそのままコピーしてください。

image.png.d649e7d5a09f793c0b779862aae9d8b6.png

 

保存した.bandleファイルを、MOD格納先フォルダにコピーすれば完了です。

Steam:Rune Factory 5\Rune Factory 5_Data\StreamingAssets\aa\StandaloneWindows64

Switch:Data\StreamingAssets\aa\Switch

 

Steam版は上書きになるのでバックアップを取ってください。

Switch版はLayerdFSなのでフォルダを作ってそこに格納してください。

 

 

3Dモデルの編集

 

3Dモデルを編集するには、ベースとなるメッシュ(以下ベースッシュ)と編集したメッシュ(以下カスタムメッシュ)の2つが必要となります。

ベースとなるメッシュには基本、オリジナルのメッシュを使用してください。

MODのメッシュをベースにしてしまうと、必要な情報がなかったりして動作しない場合があります。

カスタムメッシュはMODからの流用でもオリジナルから編集したものでも構いません。

 

「AssetStudioGUI」でフォルダの読み込みするところまでは同じです。

今回は、エルシェの3Dモデルを編集してみます。

「AssetStudioGUI」でフォルダの読み込みが終わったら、「Asset List」タブを選択し、「Filter Type」を「Texture2D」に設定し、検索のところに「TX_ch014」と入力してください。

表示された「TX_ch014_01_c」を選択すると、右側にテクスチャが表示されます。

一つの.bandleファイルに3Dメッシュとテクスチャがセットで格納されているので、まずはテクスチャで検索している状態です。

image.png.759d0763f60bd4e2a7f6557407c67777.png

 

各キャラの3Dテクスチャを検索する時の文字列

アリス:TX_ch001

ベアトリス:TX_ch006

エルシェ:TX_ch014

フーカ:TX_ch005

ルーシィ:TX_ch003

ルドミラ:TX_ch007

みささぎ:TX_ch020

プレシア:TX_ch002

スカーレット:TX_ch004

シモーヌ:TX_ch019

 

このテクスチャが格納されている.bandleファイルに3Dメッシュが格納されているので、「TX_ch014_01_c」を右クリックして「Show original file」をクリックします。

image.png.9a808bf29df941310bc92a09d5140cbf.png

 

対象のファイルが選択された状態でエクスプローラーが開きます。

このファイルは後でUABEAで開くので、このままの状態にしておくか、このファイルを作業フォルダにコピーしておいてください。

image.thumb.png.e015c8bfe8c6a55c7644598f46c76260.png

 

「AssetStudioGUI」をもう一画面起動し、選択された.bandleファイルを開いてください。

開いたら、エクスポートの設定をします。Options->Export Options を選択。

image.png.416d4c3e832d75eee116d3922f250475.png

 

「ScaleFactor」を「100」に設定してください。(エクスポートされるメッシュのスケールが100倍の大きさになります)

image.png.5f50faef867b42c95f0d2afe2f43c8e2.png

 

タブは「Scene Hierarchy」のまま、「ch014」にチェックを入れ「Model」->「Export slected ...」からエクスポートします。

image.png.95a19b100ff21f1e65c371d0b396a2cb.png

 

保存フォルダを指定してエクスポートが完了すると「GameObject」というフォルダが作成され、その中にfbxファイルがエクスポートされます。

これがベースとなるFBXファイル(以下ベースFBX)となります。

image.thumb.png.7e4b97ddf341bd1663d103f95fe906bd.png

 

このfbxをblenderで編集してください。

編集したら、別の場所にfbx形式でエクスポートしてください。

 

blenderは3.1.2を使用しています。

インポート設定は以下の通りとしてください。

image.png.0730ffc808d32d56b05f89ccfab0d2d4.png

 

エクスポート設定は以下の通りとしてください。

image.thumb.png.497c42f045983ab88cedc4855494771b.png

 

これでベースFBXと、blenderで編集したFBX(以下カスタムFBX)の2つがあるはずなので、これを元にUnityで作業します。

Unityは別途インストールしてください。

 

Unity内でGitを使うので、別途Gitのインストールと環境変数の設定をしておいてください。

環境変数には以下を設定します。

 

変数名:Git

変数値:C:\Program Files\Git\cmd;C:\Program Files\Git\mingw64\bin;C:\Program Files\Git\usr\bin

 

設定したらPCの再起動が必要なようです。

 

ここを参考にしました。

https://www.hanachiru-blog.com/entry/2021/05/24/120000

 

 

Unityで空の3Dプロジェクトを作成してください。

image.png.44c8c899138cb10b1f9dc3173673c184.png

 

ベースFBXとカスタムFBXを下の枠にドラッグ&ドロップし、インポートしてください。

image.thumb.png.eb34c39219a0cd5597b2ef72212096af.png

 

 

以下の手順は行わなくても大丈夫でした。うまくいかない場合はやってみてください。

Spoiler

FBXを選択し、「Convert Units」のチェックを外してください。

これはベースFBXとカスタムFBXの両方で行ってください。

image.thumb.png.a060b3b6f4542fc5faab857b80b6d8ba.png

 

下の枠から左側の枠に、2つのFBXをドラッグ&ドロップしてください。

image.thumb.png.f16e26aabd20291e5fd0e847e738933b.png

 

ベースFBXとカスタムFBXのbodyメッシュの名前が同じで見分けがつかないので、ベースFBXのbodyメッシュの名前を適当に変更してください。

ここでは「base_body」にしています。

image.thumb.png.28012c45c33c72697d174953a2871b27.png

 

下の枠で右クリックから「Editor」という名前でフォルダを作成してください。

image.thumb.png.bb668c095af4f5ebc7af867cb629fc74.png

 

「Editor」フォルダに移動し、右クリックして「C# Script」を作成してください。

名前は任意で、そのままでもなんでもいいです。

image.png.f5c983ee4b4f8ac95df8660f75f85352.png

 

作成したら、中身のスクリプトに以下を張り付けてください。

これはベースメッシュのボーンウェイトをカスタムメッシュにコピーするスクリプトのようです。

using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;

public class SkinnedMeshComponentWizard : ScriptableWizard
{
    public SkinnedMeshRenderer baseMesh;
    public List<SkinnedMeshRenderer> components;
 
    [MenuItem("Tools/Mesh/Generate Skinned Mesh Component")]
    protected static void CreateWizard()
    {
        DisplayWizard<SkinnedMeshComponentWizard>("Skinned Mesh Component Generation", "Generate");
    }
 
    protected void OnWizardCreate()
    {
        foreach (SkinnedMeshRenderer component in components)
        {
            Dictionary<int, int> boneMapping = new Dictionary<int, int>();
            for (int i = 0; i < component.bones.Length; i++)
            {
                Transform compBone = component.bones[i];
                for (int j = 0; j < baseMesh.bones.Length; j++)
                {
                    Transform baseBone = baseMesh.bones[j];
                    if (compBone.name == baseBone.name)
                    {
                        boneMapping.Add(i, j);
                        break;
                    }
                }
            }
 
            //remap the bones
            BoneWeight[] weights = component.sharedMesh.boneWeights;
            for (int i = 0; i < weights.Length; i++)
            {
                BoneWeight weight = weights[i];
                weights[i].boneIndex0 = boneMapping[weight.boneIndex0];
                weights[i].boneIndex1 = boneMapping[weight.boneIndex1];
                weights[i].boneIndex2 = boneMapping[weight.boneIndex2];
                weights[i].boneIndex3 = boneMapping[weight.boneIndex3];
            }
 
            Vector3[] vertices = component.sharedMesh.vertices;
            Vector3 scale = component.transform.lossyScale;
            for (int i = 0; i < vertices.Length; i++)
            {
                Vector3 vertex = vertices[i];
                vertex.x *= scale.x;
                vertex.y *= scale.y;
                vertex.z *= scale.z;
                vertices[i] = vertex;
            }
 
            Mesh mesh = new Mesh
            {
                name = component.sharedMesh.name,
                vertices = vertices,
                uv = component.sharedMesh.uv,
                subMeshCount = component.sharedMesh.subMeshCount,
                //triangles = component.sharedMesh.triangles,
                bindposes = baseMesh.sharedMesh.bindposes,
                boneWeights = weights,
                normals = component.sharedMesh.normals,
                colors32 = component.sharedMesh.colors32,
                tangents = component.sharedMesh.tangents
            };

            for(int i = 0; i < component.sharedMesh.subMeshCount; i++)
            {
                int[] tris = component.sharedMesh.GetTriangles(i);
                mesh.SetTriangles(tris, i);
            }
            
            AssetDatabase.CreateAsset(mesh, Path.Combine("Assets", $"{mesh.name}.asset"));
        }
    }
 
    protected void OnWizardUpdate()
    {
        helpString = "Creates a new mesh based off the bone structure of a base mesh and ensures everything is in the correct order in the new mesh.";
        isValid = (baseMesh != null) && (components != null && components.Count > 0);
    }
}

 

このスクリプトはベースFBXとカスタムFBXのボーンの数が完全に一致していないとエラーになるようです。

一致させるには、blenderで読み込ませた時にblender側で勝手に作成される先頭のボーンを削除する必要があるようです。

ここで、余分に追加されたボーンは「ch005」というボーンです。これを削除します。

左上の「オブジェクトモード」のところを「編集モード」にしてください。

image.thumb.png.99190c394df5f9e9af0a4a502abbcf0d.png

 

画面右上枠の階層を展開していき「Root」ボーンを選択、画面右側のボーン設定「関係」の「ペアレント」の「X」をクリックすると、「ch005」との親子関係が解除されます。

image.thumb.png.f25a6cd97cb273c63bee06dbe920414f.png

 

画面右側の「ch005」ボーンを選択し、「アーマチュア」->「削除」->「ボーン」を選択すると、余分なボーン「ch005」が削除されます。

image.thumb.png.f311a973d2377d2707bd16f85f582a38.png

 

この手順は不要かもしれませんが、「Armature」の名前を削除したボーンと同じ名前「ch005」にリネームしておいてください。

image.thumb.png.3e840a0dc5cefd920b652d7000d5b450.png

 

これでFBX形式でエクスポートすればOKです。

 

エラーになった箇所のウェイト値を強制的に「0」にして通す場合、42行目から45行目までを以下のコードに変更してください。

エラーで止まるようにしているのは、エラーになったことに気づいてもらうためです。

ここでエラーになったためにゲーム画面でうまく動作しなかった場合、ここに原因があると気づけないと困るのであえて通らなくしています。

                try{ weights[i].boneIndex0 = boneMapping[weight.boneIndex0];}
                catch{ weights[i].boneIndex0 = 0;}
                try{ weights[i].boneIndex1 = boneMapping[weight.boneIndex1];}
                catch{ weights[i].boneIndex1 = 0;}
                try{ weights[i].boneIndex2 = boneMapping[weight.boneIndex2];}
                catch{ weights[i].boneIndex2 = 0;}
                try{ weights[i].boneIndex3 = boneMapping[weight.boneIndex3];}
                catch{ weights[i].boneIndex3 = 0;}

 

 

少し脱線しましたがUn ityの画面に戻り、上記C#スクリプトを上書き保存すると自動ビルドが行われ「Tools」というメニューが追加されるので「Tools」->「Mesh」->「Generate Skinned Mesh Component」を選択します。

image.png.573eef8ea6d72bcb7fef2ae12f028136.png

 

Base Meshの選択で二重丸のような部分をクリックしてください。

image.png.56b4d6ee470797d3d70e734196125d5b.png

 

Base Meshには名前を変えたベースのbodyメッシュ(ここではbase_body)を選択してください。

image.png.5f57e86896fdc08daad80180277dfc95.png

 

「Components」の左側にある三角形をクリックし、「+」をクリックしてください。

image.png.6782feee9b961d888f66840764651a04.png

 

「Element 0」の右にある二重丸のような部分をクリックしてください。

image.png.a306a52dfcc8ad0ac6ff44cf0593cd7d.png

 

blenderで編集した方のbodyメッシュを選択してください。

image.png.786b0ef557481bc97243944c7dcd6fb3.png

 

「Generate」ボタンをクリックします。

image.png.ad44e22685f315f4e943242996a3c54f.png

 

下の枠に「body」というメッシュが追加されます。

image.thumb.png.50efb8c28f5923f164a977b4314d2248.png

 

「Window」->「Pachage Manager」を選択してください。

image.png.0b8259f799752020d0cb220478b26c19.png

 

左上の「+」をクリックし「Add package from git URL...」をクリックしてください。

image.png.576b5d847c038f7f58d17e6ef43e8a13.png

 

 

https://github.com/Unity-Technologies/AssetBundles-Browser.git

 

と入力し、「Add」をクリックします。

image.png.5598441a5fdc1344ba731dcb465a0341.png

 

このように「Asset Bundle Browser」が表示されれば成功。

PCにGitがインストールされていて、環境変数が設定されていないとインストールに失敗すると思います。

image.png.d2d1466c75149f95b2e53f43a378d743.png

 

「Window」->「AssetBundle Browser」が追加されているので、クリックします。

image.png.5c3def429708bdbb215a7bec9d57df95.png

 

出てきた画面に、上記で生成されたbodyメッシュをドラッグ&ドロップします。

image.thumb.png.67ee9adc220115c173fbf2ca45be13f1.png

 

「Build」タブに移り、「Output Path」のところを「Assets\AssetBundles」と設定し、「Build」ボタンをクリックしてください。

この「Output Path」の先頭が「Assets\」で始まらないとビルドしても何も作られません。

image.png.61242c9c6bfa4093b49bff4846ddef33.png

 

「AssetBundles」というフォルダができているので、フォルダの中に入り「body」を右クリックして「Show in Explorer」によりエクスプローラーで表示してください。

(画像がベアトリスに変わっていますが気にしないでください)

image.thumb.png.25a12a44ff9b3a494b86ffd2812bb88f.png

 

「body」というファイルがビルドによりできあがったバンドルファイルです。

これは「UABEA」で開くことができるので、「UABEA」で開きます。

image.thumb.png.5796b2ac3fabceb199844d6fc1aa1fd4.png

 

「Type」が「Mesh」となっている「body」を選択し、「Export Dump」でエクスポートします。

形式はJSONを指定してください。

image.png.2304c346eae78e8088ecf0baddafae7b.png

 

以下の手順はやらなくても大丈夫でした。うまくいかない場合はやってみてください。

Spoiler

JSONエクスポートしたら、そのファイルをテキストエディタ等で編集していきます。

まず、ベースバンドルファイルをUABEAで開き、bodyメッシュをJSON形式でエクスポート(Export Dump)してください。

 

エクスポートしたダンプファイルをテキストエディタで開き、「m_BoneNameHashes」で検索してください。

image.thumb.png.2bf7798460f6d2450eae39b54fec8944.png

 

カスタムバンドルファイルからエクスポートしたダンプファイルでも同様に検索してください。

「m_BoneNameHashes」とそのすぐ下にある「m_RootBoneNameHash」の2つの項目の値をベースのものからコピー&ペーストします。

image.thumb.png.3a8fb023d734f0cdc7459e3c41115646.png

 

ベースの方で2項目分の行全体を範囲選択します。

image.thumb.png.b51ad36a1a50014e987fbd41fda6b98c.png

 

image.thumb.png.c4b49d3af9b3c7e9b73b261a49cec2ea.png

 

選択したらコピーして、編集側のJSONで以下のように2項目分の行を選択して張り付けるとうまくできるはずです。

image.thumb.png.a1d8714ff3ba33ef2a291edfb072434e.png

 

うまくいったかどうか怪しい場合は、JSONの構造が正しいか確認してください。

Arrayは中括弧「{」「}」で囲われているか、最後の要素以外はカンマ「,」で終わっているか、等。

 

上記で検索したベースの.bandleファイルをUABEAで開きます。

リストが多くごちゃごちゃしているので「View」->「Filter」から「Mesh」と「Texture2D」のみ表示させます。

image.png.09b35184290fcaa805d998b1738eb797.png

 

「Type」が「Mesh」となっている「body」を選択し、「Import Dump」をクリック、上記でJSON形式でエクスポートしたダンプファイルを読み込みます。

image.png.732960d984de82a7bc6de3034d6e3e0d.png

 

「Modified」のところに「*」が付くのでセーブしてこの画面を閉じます。

image.png.bd512b8b6f40726fee90d2f7fc4bf06b.png

 

メイン画面に戻るので、「File」->「Save As」から保存してください。(ファイル名は変えず、保存先フォルダを設定してください。)

ファイル名が空欄なので、オリジナルファイルのファイル名をそのままコピー&ペーストしてください。

image.png.de6ba86d9104580b2fd25a54d63fb658.png

 

保存した.bandleファイルをMODフォルダに配置すれば完了です。

メッシュを変更した場合は、テクスチャも合わせて変更する必要がある場合があります。

テクスチャのインポート・エクスポートの手順は最初の「ポートレートの編集」を参考にしてみてください。

 

Steam:Rune Factory 5\Rune Factory 5_Data\StreamingAssets\aa\StandaloneWindows64

Switch:Data\StreamingAssets\aa\Switch

 

Steam版は上書きになるのでバックアップを取ってください。

Switch版はLayerdFSなのでフォルダを作ってそこに格納してください。

 

 

 

 

 

Edited by mjktkrchan

1 Comment


Recommended Comments

Yukiusagi2023

Posted

メッシュの編集、ここのスクリプトだとよくわからないエラーが出てうまくいかず。

↓で配布されているツールを使ったところうまくいったので、コメント残しておきます。

 

×
×
  • Create New...