文字をグラデーションにするのは出来たけどテクスチャを張ることは出来ない。
ポップで自由なフォントを使うにはビットマップフォントを作って適用する必要がある。
結構面倒なのでちょっとズルをしてテクスチャを張ったみたいにしてみる。
まず空の Canvas に同じ大きさの Text と Image を作る。
Text の文字色と Image の色を基本色(黒、白がわかりやすい)にする。
Texture2D.ReadPixels でスクリーンショットを撮る。(Texture A)
1 2 3 4 5 6 7 |
GameObject _g = GameObject.Find("Canvas/Text"); int x = (int)(_g.transform.position.x+_g.GetComponent<RectTransform>().rect.x); int y = (int)(_g.transform.position.y+_g.GetComponent<RectTransform>().rect.y); int w = (int)_g.GetComponent<RectTransform>().rect.width; int h = (int)_g.GetComponent<RectTransform>().rect.height; Texture2D ta = new Texture2D(w,h, TextureFormat.RGB24, false);//文字+背景 ta.ReadPixels(new Rect(x, y, w, h), 0, 0);//スクショ |
同じ大きさのTexture2Dにテクスチャ画像を貼り付ける。(Texture B)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
... Texture2D tb = new Texture2D(w,h, TextureFormat.RGB24, false);//パターン Texture2D _t = PngToTex2D(Application.dataPath+"/dot1.png"); for(int j=0;j<tb.height;j++)for(int i=0;i<tb.width;i++) tb.SetPixel(i,j,_t.GetPixel(i%_t.width,j%_t.height)); ... Texture2D PngToTex2D(string path){ BinaryReader bin = new BinaryReader(new FileStream(path, FileMode.Open, FileAccess.Read)); byte[] rb = bin.ReadBytes((int)bin.BaseStream.Length); bin.Close(); int pos = 16, width = 0, height = 0; for (int i = 0; i < 4; i++) width = width * 256 + rb[pos++]; for (int i = 0; i < 4; i++) height = height * 256 + rb[pos++]; Texture2D texture = new Texture2D(width, height); texture.LoadImage(rb); return texture; } |
Texture Aを走査して背景色(Color.black)と異なる色の場所をTexture Bの色で置き換える。文字のフチの部分は薄めの色になっているため、文字色(Color.white)と同じ色を置き換えようとするとフチの部分が残ってしまう。
1 2 3 4 |
for(int j=0;j<ta.height;j++) for(int i=0;i<ta.width;i++) if(ta.GetPixel(i,j) != Color.black) ta.SetPixel(i,j,tb.GetPixel(i,j)); //MIX |
あとは出来上がったテクスチャを適当なものに貼り付けると出来上がり。
文字表示の前後でCanvasをオンオフすれば自由に文字が使えます(1フレーム未満表示されるけど)。
ちょっとまとめると、
- メリット
- ビットマップフォントを作らなくてよい。
- 気軽にフォント(ダイナミックフォント)を変えられる。
- 容量を圧迫しない
- 用意と設定がめんどくない
- ビットマップフォントを作らなくてよい。
- デメリット
- 一瞬画面にキャンバスが表示される(致命的)
- 出来上がるのはテクスチャ(利用しづらい)
- プログラムの設定がめんどい
フォントのレンダリングを画面外でやって、それをテクスチャに出来れば多少は使えそう。 今のところはここまで。