ScreenPocket - 画面の隙間

Unityエンジニアの日々の雑記。たまにpython3、DirectX、PhotoshopScript(JavaScript)も触ります

PreserveAttribute について

適当に開いてみたリファレンスの項目を適当に調べて見るテスト

今回は「UnityEngine.Scripting.PreserveAttribute」

http://docs.unity3d.com/ja/current/ScriptReference/Scripting.PreserveAttribute.html

https://unity3d.com/jp/unity/whats-new/unity-5.1.2

↑のリリースノート・ドキュメントを見ると

  • iOS/IL2CPP: IL2CPP のストリップからクラス、メソッド、フィールドを除外する PreserveAttribute を追加

との事。このくらいの時期に追加されたのかな。

クラス、メソッド、フィールドにつけられる様で、未使用の項目が自動削除されないように置いておくための属性っぽい??
最適化を防ぐ(抑制する?)という点ではC++のvolatileっぽい感じか。

後、IL2CPP Platformでしか作用しない様なので注意が必要そう。

とりあえず今日はこの辺で。

CameraEvent.Before/AfterSkyboxについて

CameraEvent.AfterEverythingで指定されたCommandBufferは全ての最後に行う…ってことは、逆に全ての最初に行うCameraEventも有るのかな??と思ったのですが対になるCameraEvent.BeforeEverythingは無い模様…。

ならば、きっと最初に描画されるSkyBoxの前、BeforeSkyboxに自前のCommandBuffer(スクリーンをクリアするメッシュを描画する)を発行するようにして、カメラのClearFlagをDon'tClearにすれば、自分で用意したメッシュでフレームバッファをクリアできるぞ!

…と思ったのですが、↑の設定(ClearFlagsをDon'tClearにして、CameraEvent.BeforeSkyboxのタイミングでCommandBufferを発行)だと全く反応がない…。

もしやと思って、AfterSkyboxにしてもやっぱり反応がない…。

 

結局ClearFlagsをSkyboxにしないとBefore/AfterSkyboxは反応しませんでした。

 

…ということは、カメラのClearFlagsに依存しないで一番最初のタイミングでCommandBufferを差し込みたかったらCameraEvent.BeforeForwardOpaqueしかないんだろうか…。(ForwardRenderingでの話。)

スクリプトからのConstantカーブの指定方法

アニメーションのカーブを自前で追加したかったので、
スクリプトでAnimationCurveを作ってKeyframe指定などをしていたのですが、どうにもLinearかSmoothしか指定できない様子。。

調べた結果Keyframeには隠されたパラメータ、tangentMode という項目がありそこに 31 という値を代入すればいける!! との情報を見つけたので試してみたところ上手くいきませんでした;

しかも↑を設定したAnimationClipをAnimationのカーブエディタで確認したところ、キーの値はしっかりConstantになっているのにカーブの実態はSmoothのままという…。

文字通りキーッ!となって調べ倒した結果、
Keyframe設定時のtangentのパラメータにinfinityを代入すればConstant化できる
ようですね

http://answers.unity3d.com/questions/253837/can-i-set-an-animationcurve-keyframes-interpolatio.html

めちゃくちゃ時間かかりましたがとりあえず解決!

nearクリップ面基準での、傾斜並行投影変換

Unityのマニュアルにある傾斜錐体の変換

docs.unity3d.com

こちらは透視投影だと上手くいくのですが、平行投影で同じ変換を行うと、farクリップ平面基準の変換がかかってしまうみたい。

※つまりカメラ位置が大幅にずれる

どうしたもんかなーと色々探した結果、下記の変換を行えばnearクリップ平面基準で傾斜させられるとのこと。

http://aras-p.info/texts/obliqueortho.html

※追記:
微妙かも、要再調査。

VisualStudio2012で.Net Framework 3.5 を指定するための方法

こちら

http://www.ruche-home.net/boyaki/2012-10-14/CCLIVisu

Visual Studio 2012 C++で.NET Framework 4.0 以前をターゲットする方法 - コード スペランカー

こちらで書かれている TargetFramework エレメントが*.vcxprojの中に発見できなくて困っていましたが、

https://msdn.microsoft.com/ja-jp/library/vstudio/ff770576(v=vs.110).aspx

こちらを見ると

<Project> の要素の <PropertyGroup Label="Globals">

<TargetFrameworkVersion>バージョン番号</TargetFrameworkVersion>

を差し込めば良いとのことでした。

CameraのClearFlagsによる負荷

新しいシーンを作ってすぐにstatsを表示してみる。

f:id:ScreenPocket:20150905021510p:plain

何も置いていないのにBaches 1、Tris 1.7k Verts 5.0k !!??
シーンを作っただけで1,700面5,000頂点とかヒドい…!

で、こちらの描画関連の値ですが、MainCameraのClearFlagsで変化するので調べてみました。
ついでにFrameDebuggerも立ち上げて、描画イベントもチェック。

ClearFlags Event Batches Tris Verts SetPassCall
Skybox 3 1 約1,700 約5,000 1
Solid Color 2 0 0 0 0
Depth Only 2 0 0 0 0
Don't Clear 1 1 1 4 1

ん?何で、何もしないはずのDon'tClearで頂点と面が出来ているの??
ということで、気になってカメラを増やしてみたり色々試したところ、最後のカメラがDon'tClearだった場合にBatches、Tris、Vertsが上がるみたい。

おぉ、これは新発見だわ!と思って息巻いた矢先ですが、
FrameDebugerを止めて実行するとBatches、Tris、Vertsが0になりました;
デバッガ用の表示分で描画が必要なだけだったっぽいかな??

という事で今回のまとめ。

  • Skybox重い。。DrawCall 1、面数 1,700、頂点数 5,000、SetPass 1
  • Stats表記はFrameDebuggerの影響を受けるので、計測する際に気をつける事

…あまり面白い結果ではなかった;はぁ。

ScriptableObjectのプレビュー

これまた備忘録ですが、自前で作ったScriptableObjectのプレビューは↓で作ることが出来そう

http://docs.unity3d.com/ja/current/ScriptReference/ObjectPreview.html

ScriptableObjectでモデルを組み合わせたりするときは、ロード中はHasPreviewGUIをfalseで返すとか細工が必要そうかな。