てぃってぃの楽しい副業日記!

ワイと嫁(てぃってぃ)夫婦の、副業、育児、プログラミング、筋トレ、ゲームを綴ったブログです☆

【Unity/ゲームプログラミング】初心者向け画面処理のメモ

Unityで絶賛ローグライクのゲームプログラミング中です。
1時間以上ハマった課題を個人的にメモっていきます。あわよくば参考にどうぞ。
(随時追加していきます)


よくあるハマり方

「SetActive(true)」で可視化されない

GUIや画像などを「SetActive」で表示/非表示を切り替えたいが、切り替えられないケース。
原因は、SetActive(false)によって、そのGameObjectがGameObject.Findでは見つからなくなるから。
対策は、GameObject.Findではなく、そのオブジェクトの親から「transform.Find()」で見つける。
例えば「MainCanvas」の子に「Control」がある場合の例。

    GameObject control = GameObject.Find("MainCanvas").transform.Find("Control").gameObject;
    control.SetActive(true);


SpriteEditorで分割したスプライトを透過で描画したい

例えばこういう透過画像を分割して描画したいとき。

Unity Sprite 透過

上記を含む元画像を「Resources.LoadAll()」で取得して、上記の部分を分割して、そのテクスチャを取得して、1pixelごとに描画先テクスチャに移していく感じになる。そのとき、「a」(透過)の値で判断すればOK。(もっといいやり方あるかも)
大事な部分だけかくとこうなる。

    // ファイル名は「Assets\Resources」の下に置くこと
    // 画像はunityのSpriteEditorで分割しておく
    Sprite[] src_sprites = Resources.LoadAll<Sprite>("maptip");
    Sprite src_sprite = System.Array.Find<Sprite>(src_sprites, (sprite) => sprite.name.Equals("maptip_stair"));
    var src_rect = src_sprite.textureRect;
    var src_pixels = src_texture.GetPixels();

    // 描画先テクスチャの領域ループ(1pixelごと)
    for (int idx = 0; idx < size; idx++)
    {
        :
        Color color = src_pixels[src_x + x + ((src_y + y) * src_texture.width)];

        // 透明部分は描画しないことで、透過処理ができる
        if (color.A != 0)
        {
            dst_texture.SetPixel(x, y, color);
        }
    }


「GetPixel/SetPixel」が死ぬほど遅い

現在進行形でハマり中ですw
自動マップ生成を組み込んだのだけど、ロードが遅すぎて使いものにならない感じで困り中です。
解決したら追記します。
(2020年3月1日追記)GetPixelで取得したカラーコードを使いまわすことで劇的に早くなりました。最初にマップチップの1チップごとのカラーコードをメモリに読み込んでおき、SetPixelのときはあらかじめ取得したメモリ上のカラーコードを使用するといいです。

「LineRenderer」で直線がキャンバス上に描画されない

おなじく、現在進行形でハマり中ですw
解決したら追記します。
2DオブジェクトとUIで描画する世界が異なるからです。キャンバス上に直線を実装するのは別の手段のほうがよさそうです。これもわかり次第さらに追記しますがいったん保留。

「TextMeshPro」で日本語が描画できない

現在進行形でハマり中。というかこれは無理そう。。バージョンごとに全然違うらしく、検索1位のやり方を何度試してもひらがなが2割ぐらいしか表示されない。
解決したら追記します。



随時更新していきます。