ラベル Unity の投稿を表示しています。 すべての投稿を表示
ラベル Unity の投稿を表示しています。 すべての投稿を表示

2013年7月21日日曜日

[Unity]KeyCodeについて

エディタを拡張してショートカットキーを割り当てているときに、Event.keyCodeで取得できる値がプラットフォームで異なっていたという問題にぶち当たったのでメモ。

↓キーコード一覧
http://docs.unity3d.com/Documentation/ScriptReference/KeyCode.html

具体例:)
日本語キーボードでセミコロンの場所のキーコードが「Equals」になっている。
日本語キーボードでコロンの場所のキーコードが「Semicolon」になっている。


これらはいずれもWindows上でのみ発生しており、Mac上では現象は見られなかったのでおそらくバグであると思われる(たとえ仕様であってもそんな仕様が許されてしまっては堪ったものではないが)。

そういえばと思い、英字キーボード配列を確認したところ、Windows上だとKeyCodeから取得できる値が英字キーボード配列と同様のものだった。
どうやらWindowsだけ英字キーボード配列のままのらしい。

一応バグレポートは提出した。
修正されるまでは別のキー割当にしておく。


2013年5月26日日曜日

[Unity]WebPlayer Pluginsのアンインストール方法

WebPlayerのPluginで問題が発生したのでアンインストールする必要があったのでメモ。
アンインストーラーが無いようなので、手動でPluginを削除した。

◆Max OSX
 1. ブラウザを全て終了する
 2. Macintosh HD/Library/Internet Plug-Ins/Unity Web Player.pluginを削除
 3. ゴミ箱を空にする

⬇英語だがシンプルな手順と、難しくない単語でまとめられているので分かりやすいと思う。
http://answers.unity3d.com/questions/43303/how-do-i-uninstall-the-unity-webplayer.html

※自分でやった手順を追記

2013年3月31日日曜日

[Unity]GameObject以下のコンポーネントへのアクセス方法


GameObjectコンポーネント以下のコンポーネントのゲームオブジェクトでアクセスする方法



children = gameObject.GetComponentsInChildren();
foreach (Transform item in children) {
 if ( !item.name.Equals(gameObject.name) ) {
  MeshRenderer meshRender = item.gameObject.GetComponent();
  if ( meshRender != null ) meshRender.enabled = _value;
 }
}
などでアクセスする。
ポイントはTransform型でアクセスすること。
基本的に全てのGameObjectはTransformを所有する決まりが有るので、
transformクラスからGameObjectへのアクセスが可能になっている。

アセンブリブラウザで確認すれば解るが、TransformクラスはComponentクラスを継承しているので、様々なオブジェクトを取り扱えるというわけだ。

http://docs-jp.unity3d.com/Documentation/Components/class-Transform.html

◆結論

GameObject=Transformという認識で問題ない。


しかし、スケール値の不均等によるパフォーマンスの問題や制限があるだなんて初めて知った……。

[Unity]Errorについて

Unity上で発生した珍しいエラーや解決が困難だったものをメモしておく。
※随時追記


・is an ambiguous reference between
クラスの重複。
カスタムDLLをインポートした時に発生しやすい。
namespaceが重複してしまっているので、クラス名の前にパッケージ名を付与する必要が有る。

・DllNotFoundExeption
DllImportで読み込むときのファイルが存在しないと言っている。
とあるDLLを使おうとしたときに発生したのでメモ。


とりあえずこんなところ。

[Blender]Blender How To


Blender How To

Unityを使う上でサンプルオブジェクトはある程度エンジニアでも作れるようになっておかないといかんので、自分用にメモしておく。

◆最初にすること

 - Mayaをしばらく触ったことがあるので、基本操作をMaya版に設定変更する
 - 右クリックと左クリックの動作を変更しておくこと
 - 必ず操作方法のチュートリアルを見ること

特に、操作方法のチュートリアルは見ておかないと、後に別のチュートリアルを見た時に、「なんだそのウィンドウは!?」、「どうやったらそういう操作ができるんだ!?」などと困ってしまうことになる。

◆簡単なものを作成してみる or 操作してみる

・本のページめくりを作成するまでのチュートリアル
アニメーションの作成方法のチュートリアルとしては見た目面白いが、基本キー操作が解っていないとつらい。
操作方法のチュートリアルを飛ばしたのでここで詰まった。

・テクスチャの裏表に別々のテクスチャを貼付ける
原理は非常に簡単。
しかし、objファイルやfbxファイルに書き出した時に反映されていないので、Unityを使っていく上では必要なかった。

・操作方法の図解ブログ
この人は図解されているので説明が親切。
ほとんどのブログや公式の説明の類いは、文字だけの説明になっているので、特定のコマンドがどこに存在するのかが解り辛く、初心者には厳しい中、こういうのは非常にありがたい。

・移動、回転、拡大縮小の軸を限定する方法
G,R,Sに続けて[X,Y,Z]のキーを押すと限定できる。

◆必要なこと

 - アーチなどのように、四角形を少しだけ複雑にしたようなモデリングができる
 - 一つのオブジェクトに対してマテリアルを複数適用できる
 - 出力形式やパラメータ設定の違いを理解しておくこと

これくらい出来れば、モデリングの作成や修正の依頼する時にそこそこ話が通じる。
基本的にどういったモデルが必要になるかは実装するエンジニア次第なところがあるので、エンジニアも最低限これくらいはできないといかんな。
あとはその時の立場とかにもよるかもしれないが……


2013年3月24日日曜日

[Unity]Shader上で深度値を取得する方法


Shaderから深度値を取得する方法
チュートリアルの「Shader Replacement」が良い教材

◆Edge Detection

・カメラ上で以下のコードを追加する
取得できるのはモードにより異なる
  • 深度のみ
  • 深度と法線

void OnEnable() {
    camera.depthTextureMode = DepthTextureMode.Depth;
    camera.depthTextureMode = DepthTextureMode.DepthNormals;
}



・Shader上の処理
深度バッファ値を格納してあるテクスチャー情報を取得する。
そのためには以下のようにShader用のグローバルな固定変数がある
sampler2D _CameraDepthTexture;
sampler2D _CameraDepthNormalsTexture;

デプスバッファはプラットフォーム毎に異なる実装方法なので、
リンクを参照する。
あとは、差異をなるべく少なくするためのマクロも実装されているので活用する。


◆Glowing Things

RenderWithShader -> 特定のレンダリングパスにシェーダーを適応する処理
そのデモが「Glowing Things」である。

・オブジェクトに適応するShaderのレンダリングタイプを設定する
Hierarchy上のCylinderオブジェクトには「VertexLit Funky」というShaderが適応されている。
ポストエフェクト時に演出していることがわかる。


以下、Unity Script からの抜粋
OnPreCull is called before a camera culls the scene.
OnPreRender is called before a camera starts rendering the scene.
OnPostRender is called after a camera finished rendering the scene.
OnRenderObject is called after camera has rendered the scene.
OnWillRenderObject is called once for each camera if the object is visible.
OnGUI is called for rendering and handling GUI events.
OnRenderImage is called after all rendering is complete to render image






2013年3月3日日曜日

[Unity]UnityのJSONObjectで発生するエラー


Unityでjsonを扱う際に使用するライブラリの一つである「JSONObject」を使用したが、Unity4以降で「TryParse Error」というエラーが発生する。
気持ち悪いので修正した。

◆JSONObject.cs


以下の部分を画像の様に修正すれば問題がなくなる
なお、コード部分はwikiからの引用

try {
 n = System.Convert.ToDouble(str);
 type = Type.NUMBER;
} catch(System.FormatException) {
}





型変換に失敗していたので、返還前に型チェックを行ってくれるTryParseメソッドを使用した。
しかし、強引にエラーを起こしていたとはなかなか……。

◆参照

2013年2月11日月曜日

[Unity]Quaternionについて

UnityScriptでオブジェクトの回転に関する計算をするのが面倒な場合、Quaternionを使用すれば処理も高速になるし幸せになれるので実際に動かしながら実験したときのメモ。


◆概念

今回はUnity Script上のコードでどういう挙動になるかの調査なので、概念はwikiなどにお任し、割愛させていただく。



◆ソース
using UnityEngine;
using System.Collections;

/**
 * Quaternionを体系的に学ぶためのテストクラス
 * Quaternionは四元数と呼ばれ、回転をごくごく簡単に扱うことができる
 * なお、Quaternionは原点を中心に回転軸を考慮してしまうので、原点以外からの回転軸の計算を行いたい場合は事前に座標計算をしておく必要がある
 **/
public class QuaternionTest : MonoBehaviour {
 
 public Vector3 point;
 public Vector3 angle;
 
 public bool isAnimation;
 public int animationCounter;
 public int ANIMATION_FPS = 24;

 // Use this for initialization
 void Start () {
  // if target os is iPhone ~
  // change value from "#define kFPS 30 of AppController.mm"
  Application.targetFrameRate = 60;
 }
 
 // Update is called once per frame
 void LateUpdate () {
  if ( !isAnimation ) return;
  
  // カメラのQuaternionを取得
  // 今回の場合、カメラの座標 to 原点の向きが取得できる
  Quaternion targetQuaternion = Camera.mainCamera.transform.rotation;
  
  // 特定の座標点から座標点への向きを取得できる
  //targetQuaternion = Quaternion.FromToRotation( new Vector3(1,1,1), new Vector3(-1,-1,-1));
  
  // この例だと、カメラから物体の座標点
  //targetQuaternion = Quaternion.FromToRotation( transform.position, Camera.mainCamera.transform.position );
  
  // Quaternionを反転させる
  // 用途例としては、自分(敵)のQuaternionを敵(自分)に反転させて反映させることで向き合うことができる、など
  //targetQuaternion = Quaternion.Inverse(Camera.mainCamera.transform.rotation);
  
  // 原点 to 座標点の向きが取得できる
  //targetQuaternion = Quaternion.LookRotation( new Vector3(1,1,1) );
  
  // こちらの例だと、カメラの座標点 - 物体の座標点 を計算してから行っているので、
  // 物体の座標点 to 座標点の向きが取得できる
  Vector3 relativePos = Camera.mainCamera.transform.position - transform.position;
        targetQuaternion = Quaternion.LookRotation(relativePos);
  
  animationCounter++;
  if ( animationCounter >= ANIMATION_FPS ) {
   animationInit();
   return;
  }
  //transform.rotation = Quaternion.Slerp( transform.rotation, Camera.mainCamera.transform.rotation, Time.deltaTime );
  float mountTime = (float)animationCounter / ANIMATION_FPS;
  
  // Slerpは球面線形補間と呼ばれるアルゴリズムで、
  // QuaternionからQuaternionへの移動をスムーズに行うことができるヘルパー関数
  // 3つめの引数に、変化量を指定することで、なめらかな変化が実現できる( 0.0f 〜 1.0f )
  transform.rotation = Quaternion.Slerp( transform.rotation, targetQuaternion, mountTime );
 }
 
 public void animationStart() {
  animationInit ();
  isAnimation = true;
 }
 
 private void animationInit() {
  isAnimation = false;
  animationCounter = 0;
 }
}


◆参照
http://www015.upp.so-net.ne.jp/notgeld/quaternion.html http://ja.wikipedia.org/wiki/%E5%9B%9B%E5%85%83%E6%95%B0 http://marupeke296.com/DXG_No10_Quaternion.html http://docs.unity3d.com/Documentation/ScriptReference/Quaternion.html

2013年1月24日木曜日

[Unity]モバイル向けのShaderのメモ


Shaderの勉強のためのメモ
モバイル向けに使用できるものを中心にメモしていく。
まずは基本から。

◆バーテックスシェーダー
頂点データを使用して算術的に3D空間のデータに特殊効果を与えるグラフィックス機能。
Cg、GLSL、HLSLなどで扱える。

◆フラグメントシェーダー
ピクセルシェーダーとも呼ばれる。
ピクセル操作に特化したシェーダー。
基本的に頂点シェーダの情報を元にピクセルを操作するので、バーテックスシェーダーと同時に使用することが多い。
Cg、GLSL、HLSLなどで扱える。

◆ジオメトリシェーダー
プリミティブシェーダーとも呼ばれる。
プリミティブを作成できる。
バーテックスシェーダーの実行後にジオメトリシェーダーが実行される。
アセンブリ言語、Cg、GLSL、HLSLで扱える。

◆Unity内のシェーダー言語
Cg/HLSLを合わせて拡張したようなもの。
なので、基本的にはCg/HLSLが扱えれば問題ない。
Shader言語は初なのでまずは基本的なところから学習。
データ型
float - 32bit浮動小数点型
half - 16bit浮動小数点型
int - 32bit整数型
fixed - 12bit固定小数点型
bool - 論理型
sampler - テクスチャーオブジェクト型

その他にfloat3、float4x4などがあり、
ベクトルや行列を扱う型も存在する。

◆参照


◆実行順
Vertex Shader
↓
Fragment Shader

の順番で実行される。

下位のシェーダーはモバイルでは使用できない
というかDirectX11向けに改良された点が多いので、モバイルは制限が多く感じられるのかもしれない。
 - geometory
 - hull
 - domain

◆セマンティクス
Shader言語で関数を記述する際に使用することがよくある。
関数宣言の構文についてと合わせて参照するとよい。
関数の戻り値に対しても、引数の型に対しても、使用目的の識別子として扱われる。
↓関数宣言の構文について

↓セマンティクスについて

よく使われるセマンティクス
シェーダー毎に挙動が異なることが多いので、使用する際にシェーダーとセマンティクスがどういう挙動になるか確認をした方が良い。

POSITION - オブジェクトの頂点位置を読み取る
SV_POSITION - オブジェクトの頂点位置の読み込みと書き込みが可能(DirectX10以降)

2013年1月23日水曜日

[Unity]Shaderのメモ-①-

UnityでShaderをいじるのでメモ。
分からないキーワードが続々出てきたので、とりあえずコードに記載されているものの説明から始めようと思う。
説明はコード上に記載。
※説明内容はprogramを知らない人が何となく理解できるような言葉で敢えての説明文、というか自分が理解するためのとっかかりとしてメモしたものなので分かりづらかったらドキュメントを見た方がいい。

// Shaderのネームスペース
Shader "Custom/Basic" {
 // Unity用に最適化したシェーダーの実行命令形態
 SubShader {
  // 複数のシェーダーをまとめて扱うためのおまじない。
  // パイプラインをまとめる(Pass)
  Pass {
  // Cgプログラムでシェーダーを使いますよっていうおまじない
  CGPROGRAM
  
  // "#pragma"はスニペット
  // "#pragma vertex"でバーテックスシェーダーを使用する旨を伝える、引数はファンクションネーム
  // "#pragma fragment"でフラグメントシェーダーを使用する旨を伝える、引数はファンクションネーム
  #pragma vertex vert_function
  #pragma fragment frag_function
  
  // 型 関数名(引数型 引数名) : 適応範囲
  float4 vert_function(float4 vertexPos : POSITION) : SV_POSITION {
   // mulは乗算、UNITY_MATRIX_MVPは演算適応範囲でMVPだとModel*View*Projection(射影行列)、で残りの引数が実効値
   return mul(UNITY_MATRIX_MVP, float4(1.0,0.1,1.0,1.0) * vertexPos);
  }
  
  // 型 関数名(引数型) : 適応範囲(フラグメントの色)
  float4 frag_function(void) : COLOR {
   return float4(1.0, 0.6, 0.0, 1.0);
   // (red, blue, green, alpha)
  }
  // Cgプログラムのシェーダーはここで終了ですよっていうおまじない
  ENDCG
  }
 }
}

詳細を知りたい場合はドキュメントを参照
日本語版もある。
「docs」の後に「-jp」を付ければ日本語版に早変わり♪

2013年1月17日木曜日

[Unity]Androidへのパブリッシュ時のテクスチャーについて


Android用(2.2)にパブリッシュした時にテクスチャーが自動で変換されたので何事かと思ったのでメモ。
どうやら仕様のようだ。

以下、Unityの公式サイトからの抜粋。

テクスチャーの圧縮について
ビルド設定には Texture Compression/テクスチャーの圧縮 という項目があります。
Unity の初期設定では、特に指定が無い場合ETC1/RGBA16 というテクスチャーフォーマットが使用されます。
テクスチャーフォーマットのオーバーライドについてはテクスチャー 2D / プラットフォームごとのオーバーライドを参照してください。
特定のハードウェアアーキテクチャを対象とするアプリケーションアーカイブ ( .apk ファイル) をビルドする場合、テクスチャーの圧縮オプションを使ってデフォルト設定をオーバーライドすることができます。
圧縮しないよう指定したテクスチャーはどれもそのままで、圧縮フォーマットを使用しているテクスチャーだけが、オプション内で指定されたフォーマットで圧縮されます。
そのテクスチャー圧縮をサポートしているデバイスのみにデプロイが限定されるよう、Unity が所定フォーマットのタグを含めるようにAndroidManifest を編集します。
こうすることで Android Market のフィルターメカニズムが、適切なグラフィックハードウェアを持つデバイスだけにアプリケーションを提供できるようになります。

Androidの共通フォーマットがETC1というもので、アルファチャネルがサポートされていない。
Android version 2.2 (Froyo)からサポートしている。
この辺はwikiを見ればわかるが、問題発生。
汎用向けにパブリッシュすると画像が綺麗じゃない。
そこでツールを探してみた。
有用と思われるものを2つ見つけたのでリンクを貼っておく。

・OPTPiX imesta 7 for Mobile & Social

6ヶ月のレンタル方式で29,800円なり。
値段だけで判断すると一つのツールとしてはやや高めな気もするが、
画像のデータサイズを圧縮する機能は当然として、Photoshopとの連携機能やJavaScriptフィルタの機能、マクロ機能、マルチイメージ生成機能など
特筆すべきものがたくさんあった。
導入事例を見ても、大手起業さんの名が連なっているので信用もある。

・Caesium

無料の画像圧縮ツール。
比較的最近できたツールで、特殊なアルゴリズムで元の画像品質を維持しつつデータサイズを削減することに重きを置いているようなので、
PCやiOS向けに作成した画像をそのまま使用した時に便利だと思ったので挙げた。
LifeHackerさんでも紹介されていた。
難点を挙げるとすれば、現状だとWindows版しかないので、LinuxユーザやMacユーザは使用できないこと(Linuxは対応するかもしれないが、Macは対応するつもりはないと公式で発表している)

◆参照

2012年12月30日日曜日

[Unity]GUITextのInspector上で改行する方法


ググっても情報が出なかったので、一応メモしておく。
(調査した日は12/18)

◆文字の改行

Inspector上で改行して文字を入力したいとき、
Mac だとAlt + Enterで改行できる。Windowsは知らないけど同じだと思う。
ただし、現状だと直感的ではないのでGUITextを割と使う人はコンポーネントをCustomEditorでカスタマイズしたら良いと思う。

ちなみにスクリプト上なら"\n"で改行。



[Unity][Maya]MayaのNURBSオブジェクトをFBXファイルに出力する時のメモ


Maya上で作成したNURBSプリミティブオブジェクトをFBXに変換しようとしてもうまく表示されなかったのでメモ。
調べると、現状だとFBXで出力してもNURBS情報のサポートをしていないので、変換時に情報が失われて何も表示されないことがわかった。
書き出すときの設定を変更してやれば特に問題ない。


◆流れ

Maya上でNURBSプリミティブオブジェクトを作成する。
今回試したのは円柱。
⬇
「ファイル」→「すべて書き出し」で書き出しウィンドウを開く。




⬇
画面右側の項目「オプション」
⬇
「ファイルタイプ特有のオプション」
⬇
「含めるオプション」
⬇
「ジオメトリ」
⬇
「NURBSサーフェスの変換」の「メッシュのインタラクティブ表示」か「ソフトウェアレンダーメッシュ」を選択して書き出す




◆説明

「メッシュのインタラクティブ表示」は表示設定に基づいて書き出す。
「ソフトウェアレンダーメッシュ」はレンダリング設定に基づいて書き出す。
という違い。
初めから作るのでない限りはNURBSで作らない方がいい。
試しに円柱を作成してみたが、どちらの設定でもポリゴンで作成するよりもオブジェクトの分割数が増える上、ポリゴン数も頂点数も増える。
つまりUnity上で扱う時にはデメリットしか無いわけだ。

※設定次第で回避できるのかは調査していない
※簡単なオブジェクトでしか実験していないので、実際にモデリングをする上でのメリットデメリットは考慮しない。その点はアーティスト判断が個々で判断を尊重するといいかも。

◆参考

autodeskのドキュメントにはたいていのことが書いてある。
たぶんググって誰かのブログを見るよりも、ドキュメントを参照した方が正確な情報が書いてあると思う。

http://download.autodesk.com/global/docs/motionbuilder2012/ja_JP/index.html?url=files/GUID-D1C279AB-42EB-4483-BE90-858C9DF81F0-259.htm,topicNumber=d28e26209
http://download.autodesk.com/global/docs/maya2013/ja_jp/index.html?url=files/GUID-6B99E42D-1296-41DD-A103-899F858FBDF0.htm,topicNumber=d30e41956

[Unity][Maya]MayaからUnity用のオブジェクトを出力する


Unity用のオブジェクトをMayaで作成することになったので、MayaからUnity用のオブジェクトを出力する方法のメモしておく。
Shadeの体験版を使用感を比べるとMayaの方が操作が分かりやすく直感的だった。
さすがに金額が高いだけある。

◆流れ

Mayaをinstall
体験版はこちら。
⬇
Maya用のFBX Pluginをinstall
⬇
Maya起動
⬇
適当にオブジェクトを作成
※ここは重要ではない
⬇
書き出すファイルの種類に「FBX export」とあるので選択して書き出す
⬇
FBXファイルが出力される


◆注意点
Mayaを起動中にPluginをインストールしたときは再起動すること。

◆pluginの場所 (2012/12/26)

http://usa.autodesk.com/adsk/servlet/pc/item?siteID=123112&id=10775855

2012年12月16日日曜日

[Unity]Unity Editorのカスタマイズ


Unity Editorのカスタマイズのメモ。


Unityの特性上、GUI上でパラメータを扱うことが非常に多いため、どうしてもカスタマイズの必要性がある。
なので、カスタマイズまでの流れをメモしておく。

◆共通

Assetsフォルダ以下にEditorというフォルダを作成し、そのフォルダ内に作成したスクリプトを配置すれば自動で読み込まれて実行される。


◆Menuのカスタマイズ

ショートカットなどに登録して行う作業はここで行なったほうがいい。
或は、全オブジェクト対象の作業などもここで行なうと良いと思う。

例えば、複数のカメラオブジェクトを一括で無効にするようなものなど。


例:
public class  MenuA {
    private const string MENUITEMNAME = "MenuB";
    [MenuItem(MENUITEMNAME + "/hideALLCameraObjects")]
    static void hideALLCameraObjects() {
        GameObject[] objects = (GameObject[])
        GameObject.FindSceneObjectsOfType(typeof(GameObject));
        foreach(GameObject obj in objects) {
            if (obj.camera != null && !obj.camera.name.Equals("Main Camera") ) {
                obj.camera.enabled = false;
            }
        }
    }
}

◆Preferencesのカスタマイズ

設定のカスタマイズに是非。
レポートの作成時のパラメータ設定などはこちらで行った方がいい。

下記の例は文字列を記入しておいて、保存する仕組みのもの。

例:
public class PreferencesMenuB {
    private const string MENUITEMNAME = "MenuB";
    private const string TEXT_KEY = "HashKey";
    [PreferenceItem (MENUITEMNAME)]
 
    public static void PreferencesGUI () {
        if (!prefsLoaded) {
            text = EditorPrefs.GetString (TEXT_KEY, "");
            prefsLoaded = true;
        }
      
        text = EditorGUILayout.TextArea (text, GUILayout.Height(100));
      
        if (GUI.changed)
            EditorPrefs.SetString (TEXT_KEY, text);
    }
}

◆Inspectorのカスタマイズ

Inspectorは特にパラメータを弄る画面なので、覚えておくと損は無いと思う。
注意点としては、Inspectorのカスタマイズを行うと、パブリック変数は全てEditorGUILayoutで設定し直す必要がある点。
例えば10個のメンバー変数があり、その全てをInspector上で編集できる状態だとして、そのうちの1つだけカスタマイズしたいとなると、
CustomEditorスクリプト内に10個分の設定を行う必要があるわけだ。
もし、10個のメンバー変数の内、一つだけカスタマイズしたいという状態なら敢えてエディターをカスタマイズする必要はないかもしれない。



CustomEditorアトリビュートを使用して、エディタのカスタマイズの準備をする。
⬇
Editorクラスを継承する。
⬇
OnInspectorGUIメソッドをオーバーライドして、Inspectorを改造する。
これは、カーソルがInspectorビュー上に移った時に呼ばれるメソッド。
⬇
ターゲットを指定する。
⬇
〜カスタマイズ〜


例:
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(ClassB))]
public class CustomInspectorForClassB : Editor {
    public override void OnInspectorGUI() {
        ClassB script = target as ClassB;
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Rotate Y Speed");
        script.SpeedY = EditorGUILayout.Slider(script.SpeedY, 0, 30);
        EditorGUILayout.EndHorizontal();
    }
}

◆参考

http://www.wisdomsoft.jp/321.html

2012年12月8日土曜日

[Unity]UnityScriptを動的に読み込む方法のメモ


UnityScriptを動的に読み込む方法のメモ



シーン毎に処理を分けたいがシーン毎に処理分けしてしまうと遅くなるので面倒。
スパイクチュンソフトさんがシーン毎にわけても遅くならないように作成した事例があったが、
シーン毎の管理方法を自作する必要があるので、それはそれで面倒。

⬇作成事例
http://www.slideshare.net/RyoheiTokimura/ss-14048278

◆目的

スクリプトでスクリプトを管理できれば一元化できる。


◆方法

めちゃくちゃ簡単。
作業の流れだけを記載するとこんな感じ。

シーン上(hierarchy)にcreate emptyで空のオブジェクトを生成
⬇
prefab化(Project内にドラッグ)
⬇
先ほど作成したオブジェクトをシーン上から削除
⬇
Project内にスクリプトを作成(言語問わず)
⬇
prefab化したオブジェクトに反映(ドラッグして)
⬇
先ほど作成したスクリプトに処理を実装
⬇
スクリプト管理用のスクリプトからprefab化したオブジェクトをクローン(Instantiate)する
⬇
スクリプトが実行される

あとは、各々のタイミングでオブジェクトを破棄したり新たに生成したりすればいい。


◆メッセージングによるメソッドの実行

SendMessageメソッドを使用すればクラス内のメソッドを実行できる。
BroadcastMessageメソッドを使用すれば階層構造下に存在する全てのオブジェクトに対して、クラス内にあるメソッドを実行できる。

ただし、メソッドが存在しない場合にはエラーが発生してしまうので、以下のオプションを付与するとよい。
今のところデメリットが分からないので、メッセージング機能を使用する場合はオプションを使用した方がいいだろう。
デバッグ時にわざとオプションを付けないようにするのも手かな。
SendMessageOptions.DontRequireReceiver

これで動的にメソッドを呼び出せる。

◆参考

http://docs.unity3d.com/Documentation/ScriptReference/SendMessageOptions.html

[Unity]Shadeからのexportしたときの設定


ShadeからexportしたFBX形式をUnity側で読み込んだときに座標系の設定が保持されていて、
移動・回転・拡大の制御が直感的ではなかったのでメモ。

◆Shadeでの設定

オブジェクトのルートのx軸の回転を「90」に設定する
↓
オブジェクトの中心点の座標を(0,0,0)に合わせる
(おそらくこれが一番重要)
↓

export時の設定で「座標系設定」→「上方向の軸設定」をy軸にする(デフォルトがz軸)
↓
FBX形式のファイルが完成

・Unity側の設定
FBX形式のファイルを読み込む


◆参考

http://iphone3gsapplication.blog129.fc2.com/blog-date-201105.html
http://d.hatena.ne.jp/kakk0u/20120310/1331372889

[Unity]多重継承について

Unityでの多重継承について


基底クラスのMonoBehaviourクラスを多段継承を行ってクラスの管理を行ないたかったのでメモ。


◆方法

オーバーライドするメソッドにキーワードをくっつけてやれば行けた。


### SampleClass ###

using UnityEngine;

using System.Collections; 

publicclass SampleClass : MonoBehaviour {

    public virtual void Start() {
    }
    public virtual void Update() {
    }
}
#########################

作成したGUITouchScriptクラスを継承して、イベント用のスクリプトを作成

### HelloClass ###

using UnityEngine;

public class HelloClass : SampleClass {

 

    // Use this for initialization

    public override void Start () {

        base.Update();

    }

    // Update is called once per frame

    public override void Update () {

        base.Update();

    }

} 

#########################

このようにすれば多重継承でUpdateなどを呼び出せる。

2012年12月2日日曜日

[Unity]DrawCallを減らす方法


◆DrawCallを減らす方法

Shadeからデータをインポートしてオブジェクトを表示しようと思ったら、DrawCall数がめちゃくちゃ多かった。
元々ゲーム用に作っていたデータではなかったのであたりまえだがポリゴン数がめちゃくちゃ多く、かつテクスチャーもオブジェクト一つ毎に使用されていた。
作り直すのはコストが掛かるので減らすために何か試作をと思い、簡単なオブジェクトをShadeで作成し、それをFBX形式でエクスポートしてUnityで使った。
それでも減らないので、Unity側で色々弄ってみた。
少し改善したのでメモしておく。

 1. FBXデータの中で同じようなオブジェクトがたくさん在る場合
一つだけ生成し、シーン内で複製を行うと描画実行時にDrawCall数が増えなかった。
Shadeでデータを作る時にLinkで複製しても、Unity内にデータをエクスポートした時には同じオブジェクトとして扱われなかった。
だから、同じようなオブジェクトが在る場合はUnity内で複製を行う必要が在る。
高度な複製を行えば、よりオブジェクトが少なくできる。

例:)本、球、などなど。

2.Shade側でのポイント
メッシュ化してオブジェクトを一つにする。
その際、UVの編集も忘れずに行う事。
こうする事で、一つのオブジェクトとして扱えるので、オブジェクトに掛かるDrawCall数は1回になる。

例:)Unity3D 3.5のサンプルとしてAssetStoreにある、『Penelope』などはキャラクターが一つのオブジェクトとして作成されているなどの細かいな作業が行われている。

◆外部サイト
http://hideapp.cocolog-nifty.com/blog/2012/06/drawcall-21d5.html
・マテリアルの数の分DrawCallが増えるのでマテリアルの種類は最低限にする
・極力オブジェクトをまとめる
・UI作成時には、UI毎にテクスチャを持たずに、1枚のテクスチャにまとめて
 1マテリアルにする。(NGUI等のアセットを使うと楽)

50のTips
http://warapuri.tumblr.com/post/28972633000/unity-50-tips