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日日曜日

[Blogger]ソースコードを投稿する時にシンタックスハイライトを適用させる方法


ソースコードを投稿する時にシンタックスハイライトを適用させる方法のメモ。


◆How to
http://www.way2blogging.org/2011/03/how-to-add-syntax-highlighterv3-to.htmlにアクセス。

Watch liveのところで、ハイライトのデモを見られるので好きな物を物色する。


「GENERATE SCRIPTS」というボタンの遷移先でスキームと対応言語を選ぶ。


「Generate」ボタンでhtmlコードを生成する。
Blogger -> テンプレート -> htmlを編集ボタンを選び、
</head>の直前に生成されたコードをコピー&ペーストする

投稿するブログのHTMLの編集画面で下記のようなコードを前後に付ける
<pre class='brush:[言語名];'>
<pre/>

例:

<pre class='brush:csharp;'>
public void ClassA {
    #define HELLO_WORLD 0
    public int a;
    public ClassA() {
        a = 0;
    }
}
<pre/>




public void ClassA {
    #define HELLO_WORLD 0
    public int a;
    public ClassA() {
        a = 0;
    }
}



※1 動的ビューのテンプレートだと動作しない。
※2 対応させる言語名が分からないときは生成されたリンクさきのコード内の「Brush.aliases」というキーワードを見ればいい。
例えばC#なら ['c#', 'c-sharp', 'csharp'];という3つのキーワードであれば反映できる。



◆参考
http://net-3.blogspot.jp/2011/05/blogger.html
http://www.way2blogging.org/2011/03/how-to-add-syntax-highlighterv3-to.html



[MonoDevelop]よく使うショートカットキーのメモ


Editor系のツールで一番始めにすることといえば、やはりショートカットキーを覚える事。

使いそうな物をメモっておく。

◆ショートカットリスト

⌘ + Shift + ' : ローカルのドキュメントヘルプを参照する
⌘ + Shift+ {  : タブを左に切り替える
⌘ + Shift+ }  : タブを右に切り替える
⌘ +  {  : 左にインデント
⌘ +  }  : 右にインデント
⌘ + Y : 定義へジャンプする
⌘ + Shift + Y : 参照先をリストアップ
⌘ + R : 名前をリファクタリング
⌘ + F : フォーカスしているファイル内を検索
⌘ + Shift + F : 複数のファイル内を検索 (option)
⌘ + B : ビルド
⌘ + Shift + D : ファイルを検索する (xcodeだと ⌘ + Shift + O、Eclipseだと ⌘ + Shift + Rにあたる)


おおむね他のEditor系と変わらない。
ファイルの検索方法が忘れがちなのでメモっておく。

[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