雑用担当の備忘録

技術的な話のみになります。翻訳データそのものはありません。 カテゴリ>その他>注意事項を必ず参照してください

某所に記述した 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;
}
UGCW01
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;
}
UGCW02
Groups.length = 10 で
Groups[0].keys.length = 7 個ある
Groups[0].keys[0] = "OfficerRank_Captain"

Groups[0].values.length = 7 個ある
Groups[0].values[0] = "Captain"

ということです。

↑このページのトップヘ