MikuMikuDanceForUnity に関する投稿を表示しています

Inspector拡張の話、MFUのコンフィグの

この記事は公開されてから1年以上経過しており、情報が古い可能性があります。

参照: http://sourceforge.jp/projects/mmd-for-unity/scm/svn/commits/149
※r149が最新のコミットでもリリースされたものでもないので間違いないようおねがいします。

 InspectorBase.cs で [CustomEditor(typeof(Object))] を引っ掛けて、PMDInspector/VMDInspector に振り分けています。もし、他のスクリプトなどでも [CustomEditor(typeof(Object))] を使っている場合は、どちらかが動かなくなってしまうので、動かさなくてもいいほうをコメントアウトするとよさそうです。
 そのために、InspectorBase.cs の先頭あたりの#defineの1行をコメントアウトするだけで、InspectorBase.cs全体を無効化することができます。

 PMDInspectorでは、PMDLoaderWindow相当の機能を提供しています。EditorGUILayoutを使ってGUIを組んで、PMDLoaderScriptに投げているだけですけれども。

 VMDInspectorも大体同様で、VMDLoaderWindow相当の機能を。こちらもEditorGUILayout使ってGUIを組み上げ、MMDLoaderScriptに投げています。


 ここまででInspectorの話はおわりまして、追加してみたMMD.Configの話を。

 作った経緯としては、何度もインポート作業をするような場合、設定が毎回リセットされててつらぽよーとかなりそうなので作りました。ほんとうは、Inspectorを使うか使わないか、の設定を載せたかったのですが、そんな高等なことはできなさそうだったので無しです...

 中身は、ScriptableObjectを継承したConfigクラスを中心に、あとは保存したいフィールドを用意しているだけです。なので、あとで設定が増えた、項目が変わった、といったことが起きても対応しやすい、と、思います。

 Inspectorで表示したり共通設定を用意したりと、のために ConfigBase というクラスを用意しており、これを継承することで折りたたみがついているGUIを形成できます。やっていることは簡単なので、継承しなくてもいいと思いますが...(決してラムダ式を使ってみたかっただけ...ではないですよ、決して。ええ、戻り値をboolにしても行けますけど、まあ、はい。)

 で、Configクラスのメンバで、このConfigBaseを継承したクラスを放り込むことで、保存、読み込み、Inspector表示、ができるわけです。

 どこかで使うときは、Config.LoadAndCreate() で、得られます。

// Sample: PMDLoaderWindow
20 public PMDLoaderWindow()
21 {
22     // デフォルトコンフィグ
23     var config = MMD.Config.LoadAndCreate();
24     shader_type = config.pmd_config.shader_type;
25     rigidFlag = config.pmd_config.rigidFlag;
26     use_mecanim = config.pmd_config.use_mecanim;
27     use_ik = config.pmd_config.use_ik;
28 }

 保存は意図的に行わなくても、多分大丈夫です。多分。
 Config.csと同じフォルダにConfig.assetとしてバイナリが保存されます。
 Config.csファイルが他にもあると、そっちに保存されてしまう可能性があります。という部分だけ注意をしていただければ....(直したい

 あとは....r149で追加したものはすべてMMD名前空間に放り込みました、というぐらいですか。
 思えば、MMD.Editors とかの名前空間の方がよかったかも..?

 他は...とくにないですかね。
 追加したInspector周りにバグがあるっぽいので、上の件と合わせて検証して直します。

Inspector拡張の

この記事は公開されてから1年以上経過しており、情報が古い可能性があります。

先日書いた https://gomiba.co.in/blog/?p=94 この記事の続報。

以前質問した場所は流れてしまったっぽいので、そのまま削除しました。
で、同じような質問をFacebookの「Unityユーザ助け合い所」の方で質問しなおしました。
すると、いまEditor拡張がアツく最近Unityの中の人になった @kyusyukeigo さんがサンプルコードつきの回答を出してくれました。

 

"UnityEngine.ObjectのCustomEditorを作成する"
http://anchan828.hatenablog.jp/entry/2013/06/24/024425

 

ありがとうございます!

やはり以前の記事にも書いたように、[CutomEditor(typeof(Object))] をもつたった1つのクラスを作ってそこから振り分けていますね。じゃあ、まあ、いいか。あとはなんか設定項目みたいのでON/Offできるとよさそうですよね。

というわけで、MFUのInspectorでどうこうするのやっていきます。
なお手元はすでにこの状態な模様:うん、おっけーだろ on Twitpic

enabled=false なスクリプトに対して SendMessage

この記事は公開されてから1年以上経過しており、情報が古い可能性があります。

1. 適当なオブジェクトについてるスクリプトをInspectorから無効化します。

2. スクリプト内の Start() とかその他のメソッドが走らないことを確認します。

3. 無効化したスクリプトに向けてSendMessageします

4. SendMessageで指定したメソッドが走ります

5. 楽しい!✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

MMD for UnityのIKスクリプトのパフォーマンス計測もどきをしてたらめっちゃアラート出てきました。
ルートオブジェクトについたMMDEngineからSendMessageしてCCDIKSolver.Solveを呼び出していまるので上記に該当してたわけですね。

無効化したスクリプトに対しても何事もなくSendMessageを呼べてしまうの、んっ!? となったけどいいんでしょうかね

ともかく、髪IKがどうこうみたいな問題もありますので、一旦これでコミットしま(す|した)
(CCDIKSolver.Solveの先頭に if(!this.enabled) return; が増えただけですが)


追記

3.5のときはこの問題(?)はなかったような気がしますけど、多分気のせいですね。
その内確認するかもですが、別にやったからといって、うぅん・・・


Inspector拡張の

この記事は公開されてから1年以上経過しており、情報が古い可能性があります。

MMD for Unity (http://sourceforge.jp/projects/mmd-for-unity/) で、メニューアイテムからじゃなくてインスペクターでPMD->PrefabとVMD->Animationが出来たらいいなー、と思ってあれこれ弄って詰まったのでその話を。

 

Unity拡張ってどうやんねん!という話はしないので、http://www.slideshare.net/lucifuges/extending-the-unity-editor とかみてください。ほぼすべてなんでも出来るようになるので、ここ設定するのに使いづらいなーというポイントがあれば、改善できる可能性があります。
試しにやってみましょう。

本題です。まず必要なのは、Projectウィンドウで選択されたものをInspectorウィンドウに表示する方法です。

通常のInspector拡張であれば、

[CustomEditor(typeof(MyScript))]
public class MyScriptEditor : Editor
{
  public override void OnInspectorGUI()
  {
    EditorGUILayout.LabelField("Its MyScript");
  }
}

というような感じでできます。

 

このときのCustomEditor属性の第一引数に適当なクラス型を入れることで、そのクラス型に対する拡張になります。この場合は、MyScriptというクラス専用のエディタ拡張になります。
(実際に試していないのですが、)MyScriptを適当なオブジェクトにくっつけてやると、MyScriptEditorのインスタンスが勝手に生成されて、Inspectorには"Its MyScript"というラベルが表示されているはずです。

で、これを、Projectウィンドウにどう引っ掛けるか。
色々試した結果、typeof(UnityEngine.Object)を指定すればいいようです。
但し、これは全てのアセットを対象に出来ないようで、Unity側でInspectorが用意されていないもの、が該当になります。
(例えば、認識されない拡張子、*.unityファイル(シーンを保存したもの)、フォルダ、など)

CustomEditor属性の第二引数にtrueを指定することで、そのクラスを継承した子クラスにも適用されるらしいですが、その指定をしてもMaterialだったりTextureだったりには設定出来ませんでした。

 

さて、[CustomEditor(typeof(Object))] と指定すれば引っ掛けられることがわかったので、後はPMDLoaderWindow.csに含まれるGUI部分を移すだけで出来ました。

 

が!! 問題はここから。
別のファイルに分けたほうがよさそうなのでVMD用InspectorをPMD用Inspectorからコピーして作ったところ、VMD用Inspectorが動作しないじゃありませんか。

コンストラクタでDebug.Logをするように書いてもVMD用Inspectorのインスタンスが作られる雰囲気もないので、うーん。
推測として、CustomEditor属性の挙動が、最初に読み込まれた(実行された)方が優先されて、どうこう、みたいな。

MMD for Unityの中に閉じた問題なら、InspectorBaseみたいなものを作って、そこからPMDorVMDに振り分ければいいと思います。ですが、もし他のエディタ拡張スクリプトを導入なり自作なりで、そちらでも同様に[CustomEditor(typeof(Object))]が行われていた場合を考えるとぐぬぬ。

 

Editorを継承すると、"target"という変数が使えるようになるのですが、Unityに認識されない拡張子またはフォルダの時に、これに入ってくる値の型が、UnityEngine.DefaultAsset という内部型みたいです。
グーグル大先生に聞いてもなにひとつそれっぽい答えがでてこなかったので、それが分かっても問題解決への鍵にはなりませんでした。

 

某所になんかいい方法ないですかと質問を投げたのですが、「そもそもの話、そんなことしようとする人口数~w」という気がするのでうーん。諦める方向ですかねー…

あ、カスタムインポータを書いて、UnityにPMDが放り込まれたら自動的に読み込むというのもアリ...?
どちらにせよ、現状で特につらぽよポイントは無さそうなので、それが出来なくても、あ、はい、程度な気がしますね。

 

参考URLとか:

  • http://docs.unity3d.com/Documentation/Components/gui-ExtendingEditor.html
  • http://docs.unity3d.com/Documentation/ScriptReference/CustomEditor.CustomEditor.html
  • http://answers.unity3d.com/questions/11680/how-can-i-make-a-custom-inspector-for-this-object.html
  • http://forum.unity3d.com/threads/101654-Showing-Unknown-Extensions-in-the-Inspector

 
 

そうだそうだ、「Materials」「Materials 1」「Materials 2」「Materials 3」....と増え続けていくバグは直ったので、r143でコミットしました。

Unite Japan 2013のまと

この記事は公開されてから1年以上経過しており、情報が古い可能性があります。

量が長すぎるので、この1記事で簡単にまとめます。

Day1

  • ◆ 基調講演
    ゲーム開発はインディーズにもやさしくなってきている。
  • ◆ "Unity for Wii-U"とWii-Uでのゲーム開発
    WiiU向けゲームをUnityで作れます ※ただし法人に限る
  • ◆ Nintendo Web Framework のご紹介
    既存Web技術でWiiU向けゲームを作れます ※ただし法人に限る
  • ◆ シリアライズ徹底解説
    ScriptableObject!ScriptableObject!
  • ◆ Editorスクリプティング入門
    エディタ拡張楽しいですし、ゲーム開発する上で必要になるのでやりましょう
  • ◆ Androidでコンテンツを守る方法 -Unity,Androidでのプログラムとデータの暗号化、およびハッキング対策-
    重要データは自分(開発者)自身で暗号化・難読化を施して守ること。
  • ◆ モバイル向けShuriken活用法
    EmitSharpは使わない!Speedも使わない!現実を見よう!

Day2

  • ◆ Mecanim徹底解説 & 最新機能アップデート
    アニメーションすごいので使いましょう
  • ◆ Unityでのメモリープロファイリング
    OnGUIはダメ、Disposeしろ、オブジェクトプールしろ
  • ◆ 2Dコンテンツのためのワークフロー
    最高に使いやすいツールを使おう。
  • ◆ iPhoneでリアルタイムマルチプレイを実現!
    PhotonCloudは無料枠あるので試しにやってみて。
  • ◆ AssetStoreマニアクス2nd
    高速な開発に必要なスクリプトセットだったり高機能なエディタだったり色々あります
  • ◆ 自動車と飛行機は何が違うのか? ~コンシューマーゲーム開発者から見た Unity~
    ワークフローの違いがあるので、そこを考えずに自社エンジンやらからUnityに移るとしぬ

いやはや、Unite2013参加してよかったです。
Unityにがっつりと触っている人ではないですけど、そんなことできたんだ、そんなテクニックがあるんだ、などなど新しい発見が多くありました。

ここで得た知見はぜひとも MikuMikuDance for Unity での活用や、個人でちらほらやるときに活用したいです。
例えば Mecanim のアニメーションはとても強力ですし、Unity4時代のキャラアニメーションはあれが主力になっているんじゃないですかね。これは必ずMFUに導入したいです。現状がどうなっていたか、ここ最近触っていなかったのでわかりませんが、対応が微妙だったような...
他にもエディタ拡張。現在別ツールになっているIKBakerをUnityに内蔵したり、PMD/VMDのインポータをかっこよくしたり、というのもありですよね。あとFBXファイルなどのように、そのファイルを選択するとInspectorからプレファブにできたりというのもできると良さそうです。

これからUnity触るのが楽しみすぎる!