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