雑用担当の備忘録

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

2016年04月

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
ここまで

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

毎度ながら曖昧な情報が多いのですが、今回はかなりひどいですw
7D2D_00
今回はこれなんですけど、メインテーマは Unity + NGUI です。
このゲームは NGUI という Asset を使用しているのですが、その Asset でビットマップフォントを使用しているためローカライズデータを変更しただけではうまく表示されません。
試しに変更してみます、今回は New Game の部分です。
Data/Config/Localization.txt の btnNewGame の部分を New ゲーム にしてゲーム起動
7D2D_00a
こうなります。New だけ表示され ゲーム は表示されません。
よくあるゲームでは豆腐が表示されるのですが NGUI では何も表示されないのが特色です。
NGUI と同じような Asset として Text Mesh Pro という Asset もあるのですがこちらは XXX とバツ表示されます。

この状態から正常に表示するためにはビットマップフォントを入れ替える方法もありますが、今回はビットマップフォントを指定している部分をダイナミックフォントに変更するというやり方を行います。
NGUI の UILabel を New Game は使用しています。この UILabel のプロパティを設定している部分は Level1 の MonoBehaviour にあります。New Game は 00008.-15 になります。
このファイルを見ます
7D2D_01
0xC0 の部分が Text の部分で 0xB4 から(画像では0xBBまでになっていますが0xBFまでが正解です)の部分がビットマップフォント指定している部分です。
ここを
7D2D_01a
0xA8 ここからがダイナミックフォントの指定になります。
上記に変更してゲームを起動すると
7D2D_00b
ダイナミックフォントなのでゲームも表示されています。
フォントの値 93 19 は他の -15 ファイルを見ると良いでしょう。

謎技術が多いですが今回は以上です。

↑このページのトップヘ