West Hill 開発メモ

カテゴリ: Asset



TextMesh Proは便利ですが、デフォルトフォントの参照を
「Assets/TextMesh Pro/Resources/」内の「TMP Settings.asset」というScriptableObjectの「Default Font Asset」というパラメタで持っているため、
ここに設定したフォントアセットはResourcesフォルダ外に置いていたとしても、ビルド時にはResources内に含まれてしまいます。
tmpfont01
最初から指定されている「LiberationSans SDF.asset」は1MBですが、
仮に日本語フォントアセットを2048x2048サイズで生成して「Default Font Asset」に指定した場合は、4MBのフォントアセットファイルがResources内に入ることになります。

これを、Resourcesのサイズは抑えた上で、サイズの大きいフォントアセットをデフォルトフォントっぽく使えるように変更します。

まずは「TMP Settings.asset」の「Default Font Asset」を「None」に設定して、
Resources内に含まれている「LiberationSans SDF.asset」は削除するか、
Resourcesフォルダ外へ移動させます。
tmpfont02

これでResourcesからフォントアセットは除けましたが、
Hierarchyメニューの「Create/UI/TextMesh Pro - Text」でTextMesh ProのGameObjectを生成した際に、デフォルトフォントが存在しないとエラーになります。
tmpfont03

このエラーを解消するために、以下のような設定でサイズの小さいフォントアセットを作ります。
tmpfont04
64x64サイズで4KB。(もっと縮めても良いかも)
↑で生成したフォントアセットを「TMP Settings.asset」の「Default Font Asset」に設定することで、Resourcesのサイズを抑えつつ、TextMesh ProのGameObject生成時のエラーが発生しないようにします。
tmpfont02

この状態でHierarchyメニューの「Create/UI/TextMesh Pro - Text」で生成すると、
サイズの小さいデフォルトフォントが適用されたボケボケのTextMesh ProのGameObjectができます。
tmpfont06
その後でInspector上からTextMeshProUGUIコンポーネントのFontAssetを、
Resources外のフォルダにあるサイズの大きいフォントアセットに差し替えれば良いのですが、毎回手で指定するのも面倒なので、カスタム生成メニューを作ります。

※フォントパスやTextMeshProUGUIの設定は適宜変更してください。

↑のスクリプトをプロジェクト内に配置して、
Hierarchy上でCanvas配下を選択した状態で、
メニューの「Create/UI/Custom TextMesh Pro - Text」で生成すると、
フォントアセットを差し替えた状態のTextMesh ProのGameObjectが生成されます。
tmpfont07

これで、Resourcesのサイズは抑えつつ
Resources外にあるフォントアセットをデフォルトで使用する形にできました。
このエントリーをはてなブックマークに追加 Clip to Evernote

unityroom様で、2017-11-13 〜 2017-11-19 に開催された
Unity 1週間ゲームジャム お題「space」に参加して、
スペースドギーというゲームを制作しました。

このゲームで使用したアセットは以下になります。



短期間で集中して作るのは楽しいですね。
面白い作品が多くて刺激にもなります。
Unity 1週間ゲームジャム / お題「space」ゲーム一覧

Unity 1週間ゲームジャムについて詳しくはこちら
このエントリーをはてなブックマークに追加 Clip to Evernote

GIFファイルをランタイムでデコードして
連続したテクスチャを出力するスクリプトアセットを作りました。

UniGif - https://github.com/WestHillApps/UniGif
a10
アニメーション、透過、インターレース等のGIF87a、GIF89aフォーマットに対応しています。

WWWやStreamingAssetsから取ってきたGIFファイルを、  
以下のようにテクスチャリストとして取得できます。
 
int loopCount, width, height;
List<UniGif.GifTexture> gifTexList = UniGif.GetTextureList (www.bytes, out loopCount, out width, out height);
UniGif.GifTextureは1コマ分のTexture2dと次のテクスチャまでのディレイ時間を持っています。

詳しくはサンプルシーン(Assets/UniGif/Example/UniGifExample.unity)と  
サンプルコンポーネント(Assets/UniGif/Example/Script/UniGifTexture.cs)を参照。  

Unity4.3.4でPC(Mac, Win)、Android、iOSで確認していますが
多分他のバージョンやプラットフォームでも動きます。

Texture2D.SetPixelsでテクスチャを作成しているため、サイズの大きい画像だと展開にはそれなりの時間がかかります。


参考 
Unity Forum - animated gif is not working
http://forum.unity3d.com/threads/animated-gif-is-not-working.27873/

とほほのWWW入門 GIFフォーマットの詳細
http://www.tohoho-web.com/wwwgif.htm

時雨エノキオプト GIFデコーダサンプルプログラム解説 ver1.11
http://www.geocities.jp/warotarock/asen2ndgif001.html

このエントリーをはてなブックマークに追加 Clip to Evernote

Unity Asset Storeにて、2D弾幕が簡単に作れるアセット「Uni Bullet Hell」をリリースしました。



コンポーネントを追加してインスペクタ上でパラメタをいじるだけで好きな弾幕が撃てます。
シューティングゲームやシューティング以外のゲームでも、
弾幕出したいなって時に使えると思いますので、よろしくお願いします。

弾幕パターン例 >> WebPlayerサンプル
チュートリアル&リファレンス >> Uni Bullet Hellサポート
ss_01
※当アセットに使用している画像やサウンドは、
Unity Japanチュートリアルのものを使用させてもらっています。 
>> 2D Shooting Game Tutorial (Unity Japan)

このエントリーをはてなブックマークに追加 Clip to Evernote

Unityでのパフォーマンス低下の原因の一つであるDrawCallを減らすためのAsset、
Draw Call Minimizerを使用した際の問題点とその対策方法のまとめです。

Draw Call Minimizer (free)

実装時のバージョンはUnity4.0.0、Draw Call Minimizerのバージョンは1.3.6.2です。

基本的な使い方についてはテラシュールウェアさんの記事が参考になります。

[Unity3D]Draw Call Minimizerの使い方と問題について
http://terasur.blog.fc2.com/blog-entry-215.html


以下が自分の環境で使用した際に起きた問題点とその対策方法です。

●まとめたオブジェクトが実行時に真っ黒になってしまう
 オブジェクトのマテリアルで使用しているテクスチャが大きすぎると、
 1枚に結合できずに黒くなってしまうので、
 テクスチャのインポート設定でMax Sizeを小さいサイズに変更する。 

●エラーメッセージUnsupported texture format needs to be ARGB32, RGBA32, BGRA32, RGB24, Alpha8 or DXTが出る
 メッセージの通り、テクスチャのインポート設定でAdvancedにして、
 FormatをARGB32、RGBA32、RGB24、Alpha8、DXTのいずれかに変更する。

●エラーメッセージCannot combine textures when using Unity's default material textureが出る
 これもメッセージの通り、デフォルトテクスチャは使用できないので、
 何でもいいのでテクスチャを張り付ける。

●一部のモデルでout of boundsエラーが出る
 エラーが発生しているスクリプトの該当箇所をコメントアウトする。
 対応箇所は「MeshCombineUtillity」の以下部分。

 mesh.colors = colors.ToArray();
 mesh.uv1 = uv1.ToArray();
 mesh.uv2 = uv2.ToArray();

●オブジェクトの当たり判定がなくなり、すり抜けてしまう
 実行時にColliderが外れてしまうので 、「OptimizedCombinedChildren」の
 150行目付近のメッシュを結合しているfor文の中にMeshColliderを付ける処理を追加する。

 go.AddComponent ("MeshCollider");
 go.GetComponent<MeshCollider>().sharedMesh = combinedMeshes[i];


ちなみに、Draw Call MinimizerはOptimizedCombineChildren配下の全オブジェクトを1つにしてくれるのではなく、共通のシェーダを使用しているオブジェクトが1つにまとめられます。
(2種類のシェーダを使っていたら2つのオブジェクトにまとめられます。)

マテリアルを結合しているので当たり前なのですが、複数のシェーダを使用している場合には注意が必要です。

このエントリーをはてなブックマークに追加 Clip to Evernote

このページのトップヘ