devlog [naru design]

プログラミングやテクニカルな内容の覚え書き。

Unity3Dでコンテンツを作っている時にやってしまったポカミスのメモ。
同じ事ではまらないよう、ポカミスが発生する度に追加していきます。

軽めのシーンなのにフレームレートが60fps出ない

3Dオブジェクトやポリゴン数が多くないのに、実機で60fpsで再生できなかった(Xcodeの表示では56fpsで安定)。

リアルタムにプレハブから生成(Instantiate)や削除(Destroy)がネックになっているかと思い、オブジェクトプールも実装してみたが、フレームレートは変化なし。何がパフォーマンス低下に繋がっているのか?

原因:
リアルタイムで大量に生成するオブジェクト(プレハブ)がUnityの(3D Object)Planeで作られていた。PlaneにはMeshColliderコンポーネントが付いたまま。これがまずかったようです。

PlaneのMeshColliderコンポーネントを全部削除したらパフォーマンスが改善。フレームレートが60fpsで安定するようになりました。不要なColliderは削除しましょう。

(2015/04/25 追加 / Unity4.6.4p3)

UVマップで貼り付けたテクスチャが表示されない

オブジェクト(fbxファイル)をインポートしたらテクスチャ画像が表示されなかった。マテリアルを確認したらテクスチャ画像は読み込まれてマップとして設定されているのに…。

原因:
1つのモデルに2つのUVマップが設定されていた。UVを1つに統合したら問題なくテクスチャが表示されました。UVマップは1オブジェクトに1つにしましょう。

(2014/1/16 追加)

Sceneウィンドウにオブジェクトが表示されない

Gameウィンドウにはオブジェクトが表示されているのに、Sceneウィンドウには表示されない。Hierarchyウィンドウでオブジェクトを選択している時だけワイヤーフレームで表示される。

単に、Layersの設定でオブジェクトのレイヤーがオフになってただけでした。

スクリーンショット 2013-12-25 12.01.12

Layersの設定内容は、別のプロジェクトを開いてもリセットされません。Sceneウィンドウでオブジェクトが表示されない時は、Layersの設定を確認しましょう。

(2013/12/25 追加)

テクスチャがボケボケ

画面解像度に合わせて作ったテクスチャなのに実機で表示するとボケた絵になる。メニュー用のアイコン画像だったのでシャープに表示したかった。テクスチャはNGUIを作ったAtlas画像で昨日までは問題なく表示されてたのに、今日作業を開始したら、この現象があらわれた。

対処方法:

スクリーンショット 2013-12-13 14.10.21

NGUIが作成したAtlas画像のインポート設定を上記のように設定したところ、実機でもシャープに表示されるようになった。しかし、なぜ急にボケたのかは謎です。

(2013/12/13 追加)

Awake()の中でGameObject.Find()失敗

NullReferenceExceptionエラー発生。複数のGameObjectに同じスクリプトを設定しているが、その中の幾つかでFind()が失敗していた。他のGameObjectやコンポーネントを探すのはStart()の中の方が良さそうだ。

(2013/10/21 追加)

OnMouseDownイベントが発生しない

スクリプトでメッシュを作成したオブジェクトのOnMouseDownイベントが発生しなかった。
オブジェクトにMeshColliderコンポーネントを追加することでイベントが発生するようになった。

関連記事:
Unity3D:オブジェクトにMeshColliderを追加する

(2013/07/19 追加)

レイでタッチ判定ができない

カメラの指定が間違っていた。後からシーンに追加したカメラには”MainCamera”のタグは付かず、Camera.mainでは参照できなかった。タグを付け直すことで正常に判定できるようになった。

(2013/07/19 追加)

スクリプトの実行される順番

NullReferenceExceptionエラー発生。設定したはずのオブジェクトが、そのタイミングではセットされていなかった。
それぞれのコンポーネントのStart()関数(Awake()、その他)は、自分で実行順を指定しない限り、どのコンポーネントのStart()から実行されるか分かりません。出来る限り実行順の影響を受けないスクリプトを考えた方が良さそう。どうしても…って時には、ProjectSettingsのScriptExecutionOrderを設定する。

コンポーネントの取得や設定はAwake()で、メソッドの実行などはStart()へ記述するのが良いか?(2013/10/21取り消し)

(2013/07/19 追加)

Pocket

コメントを残す

Trackback URL: