雑用担当の備忘録

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

Texture フォーマットについて

まず LIB 解析 で Tex フォーマットを確認してください。
mip_count: u32,
の部分なんですが Unity 5.0.3 の頃は
mip_map: bool(u8),
でした。この部分のフォーマットが変わっています。
EL03_01
上の 00663 が古いバージョンで下の 00684 が新しいバージョンです。
mip_map: u8 ⇒ mip_count: u32 にサイズが変更されたため後の padding も変わります。
padding が 00 ⇒ 00 00 になります。

変更点はこれだけです。

前回の記事は数字のフォントが対象なので後半のフッター部分が null ばかりだったので今回はその辺重点

対象となるのは NormalText (sharedasset4_00011.-2)
EL02_01
ハイライト部分は characters の終わりの要素 0x70BC: 0x20(" ")
つまり半角スペースの座標情報
EL02_02
characterSet の部分 文字コードは UTF-8
EL02_03
font = SourceSansPro-Regular.ttf
faceStyle = string.Empty
fontSize = 16
usePixelMetrics = false
material = AmplitudeGuiImage_00005.mat
EL02_04
specialCharacters の部分
0x7210: 0x5F(95) speCialCharacter の個数

    [Serializable]
    public class SpecialCharacter
    {
        public int Charcode;
        public float Advance;
        public Vector2 Offset;
        public Texture2D Texture;
    }

なので
specialCharacters.Charcode = 0x1E14
specialCharacters.Advance = 16.0f
specialCharacters.Offset = new Vector2(0.0f, -13.0f)
specialCharacters.Texture = fidsFoodSD.tex
EL02_05
fidsFoodSD.tex
ろくにゲームをやっていないのでこの画像があってるのかおかしいのかは不明なんですがなんとなくそれっぽい
EL02_06
SpecialCharacter の次

highdefAlternate = sharedassets4_00012.-2 (NormalTextHD)
lineHeight = 20.0f
descender = 6.0f
ascender = 16.0f
outline = false
outlineColor.a = 1.0f
outlineColor.b = 1.0f
outlineColor.g = 1.0f
outlineColor.r = 1.0f
outlineGradient = 1
distanceField = false
distanceFieldSize = 0
incorporateToAtlas = true
onlyAlphaChannel = false
マーキングしてませんが
0x7CB8: kerningUsage = GDI
0x7CBC: kerningPairs = null
です
EL02_07
続きの部分
文字コード UTF-8 で見るとキリル文字およびハングルになっています
この部分が AdditionalCharacterSet になります。
EL02_08
0x7CC0: AdditionalCharacterSet の個数(キリル文字,ハングル)

    [Serializable]
    public class AdditionalCharacterSet
    {
        public string CharacterSet;
        public Font Font;
        public AgeFont.KerningMode KerningUsage;
        public int FontSize;
    }

キリル文字:
0x7CC4: additionalCharacterSets.CharacterSet のサイズ(UTF-8 のバイトサイズ)
0x7CC8-0x7D5D: additionalCharacterSets.CharacterSet
0x7D5E-0x7D5F: padding
additionalCharacterSets.font = LiberationSans-Regular.ttf (sharedassets3.assets)
additionalCharacterSets.KerningUsage = Disabled
additionalCharacterSets.FontSize = 16

ハングル:
0x7D74: additionalCharacterSets.CharacterSet のサイズ(UTF-8 のバイトサイズ)
0x7D78-0x7F2A: additionalCharacterSets.CharacterSet
0x7F2B: padding
additionalCharacterSets.font = DirectNH.ttf (sharedassets3.assets)
additionalCharacterSets.KerningUsage = Disabled
additionalCharacterSets.FontSize = 16

ここでちょうどファイルの最後なので辻褄はあってそうです。

ここまで解析してはじめてローカライズ版の sharedassets4 を確認
フォーマットも別に変更になったわけでは無さそうだし何で更新版来ないんでしょうね。
単に作者が忙しいだけなような気がしますね。ますます手出ししづらい…
まぁ、解析の仕方がメインなんで問題ないと信じたい。

まぁ、このやり方で他の Unity ゲームの解析に役立つとは思うので無駄にはならないと思っていますが

EL00

とりあえず走り書き程度で書くので意味不明だと思います。またウソ情報の可能性もあります。

テクスチャデータ
sharedassets4_00678.tex ~ sharedassets4_00693.tex
座標データ
-2 のファイル sharedassets4_00001.-2 ~ sharedassets4_00016.-2

本題
座標データファイルの解析

sharedassets4_00001.-2
EL01
[0x10]: 0x2 は sharedassets0 を表します。
[0x14]: 0x638(1592) sharedassets0 の 1592 は AgeFont.script
AgeFont.script の実態は Assembly-CSharp-firstpass.dll にありますこれをデコンパイルすると

public class AgeFont : ScriptableObject
{
    [Serializable]
    public class Character : IComparable<AgeFont.Character>
    {
        public int Charcode;
        public Vector2 Dimension;
        public float Advance;
        public Vector2 Offset;
        public Rect TextureCoordinates;
        public Rect RuntimeTextureCoordinates;
        public int[] KerningEncodedData;
    }

    [SerializeField]
    private AgeFont.Character[] characters;
    [SerializeField]
    private string characterSet;
    [SerializeField]
    private Font font;
    [SerializeField]
    private string faceStyle = string.Empty;
    [SerializeField]
    private int fontSize;
    [SerializeField]
    private bool usePixelMetrics;
    [SerializeField]
    private Material material;
    [SerializeField]
    private AgeFont.SpecialCharacter[] specialCharacters;
    [SerializeField]
    private AgeFont highdefAlternate;
    [SerializeField]
    private float lineHeight;
    [SerializeField]
    private float descender;
    [SerializeField]
    private float ascender;
    [SerializeField]
    private bool outline;
    [SerializeField]
    private Color outlineColor = Color.white;
    [SerializeField]
    private int outlineGradient = 1;
    [SerializeField]
    private bool distanceField;
    [SerializeField]
    private int distanceFieldSize;
    [SerializeField]
    private bool incorporateToAtlas;
    [SerializeField]
    private bool onlyAlphaChannel;
    [SerializeField]
    private AgeFont.KerningMode kerningUsage;
    [SerializeField]
    private AgeFont.KerningPair[] kerningPairs;
    [SerializeField]
    private AgeFont.AdditionalCharacterSet[] additionalCharacterSets;
}

こんな感じになります。
この AgeFont クラス(ひな形)のオブジェクト(実態)が上記の sharedassets4_00001.-2 (MonoBehaviour)になります。つまりプロパティの各値は Behaviour の方に格納されています。
では上記の画像より
[0x28]: 0x0 sharedassets4(同じファイル)
[0x2C]: 0x6 AtlasMaterial.mat

ここから AgeFont と関連します。
[0x34]: 0x9 characters の個数
Character
[0x38]: Charcode = 0x39("9")
Dimension = new Vector([0x3C]: 0x41300000(11.0f), [0x40]: 0x41600000(14.0f))
[0x44]: Advance = 0x41400000(12.0f)
Offset = new Vector([0x48]: 0x3F800000(1.0f), [0x4C]: 0xC1600000(-14.0f))
TextureCoordinates = new Rect([0x50]: 0.78125, [0x54]: 0.0, [0x58]: 0.171875, [0x5C]: 0.4375)
RuntimeTextureCoordinates = new Rect([0x60]: 0.0, [0x64]: 0.0, [0x68]: 0.0, [0x6C]: 0.0)
[0x70]: KerningEncodedData = null
個数分

[0x254]: String(characterSet) length
[0x258]: characterSet = "012345679"
[0x261-0x263]: padding
[0x264]: 0x0 sharedassets4(同じファイル)
[0x268]: font = 0x2DC(732) SourceSansPro-Black.ttf
[0x270]: faceStyle = 0x0 string.Empty
[0x274]: fontSize = 0x16(22)
[0x278]: usePixelMetrics = false
[0x27C]: 0x0 sharedassets4(同じファイル)
[0x280]: 0x17(23) material = AmplitudeGuiImage_00008.mat
[0x288]: 0x0 specialCharacters = null
[0x28C]: 0x0 sharedassets4(同じファイル)
[0x290]: 0x0 highdefAlternate = null
[0x298]: lineHeight = 31.0f
[0x29C]: descender = 9.0f
[0x2A0]: ascender = 22.0f
[0x2A4]: outline = false
[0x2A8]: outlineColor.a = 1.0f
[0x2AC]: outlineColor.b = 1.0f
[0x2B0]: outlineColor.g = 1.0f
[0x2B4]: outlineColor.r = 1.0f
[0x2B8]: outlineGradient = 1
[0x2BC]: distanceField = false
[0x2C0]: distanceFieldSize = 0
[0x2C4]: incorporateToAtlas = true
[0x2C8]: onlyAlphaChannel = false
[0x2CC]: kerningUsage = disabled
[0x2D0]: kerningPairs = null
[0x2D4]: additionalCharacterSets = null
ここまで

長いですがこれでも一番短いやつです…

↑このページのトップヘ