Rune Factory 5 MOD作成手順
ルーンファクトリー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ボタンで大丈夫です。
ポートレートの編集
ここでは例としてベアトリスのポートレートを変更します。
「AssetStudioGUI」でフォルダの読み込みが終わったら、「Asset List」タブを選択し、「Filter Type」を「Texture2D」に設定し、検索のところに「BU_Bea_」とか入力してください。
表示された「BU_Bea_100」を選択すると、右側にポートレート画像が表示されます。
各キャラを検索する時の文字列は以下のようになります。
アリス: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」をクリックしてください。
「BU_Bea_100」が格納されている.bandleファイルが選択された状態でエクスプローラーが出てきます。
この.bandleファイルを編集したいので、「UABEA」を使ってこのファイルを開きます。
https://github.com/nesrak1/UABEA
ダウンロードして「UABEAvalonia.exe」を実行してください。
「File」->「Open」で対象の.bandleファイルを開きます。
「Info」をクリックします。
中のリストが多くてごちゃごちゃな場合が多いので、その時は「View」->「Filter」から「Texture2D」だけ表示したり、3Dの場合は合わせて「Mesh」に表示を絞ったり、Name順でソートしたりしてみてください。
「BU_Bea_100」を選択して「Plugins」をクリック。
「Export texture」を選択してOK、保存場所を指定してPNG形式でエクスポートできます。
エクスポートしたPNGファイルをGimpやPhotoshop等を使って編集します。
編集したら、そのファイルを「UABEA」で.bandleファイルにインポートします。
「BU_Bea_100」を選択して「Plugins」をクリックし、今度は「Edit texture」を選択してOK。
各項目はそのままで、「Load」ボタンをクリックし、編集したPNG画像を選択したら、「Save」ボタンをクリックします。。
「Modified」のところに「*」がついて、更新されたことがわかります。
「File」->「Save」したらこの画面を閉じます。
メイン画面に戻るので、「File」->「Save as」で名前を付けて保存してください。(.bandleファイル名は変えずに、保存先をオリジナルとは別の場所に保存します)
ファイル名は空欄なので、オリジナルの.bandleファイルの名前をそのままコピーしてください。
保存した.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メッシュとテクスチャがセットで格納されているので、まずはテクスチャで検索している状態です。
各キャラの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」をクリックします。
対象のファイルが選択された状態でエクスプローラーが開きます。
このファイルは後でUABEAで開くので、このままの状態にしておくか、このファイルを作業フォルダにコピーしておいてください。
「AssetStudioGUI」をもう一画面起動し、選択された.bandleファイルを開いてください。
開いたら、エクスポートの設定をします。Options->Export Options を選択。
「ScaleFactor」を「100」に設定してください。(エクスポートされるメッシュのスケールが100倍の大きさになります)
タブは「Scene Hierarchy」のまま、「ch014」にチェックを入れ「Model」->「Export slected ...」からエクスポートします。
保存フォルダを指定してエクスポートが完了すると「GameObject」というフォルダが作成され、その中にfbxファイルがエクスポートされます。
これがベースとなるFBXファイル(以下ベースFBX)となります。
このfbxをblenderで編集してください。
編集したら、別の場所にfbx形式でエクスポートしてください。
blenderは3.1.2を使用しています。
インポート設定は以下の通りとしてください。
エクスポート設定は以下の通りとしてください。
これでベース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プロジェクトを作成してください。
ベースFBXとカスタムFBXを下の枠にドラッグ&ドロップし、インポートしてください。
以下の手順は行わなくても大丈夫でした。うまくいかない場合はやってみてください。
下の枠から左側の枠に、2つのFBXをドラッグ&ドロップしてください。
ベースFBXとカスタムFBXのbodyメッシュの名前が同じで見分けがつかないので、ベースFBXのbodyメッシュの名前を適当に変更してください。
ここでは「base_body」にしています。
下の枠で右クリックから「Editor」という名前でフォルダを作成してください。
「Editor」フォルダに移動し、右クリックして「C# Script」を作成してください。
名前は任意で、そのままでもなんでもいいです。
作成したら、中身のスクリプトに以下を張り付けてください。
これはベースメッシュのボーンウェイトをカスタムメッシュにコピーするスクリプトのようです。
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」というボーンです。これを削除します。
左上の「オブジェクトモード」のところを「編集モード」にしてください。
画面右上枠の階層を展開していき「Root」ボーンを選択、画面右側のボーン設定「関係」の「ペアレント」の「X」をクリックすると、「ch005」との親子関係が解除されます。
画面右側の「ch005」ボーンを選択し、「アーマチュア」->「削除」->「ボーン」を選択すると、余分なボーン「ch005」が削除されます。
この手順は不要かもしれませんが、「Armature」の名前を削除したボーンと同じ名前「ch005」にリネームしておいてください。
これで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」を選択します。
Base Meshの選択で二重丸のような部分をクリックしてください。
Base Meshには名前を変えたベースのbodyメッシュ(ここではbase_body)を選択してください。
「Components」の左側にある三角形をクリックし、「+」をクリックしてください。
「Element 0」の右にある二重丸のような部分をクリックしてください。
blenderで編集した方のbodyメッシュを選択してください。
「Generate」ボタンをクリックします。
下の枠に「body」というメッシュが追加されます。
「Window」->「Pachage Manager」を選択してください。
左上の「+」をクリックし「Add package from git URL...」をクリックしてください。
https://github.com/Unity-Technologies/AssetBundles-Browser.git
と入力し、「Add」をクリックします。
このように「Asset Bundle Browser」が表示されれば成功。
PCにGitがインストールされていて、環境変数が設定されていないとインストールに失敗すると思います。
「Window」->「AssetBundle Browser」が追加されているので、クリックします。
出てきた画面に、上記で生成されたbodyメッシュをドラッグ&ドロップします。
「Build」タブに移り、「Output Path」のところを「Assets\AssetBundles」と設定し、「Build」ボタンをクリックしてください。
この「Output Path」の先頭が「Assets\」で始まらないとビルドしても何も作られません。
「AssetBundles」というフォルダができているので、フォルダの中に入り「body」を右クリックして「Show in Explorer」によりエクスプローラーで表示してください。
(画像がベアトリスに変わっていますが気にしないでください)
「body」というファイルがビルドによりできあがったバンドルファイルです。
これは「UABEA」で開くことができるので、「UABEA」で開きます。
「Type」が「Mesh」となっている「body」を選択し、「Export Dump」でエクスポートします。
形式はJSONを指定してください。
以下の手順はやらなくても大丈夫でした。うまくいかない場合はやってみてください。
JSONエクスポートしたら、そのファイルをテキストエディタ等で編集していきます。
まず、ベースバンドルファイルをUABEAで開き、bodyメッシュをJSON形式でエクスポート(Export Dump)してください。
エクスポートしたダンプファイルをテキストエディタで開き、「m_BoneNameHashes」で検索してください。
カスタムバンドルファイルからエクスポートしたダンプファイルでも同様に検索してください。
「m_BoneNameHashes」とそのすぐ下にある「m_RootBoneNameHash」の2つの項目の値をベースのものからコピー&ペーストします。
ベースの方で2項目分の行全体を範囲選択します。
選択したらコピーして、編集側のJSONで以下のように2項目分の行を選択して張り付けるとうまくできるはずです。
うまくいったかどうか怪しい場合は、JSONの構造が正しいか確認してください。
Arrayは中括弧「{」「}」で囲われているか、最後の要素以外はカンマ「,」で終わっているか、等。
上記で検索したベースの.bandleファイルをUABEAで開きます。
リストが多くごちゃごちゃしているので「View」->「Filter」から「Mesh」と「Texture2D」のみ表示させます。
「Type」が「Mesh」となっている「body」を選択し、「Import Dump」をクリック、上記でJSON形式でエクスポートしたダンプファイルを読み込みます。
「Modified」のところに「*」が付くのでセーブしてこの画面を閉じます。
メイン画面に戻るので、「File」->「Save As」から保存してください。(ファイル名は変えず、保存先フォルダを設定してください。)
ファイル名が空欄なので、オリジナルファイルのファイル名をそのままコピー&ペーストしてください。
保存した.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