【Unity】SceneViewのカメラを特定のオブジェクトに向ける

Hierarchyでオブジェクトをダブルクリックしたときと同じ挙動をScriptから再現するやつ。

public class FocusSceneViewCamera : MonoBehaviour
{
    [SerializeField]
    GameObject focusTarget;

    void Awake ()
    {
        SceneView.onSceneGUIDelegate += InitializeSceneCamera;
    }

    void InitializeSceneCamera (SceneView sceneView)
    {
        SceneView.onSceneGUIDelegate -= InitializeSceneCamera;
        if (focusTarget != null) {
            Selection.activeGameObject = focusTarget;
            sceneView.FrameSelected ();
        }
    }
}

前述の挙動の実装が、SceneViewのFrameSelectedを叩いてるっぽいんですけど、その中でSelectionからその対象を引っ張ってきているので、SelectionのactiveGameObjectを任意のGameObjectで書き換えた上で同メソッドを叩くことで実現しています。
こちらの例はゲームプレイのタイミングで一回だけ任意のGameObjectにフォーカスしてますが、Awakeで行ってる処理を行うメソッドを用意すれば好きなタイミングで呼び出せるかと思います。

正直あんまり使いどころはないですが、SceneViewのカメラとGameViewのカメラを同期したいケースでは使えなくもなかったりします。
同期は以下のようなメソッドを上と同じようにSceneViewのonSceneGUIDelegateに登録してあげれば実現できます。

void SyncGameViewCamera (SceneView sceneView)
{
    Camera.main.transform.position = sceneView.camera.transform.position;
    Camera.main.transform.rotation = sceneView.camera.transform.rotation;
}

【Maya】作成したツールの設定を保存する

Mayaのツールを作ったものの、その設定を次回起動時も引き継ぐためにはどうしようか、jsonか、csvか、どこに保存しようか、と思ってたらどうやらoptionVarという便利メソッドがあるようで。

help.autodesk.com

import maya.cmds as cmds

saveKey='myToolWindowWidth'

# 無ければ追加
if cmds.optionVar(exists=saveKey) == False:
    cmds.optionVar(intValue=(saveKey, 300 ))

# 取得
print (cmds.optionVar(q=saveKey))

# 削除
cmds.optionVar(remove=saveKey)

という感じで使えます。
上書きは追加のときと同じ形です。

このメソッドを使って保存した内容はユーザーごとのprefsディレクトリのuserPrefs.melに保存されます
Macでいうとこのあたり。

/Users/ユーザー名/Library/Preferences/Autodesk/maya/2015-x64/ja_JP/prefs/userPrefs.mel

Mayaがぶっ壊れたときにprefsディレクトリを消すみたいな悲しいオペレーションがあったりするので、そのときは泣いてもらうほかないですが、基本的にはこれで簡単に設定の保存、読み込みができそうです。
べんり。

【Unity】Unityに出力可能なエフェクトエディタ「SPARK GEAR」

sparkgear.net
UnityとCocos-2Dxに対応しており、大量のテクスチャやエフェクトのバンドル、簡単なモデルの作成、スマホ実機にリアルタイムで変更が反映できる、などが売りの新しいエフェクトエディタ。
ドローコールの削減など、負荷削減に関する対策もされているようで、期待が高まります。

詳細は上記公式サイトと、以下のページ、スライドが参考になります。
jp.gamesindustry.biz

www.slideshare.net

スライドの最後にもある通り、現在機能制限のあるフリー版が無料配布されています。
ダウンロードは以下の公式Facebookページから。
株式会社Spark

起動にはいくつかランタイムが必要なので、zip解凍してReadmeを読みましょう。
(Readme.txtを読む文化をすっかり忘れて一人で「起動しない…!!」ってなってました)

尚、エディタはWindows専用なので、MacユーザーはVirtualBoxとかで試す感じですね。
サンプルがいくつか含まれているので、使い方がわからない場合はサンプルを見て各種設定を確認することが出来ます。

このフリー版にはSDKなどが含まれていないので、Unityでの動作確認はできなさそうです。
サイトによると、

Unity,Cocos2d-xの組み込み再生が可能。逆にUnityなどで制作したものを再利用することも可能。特にUnityではPrefab化したリソースをスクリプトからPlayするだけで組込可能。
(エンジンの依存性なし)
ランタイムを組み込むことでSPARKFXエディターで制作したアセットをiOS,Android,OSX,Windows上で再生できます。
http://sparkfx.jp/main/%E5%B9%85%E5%BA%83%E3%81%84%E4%BA%92%E6%8F%9B%E6%80%A7/

とのことなので導入は容易そうですが、実際のところは使ってみないと分からないのと、初期費用100万円+月額20万円は容易に出せない(白目)ので、一旦は今後利用者が増えてレポートが出るのを待つばかり。

【Unity】アセットの読み込みでシンボリックリンクを使う

Mayaで作業をしててFBX書き出しをしてUnity上で確認したいんだけど、FBXファイルをUnityの該当プロジェクトのAssets配下に置きたくないみたいなこと、ありませんか!
あんまりないと思いますけど、なんやかんやであったので覚書です。

ぱっと思い浮かぶのはMacならエイリアス、Windowsならショートカットだったんですけど、それぞれこれではうまくいきません。
じゃあシンボリックリンクならどうか、ということでとりあえずMacで試してみます。

まずはAssets配下にResourcesディレクトリを作成して、ここに特定のディレクトリへのシンボリックリンクを作ることにします。
ターミナルを開いて以下のような感じでコマンドを実行します。

# Resourcesに移動
cd /Users/tm8r/Documents/TestUnityProject/Assets/Resources

# シンボリックリンクを作成
ln -s /Users/tm8r/Documents/maya/projects/default/scenes scenes

これでUnityに戻ると、「/Users/tm8r/Documents/maya/projects/default/scenes」があたかも「Assets/Resources/scenes」にあるかのように振る舞ってくれるので、あとはResources.Loadとかでいつも通りファイルを扱えます。

次にWindows。Resourcesディレクトリ作成までは変わりません。
準備ができたら憎きコマンドプロンプトを起動して以下のような感じでコマンドを実行します。

# Resourcesに移動
cd C:¥Users¥tm8r¥Documents¥TestUnityProject¥Assets¥Resources

# シンボリックリンクを作成
mklink /D scenes C:¥Users¥tm8r¥Documents¥maya¥projects¥default¥scenes

「/D」はディレクトリのシンボリックリンクを作成するための引数です。

lnコマンドとターゲットとソースの引数の順番が逆なのが若干罠ですね。
これでMac同様、WindowsでもUnityでちゃんと認識されるシンボリックリンクが作成できました。わいわい。

【Unity】UniRxを使ってuGUIのイベントを監視する

f:id:tm8r:20160513202840p:plain
こういうのをつくります。
ざっくり言うと、InputFieldに入力されたディレクトリに存在するFbxファイルをDropDownに列挙するものです。

f:id:tm8r:20160513202844p:plain
Hierarchyはこんなかんじ。
InputFieldとDropDownを作り、DropDownはOptionsを初期値の1つだけにしておきます。

次に以下のスクリプトを用意して、Canvasとか適当なところにアタッチします。
gist.github.com

これで最初に書いた要件が実現できます。UniRx捗る。

ランタイムで任意のディレクトリにあるFBXを閲覧できるビューアーを作るつもりで実装を始めたものの、思いの外これがダルくて、どうやらFBXのパースをUnityに任せられない(自前で用意しないといけない)っぽいことが分かって膝から崩れ落ちたので現実逃避な記事です。つらみ。
それっぽい有料のアセットを使うか、assimpとか使ってなんとかする感じになるのかなー。むーん。

UniRx - Reactive Extensions for Unity - アセットストア - Asset Store

【Unity】同じMaterialが指定されているかチェックする

Rendererに同じMaterialが指定されているかチェックしたいという要件がありまして。

より具体的に言うとFBXとそこから作られたPrefabのMaterialに差分がないかチェックするという感じだったのですけど、ブログに載せる用のFBXファイルを用意するのもアレだなーということで、「ねーよそんな要件」って感じですけどProjectビューで選択された2つのオブジェクトにおけるルートのRendererのMaterialが一致するかチェックするものを書きました。

gist.github.com

Materialの比較は30行目の以下のコードで行っています。

var result = targetMaterials.SequenceEqual (compareMaterials);

SequenceEqualを使えば順序も含め、2つのシーケンスが等しいかどうかをチェックすることができます。
Enumerable.SequenceEqual(TSource) メソッド (IEnumerable(TSource), IEnumerable(TSource)) (System.Linq)

順序は考慮せずにチェックしたい場合、長さチェックをした上でそれぞれの全要素が合致するか見ていってもいいんですが、27-28行目みたいにソートしてしまえばSequenceEqualが使いまわせます。

本題からは逸れますが、MenuItemの第二引数にtrueを指定したboolを返すメソッドを用意することで、指定したメニューを有効にするか無効にするかを判定することができます。

上のコードでいうと、11行目のメソッドで「Assets/CheckSameMaterials」を選択したときの振る舞いを定義し、35行目のメソッドでこのメニューを有効にするか無効にするかを判定するものを定義しています。
具体的には、Projectビューで選択しているオブジェクトが2つであり、かつ両方ともプレハブまたはFBXファイルである場合だけtrueを返しているので、この条件に合致しない場合は「Assets/CheckSameMaterials」がグレーアウトします。

スポンサーリンク