テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

Windows 10で動かすUnityエディタで、ゲーム内のUIに四角い穴が表示される問題について

Unityで色々と操作をしていた際、なんだかUIやGizmoに穴が空いたような感じになってしまいました。
ゲームをプレイする等により復帰しますが、まぁ、なんというか気持ちが悪いです。

f:id:tsubaki_t1:20160505124411g:plain

Windows 10の問題かもしれない

相談したところ、Streamにて同様の報告が上がっていたとの事を教えてもらってので、確認した所ビンゴでした。

f:id:tsubaki_t1:20160505124821j:plain

Steam Community :: Guide :: Windows Troubleshooting Guide - Cities Skylines

対策としては、こんな感じです。

  • Switch to any 'overlay' view or 'underground' view in-game
  • Change v-sync setting in graphic options screen
    (Vsyncを切り替える)
  • Change from windowed to full screen or vice versa
    (ウィンドウモードとフルスクリーンモードを切り替える。
     実はスクリーンサイズを変えても治る)

Windows 10にするまではこんな感じの表現は発生してなかったですし、対策や条件を考えると、ドライバのバグっぽい気がします

色々と確認した限り、ゲーム側としては対策は無さそうな感じですので、ドライバが治してくれる事を期待する感じになりそうです。

 

その他何らかの情報があれば教えてもらえると嬉しいです。

関連

Steam Community :: Guide :: Windows Troubleshooting Guide - Cities Skylines

【Unity】同じモデルなのに片方だけベイクした影が汚い場合の対処法

f:id:tsubaki_t1:20160420233736p:plain

【問題】上の画像には赤い2本の棒がある。これらは同じメッシュを使用している。
これらの棒に影をベイクした際、左の赤い棒にかかる影はハッキリしている右の棒にかかる影はボケている。このこの違いが発生する理由を記入欄にry。

 

【答】左の棒はスケールを変更していない物を使用し、右の棒は引き延ばしたブロックを使用しているため。

f:id:tsubaki_t1:20160421003350p:plain

オブジェクトを引き延ばした時、Lightmapも伸びる

これを引き起こしている要因は、オブジェクトのスケールを引き延ばした時でも、ライトマップのUVは変わらないという事です。

どういう事かといえば、ScenのBakedで比較すればわかります。左(青)が左の赤い棒、右(赤)が奥の赤い棒のライトマップ解像度です。
左のライトマップは正方形ですが、右のほうは引き延ばされているのが分かります。

f:id:tsubaki_t1:20160420235740p:plain

右のライトマップはどのようにUV展開されるのかといえば、こんな感じで展開されます。これを見てわかる通り、UV的には6面正方形を展開しようとしています。

つまり、6面正方形として展開する予定のUVを引き延ばして展開しているため、影が引き延ばされた、汚い感じで表現されているわけです。

f:id:tsubaki_t1:20160421000017p:plain

「拡大縮小」では問題は発生しない

ちなみに、この現象は「特定軸の引き延ばし」を行ったモデルを「Baked GIでベイクした」場合に発生します。
なので、リアルタイムな影を使用した場合は発生しませんし、単純にモデルを拡大・縮小した場合、拡大したモデルの影が荒くなる…といった事も無いみたいです。

f:id:tsubaki_t1:20160421000935p:plain

引き延ばしたLightmapを何とか良い感じにする

引き延びてしまったライトマップですが、一応は何とかする方法があります。それは、スケールを変更したLightmapを一旦メッシュとして出力し、Generate Lightmap UVsを設定する事です。

f:id:tsubaki_t1:20160421002437p:plain

オブジェクトをメッシュとして出力する場合は、OBJ Exporterがとりあえず便利です。

これがうまく行けば、ライトマップ用のUVが新しく生成され、特定のメッシュだけライトマップが伸びるような事無く焼けます。
まぁ、メッシュを2倍持つ事になりますが、そのあたりは色々な所と相談で。

f:id:tsubaki_t1:20160421003014p:plain

f:id:tsubaki_t1:20160421003023p:plain

という事で、スピードレベルデザイン的な物をプリミティブな(Unityに標準で付いている)オブジェクトでやろうとするとオブジェクトの拡縮が多発する訳ですが、場合によってはライトマップが悪くなるので注意というお話でした。

めでたしめでたし。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

【Unity】5.3からのマルチシーン編集を前提として使用する上で注意すべき7つの項目

今日はMulti Scene Editingを利用して設計する上で注意すべき項目についてまとめてみます。他にも「こんな事ある」的な事があれば、教えてもらえれば超嬉しいです。

読み込んだシーンへの参照は1フレーム後に行う

シーンはResourcesやAssetBundleからPrefabを取得する場合と異なり、即座にロードが完了する訳ではありません。これは、非同期(Async)ではないSceneManager.LoadSceneを使用した場合も同様です。具体的には、シーンのロードはフレームの最後辺りに実行されるみたいです。

なので、Multi Scene Editingでシーンについて編集する場合、LoadSceneを実行したシーンからロードしたシーンへ参照を行う場合、1フレーム後に行う必要があります。
これはSceneManager.sceneLoaded(5.4で追加されたシーン呼出時のコールバック)を使用した場合も同様です。

なお、もう少しイケメン的に行いたい場合は、Sceneクラスを「LoadScene後に」取得し、IsLoadedを監視すると良さそうです。

「シーンの相互参照」は出来ない

クロスシーンリファレンス(シーンの相互参照)は出来ないみたいです。Unity 5.4 b13ではGUIレベルで出来ないようになっていました。

このため、他のシーンと連携する場合、スクリプトを用いて実行時に参照を解決する必要が出てきます。

f:id:tsubaki_t1:20160417235019p:plain

出てくるのですが、上の「シーンが読込完了するのは1フレーム後」の制約のお陰で、この相互関係も非常にややこしい話になっています。

今のところオススメとしてはサブシーンのオブジェクト群が親シーンに対してシングルトンなりFind経由で参照を行うタイプみたいです。

Scene.UnloadにはUnloadUnusedAssetsは含まれない

必要ならば自分で呼ぶ必要があります。

オブジェクトはActiveなシーンに生成される

オブジェクトはActiveなシーンへ生成されます。これは一つの点において少し厄介です。
例えばControllerオブジェクトがGameObjectを生成した場合、アクティブなシーンによって結果は異なります。

f:id:tsubaki_t1:20160418001509j:plain

これが起こす問題の一つは「Multi Scene Editingを念頭にSceneをUnloadしてもUnloadしたシーンが生成したオブジェクトが破棄されない」点です。

例えば、ボタンを押したらシーンをアンロードするコードを作成した場合、アクティブなシーンによってはGameObject(Clone)は破棄されますし、逆に破棄されず残ります。

 

 これの解決する方法は二種類あります。
一つはオブジェクトを指定したシーンへ移動する方法です。SceneManager.MoveGameObjectToSceneを使用すれば、指定のオブジェクトを特定のシーンへ移行させる事が出来ます。

もう一つの方法は、生成したオブジェクトへの参照を親が保持し続ける方法です。そしてUnloadでオブジェクトを破棄する際に生成したオブジェクトも破棄します。
生成したオブジェクトは大抵生成しっぱなしではなく何らかのコントロールを行う事が多いので、概ねこちらの方が良さそうな気がします。

もう一つ、Activeなシーンをどんどん入れ替える事も考えられますが、これは余りお勧めしません。

Activeなシーンの切替は最小限に留める

「Activeなシーン」は、単に太字のシーンというだけでなく特別な意味があります。それは上記で説明したような「オブジェクトを生成するシーン」というだけでなく、LighmtapやNavmesh等、シーンに紐づく設定が選択される要因でもあります。

またLightmapは「Activeなシーンを切り替えた際、切り替える以前に呼んでいたライトマップが破綻する」現象がモバイル限定で発生するらしいので、その辺りも含めてActiveの切替はあまり行わない方が良さそうに見えます。

SceneManagerはStart以降に使用する

これはバグなのか仕様なのか判断出来ていませんが、SceneManagerのAPI…例えばSceneManager.GetSceneByName等で呼び出したSceneオブジェクトは、Awakeのタイミングでは正常に動かないっぽいです。

例えばSceneManager.GetSceneByNameをAwakeで呼び出した時、エディタでMulti Scene Editingを行っている時でもロードされてない状態として扱われます。

そのため、例えば起動時にロードしていないシーンをロードする…的なコードをAwakeで実行すると、シーンが二重にロードされたりします。

Sceneは毎回取得する

Sceneですが、Load前とLoad中〜Load後で別物になっている事があります。
なので、下のようにロード前とロード後に取得した場合で挙動が異なります。

f:id:tsubaki_t1:20160418005612p:plain

ちなみにSceneはクラスではないです(k_yanase さん指摘ありがとうございます!)
ただシーンをUnityエンジン側に問い合わせる際に使用するハンドルはロード後は同一のものを使うっぽいので、アクセス時に取得するといった事はしなくても良さそうです。
(シーンをロード(1)→アンロード→ロード(2)した場合、(1)で取得したSceneと(2)で取得したSceneは別物な点に注意。

注意書き

この項目は追記予定です。
また、情報が古くなる可能性があります。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

【Unity】Android SDKやJDKを設定する項目が見つからない時の対処法

Android SDKJDK設定項目が見つからない

Unity 5.3より、Android SDKJDK(およびNDK)といったAndroidのビルドに必要な項目が表示されないケースがあります。
例えばこんな感じです。

f:id:tsubaki_t1:20160206231034j:plain

原因はAndroid Supportが含まれていない事

この現象が発生する理由は単純に、インストール時にAndroid Supportのチェックが外れていたのが原因です。単純な話、Android Supportが無いエディタにはAndroid SDKを設定する項目の必要が無いので、このようにSDKの項目が表示されていなかったと言う事みたいです。*1

インストーラーの初期の設定ではAndroidのサポートが外れているので、気づかずインストールしなかった人は意外と多いかもしれません。

f:id:tsubaki_t1:20160206232142j:plain

Android Supportをインストールの有無を確認するには、Build Settingsで確認するのが手っ取り早いです。インストールされていない端末ではSwitch Platformする事が出来ず、下のように表示されます。

f:id:tsubaki_t1:20160206231336j:plain

Download AssistantでAndroid Supportを追加する

Android Supportを追加するには、インストーラーを再度起動し「Android Support」にチェックを入れた状態でインストールする必要があります。

既にインストールしたUnityエディタと同じバージョンのUnity download Assistantを起動して追加インストールを行います。これで既にインストールしたUnityエディタに新しくAndroidのサポートが追加され、Android SDKJDKを設定する項目が追加されます。

f:id:tsubaki_t1:20160206232344j:plain
なお、Unityエディタが既にインストールされている場合はUnity Editorのチェックを外しても大丈夫です。

f:id:tsubaki_t1:20160206231634j:plain

 関連

tsubakit1.hateblo.jp

*1:もしくはAndroid supportにAndroid SDKを設定する部分の機能が含まれているか