某所に記述した MonoBehaviour に関する解説をまとめておきます
題材は UGCW です。
ターゲットは
resources_00001.-161
resources_00001.-225
-161 は LoadingScreen をシリアライズしたファイル
LoadingScreen は
public class LoadingScreen : MonoBehaviour
{
public Text tips;
public Image picture;
public Text version;
public float showMinTime;
public Sprite[] preloadingScreen;
public LoadingScreen.PreloadingSet[] prelodingSet;
}
public struct LoadingScreen.PreloadingSet
{
public string text;
}

Text, Image, Sprite はオブジェクトで objID(dword + ddword) で表されます
(0x20~0x23 + 0x24~0x2B)
00 00 00 00 85 FE 01 00 00 00 00 00 が tips の objID になります。
00 00 00 00 BE 03 02 00 00 00 00 00 が picture
00 00 00 00 00 00 00 00 00 00 00 00 が version(Null オブジェクト)
float は dword
0x44~0x47: 00 00 40 40
Little endian なので 0x40400000 になってこの実数値は 3.0
したがって showMinTime = 3.0
ここまでは固定のサイズになりますが
次の Sprite は配列なので可変になります。objID の倍数のサイズになる
0x48: 06 00 00 00
が配列長
従って preloadingScreen[6] になり Sprite の objID は 6 個存在する。
6(dword + ddword) なので 0x4C~0x93 までが preloadingScreen
PreloadingSet も配列なので
0x94 が配列長 0x10A の個数 preloadingSet がある
preloadingSet は string で
string は 文字列長+文字列+padding で構成される。
"AAAAA" の文字列は
05 00 00 00 41 41 41 41 41 00 00 00
と表される
05 00 00 00 の部分が文字列サイズで
41 41 41 41 41 が "AAAAA" の文字コード(utf-8)
00 00 00 は padding
padding が 00 00 00 の3バイトになるのは
41 41 41 41 41 が5バイトなので、4の倍数になるように調整する必要がある(アライメント)
今回は8バイトになるように 5+3 で 00 00 00 の padding が必要になる
"あああああ" の場合は
0F 00 00 00 E3 81 82 E3 81 82 E3 81 82 E3 81 82
E3 81 82 00
と表現され
'あ' の文字コードは E3 81 82 の部分
5(E3 81 82) = 5x3 = 15 = 0xF が文字列サイズ
文字列は 15 なので padding は 16 になるように 00 の1バイトとなる。
-225 のファイルは Language で
public class Language : MonoBehaviour
{
public Language.LocalizationGroup[] Groups;
}
public class Language.LocalizationGroup
{
public string[] Keys;
public string[] Values;
}

Groups.length = 10 で
Groups[0].keys.length = 7 個ある
Groups[0].keys[0] = "OfficerRank_Captain"
Groups[0].values.length = 7 個ある
Groups[0].values[0] = "Captain"
ということです。
題材は UGCW です。
ターゲットは
resources_00001.-161
resources_00001.-225
-161 は LoadingScreen をシリアライズしたファイル
LoadingScreen は
public class LoadingScreen : MonoBehaviour
{
public Text tips;
public Image picture;
public Text version;
public float showMinTime;
public Sprite[] preloadingScreen;
public LoadingScreen.PreloadingSet[] prelodingSet;
}
public struct LoadingScreen.PreloadingSet
{
public string text;
}

Text, Image, Sprite はオブジェクトで objID(dword + ddword) で表されます
(0x20~0x23 + 0x24~0x2B)
00 00 00 00 85 FE 01 00 00 00 00 00 が tips の objID になります。
00 00 00 00 BE 03 02 00 00 00 00 00 が picture
00 00 00 00 00 00 00 00 00 00 00 00 が version(Null オブジェクト)
float は dword
0x44~0x47: 00 00 40 40
Little endian なので 0x40400000 になってこの実数値は 3.0
したがって showMinTime = 3.0
ここまでは固定のサイズになりますが
次の Sprite は配列なので可変になります。objID の倍数のサイズになる
0x48: 06 00 00 00
が配列長
従って preloadingScreen[6] になり Sprite の objID は 6 個存在する。
6(dword + ddword) なので 0x4C~0x93 までが preloadingScreen
PreloadingSet も配列なので
0x94 が配列長 0x10A の個数 preloadingSet がある
preloadingSet は string で
string は 文字列長+文字列+padding で構成される。
"AAAAA" の文字列は
05 00 00 00 41 41 41 41 41 00 00 00
と表される
05 00 00 00 の部分が文字列サイズで
41 41 41 41 41 が "AAAAA" の文字コード(utf-8)
00 00 00 は padding
padding が 00 00 00 の3バイトになるのは
41 41 41 41 41 が5バイトなので、4の倍数になるように調整する必要がある(アライメント)
今回は8バイトになるように 5+3 で 00 00 00 の padding が必要になる
"あああああ" の場合は
0F 00 00 00 E3 81 82 E3 81 82 E3 81 82 E3 81 82
E3 81 82 00
と表現され
'あ' の文字コードは E3 81 82 の部分
5(E3 81 82) = 5x3 = 15 = 0xF が文字列サイズ
文字列は 15 なので padding は 16 になるように 00 の1バイトとなる。
-225 のファイルは Language で
public class Language : MonoBehaviour
{
public Language.LocalizationGroup[] Groups;
}
public class Language.LocalizationGroup
{
public string[] Keys;
public string[] Values;
}

Groups.length = 10 で
Groups[0].keys.length = 7 個ある
Groups[0].keys[0] = "OfficerRank_Captain"
Groups[0].values.length = 7 個ある
Groups[0].values[0] = "Captain"
ということです。
コメント
コメント一覧 (2)
最近は Localize 関連からは離れてまして…
久々に記事を書けて良かったですw
161については無事表示の確認ができたようです。また、225の方も説明を参考にツールを作成することができました。今後表示のテストをお願いしようと思っています。
ありがとうございました。