読者です 読者をやめる 読者になる 読者になる

SuiTechLog

Unity,Arduino,RaspberryPiなど、モノづくり系を気ままに書き残すブログ。

Unity Editor拡張 複数のオブジェクトからメッシュレンダラーをもったやつだけ選択したい!

事の経緯。

 空のゲームオブジェクトなども含まれた複雑な親子構造のFBXを読み込んで

meshrendererコンポーネントのもつプロパティ(cast Shadowsの設定など)をまとめて編集(multi-edit)したい。というお話。

 

で、普通にHierarchyからShiftおしながらまとめて選択すると、だいたいこうなります。

f:id:sui332015:20170528162646j:plain

 書いてある通りなんですが、meshrendererコンポーネントを持っていないオブジェクトも選択にまざっているので、multi-editできないよ。とのこと。当然空のゲームオブジェクトだったり、ボーンだったりmeshrenderer持ってないのも選択に混ざっちゃいますよね。

 

 手動で膨大な親子構造からmeshrendererをもつオブジェクトだけを選択するのはアホらしいので、Editorスクリプト作ってみました。そもそもヒューマンエラーがでそうですし。 

複数のオブジェクトからメッシュレンダラーをもったやつだけ選択するスクリプト

はい。ようやく本題。スクリプトは以下です。 


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor; // エディタ拡張関連はUnityEditor名前空間に定義されているのでusingしておく。


public class UtilityTool : EditorWindow
{
    // メニューにSuisanTool項目を追加。
    [MenuItem("SuisanTool/Utility Tools")]
    static void Open()
    {
        EditorWindow.GetWindow("Utility Tools");
    }

    //
    //再起関数。子供を取得
    //
    void GetChildren(GameObject obj, ref List allChildren)
    {
        Transform children = obj.GetComponentInChildren();
        //子要素がいなければ終了
        if (children.childCount == 0)
        {
            return;
        }
        //子要素がいるなら、リストに追加して、さらに再起する
        foreach (Transform ob in children)
        {
            if (ob.GetComponent() != null)
            {
                allChildren.Add(ob.gameObject);
            }
            GetChildren(ob.gameObject, ref allChildren);
        }
    }

    //
    //全ての子供を取得する関数
    //
    List GetAllChildren(GameObject in_object)
    {
        List allChildren = new List();
        GetChildren(in_object, ref allChildren);
        return allChildren;
    }

    void OnGUI()
    {
        //
        // MeshRendererをもった子オブジェクトを選択ツール
        //
        EditorGUILayout.LabelField("Select Children which have Mesh renderer");
        if (GUILayout.Button("Select"))
        {
            foreach (GameObject go in Selection.gameObjects)
            {
                List listmesh = GetAllChildren(go);
                Selection.activeGameObject = null;
                Selection.objects = listmesh.ToArray();
            }
        }
    }
}

 

これを、Asset以下にEditorフォルダを作ってそこにcsファイルとしておいてください。

 

使い方

1.Asset以下のEditorフォルダにスクリプトをおいておくと、自動的に上部メニューバーにSuisanToolが追加されます。

 

2.クリックしてUtilityToolを実行すると、ボタンのついたウインドウが立ち上がります。

 

3.以下のように、Hierarchyビューから、実行したいプレハブなどのオブジェクトルートをひとつ選択します。この場合はEngineGroupという親を選択しています。

f:id:sui332015:20170528164058j:plain

 

4.ツールの、Selectボタンを押します。すると、以下のように、選択以下にあるオブジェクトからMeshRendererをもつオブジェクトだけを選択してくれます。

f:id:sui332015:20170528164158j:plain

 

そして、Inspectorをご覧ください。

f:id:sui332015:20170528162641j:plain

 はい。幸せになりましたね。

Cast Shadowsとか、ReceiveShadowsとか、まとめて編集しちゃいましょう。

 

 おまけ

 

 ちなみに再起関数のところで、

if (ob.GetComponent<MeshRenderer>() != null)


ってやってるので、"MeshRenderer"のところを見つけたいコンポーネントクラス名に書き換えれば、

(たとえばSkinned Mesh Renderer とか!)

もっと汎用的な幸せが訪れると思いますよ

 

こういう機能、Unity標準でないんですかね

 

13B-REWエンジン ターボ制御をCGでつくる 本物とくらべてみる

ターボチャージャーが手に入った!

 なんと、都合よくジャンクのFD3Sのシーケンシャルツインターボチャージャー本体が手に入ったので作ったCGと本物とを比べてみることにしました。

 WEBアプリケーションはこちら

f:id:sui332015:20170506210833j:plain

 今回手に入ったのは上の図で青く塗られた部分です。

続きを読む

13B-REWエンジン ターボ制御をCGでつくる 制作のながれ

経緯

 RX-7専門のECU改良会社、中村屋の中村さんからの依頼でRX-7 FD3Sの「ターボ装置」のCGアニメーションモデルを制作しました。

整備士の育成に使う目的とのことで、博物館や科学館などにある動く図を意識しつつ、正確さを意識しました。

f:id:sui332015:20170506113010g:plain

今回は、GIFで納品だったのですが、ここはUnity使いとしてはWEBでも自由に動かせるようにしたい!という思いがあり3Dに起こしています。

WEBアプリケーションはこちら

IEはダメです。

続きを読む

Unity キャプチャ処理とかで、固定フレームレートで動かしたい!

固定フレームレートのトラップ

 Unityでゲームビューを30fpsでPNG連番キャプチャする処理を書いたときにひっかかったことをメモっておきます。30fpsなので、Application.targetFrameRate=30にしていたのですが、キャプチャ後の連番動画を再生したところ、どうも早回ししているようなおかしい動画ができあがってしまいました。

続きを読む

13B-REWエンジン ターボ制御をCGでつくる

 依頼(と趣味)で、マツダRX7に搭載されている13B-REWエンジンのターボ制御をCG化することになりました。

作業をはじめる前に、整備書に乗っている図面をみてターボ制御を理解。これ、理解するのもですが、図示するのさえ難しい。

 

 そして、今の構想だとUVアニメーションによるギミックがいっぱいあるので、それをどうやってUnityに持ち込むか検討中です。なにかいい方法あるでしょうか。

 

続きを読む

Unity Editor拡張とデータ保存

変数の保存

 Editor拡張スクリプトや、Editorの中で変数データを簡易的に保存、取得するには以下の方法があります。

//変数を保存する
EditorUserSettings.SetConfigValue (キー文字列, 保存する値);
//変数を取得する
値=EditorUserSettings.GetConfigValue (キー文字列);

続きを読む

Unity Editor拡張で色々遊んでみる

今回は、前々回の記事で少しだけでてきましたEditor拡張について少しかいてみます。

Editor拡張とは

 UnityEditor内のみで動く(プレイヤーではなく、作り手側の使う)スクリプトを作って、UIや機能を改造、処理を自動化していくことを言うようです。

 たとえば、ボタンを押したら外部のテキストファイルを読みにいって、そこにリストされたFBXファイルのパスから、FBXファイルをプロジェクトに自動コピー、インポート設定をして、インポート。とか

インポートしたときに自動でマテリアル設定をしてみたり・・・などなど便利になる機能が色々と考えられます。

 Editor拡張のキモになる部分は、UnityEditorのGUI上で行う操作をスクリプトで呼べることです。それとC#で使える処理や、ウィンドウズ標準の機能などを組み合わせることで便利な自動化を実現できます。

 

続きを読む

Unity テクスチャのちょっとだけ便利話

今日はテクスチャのちょっとだけ便利話です。

 

 Unityでは読み込むFBXファイルと同階層にTexturesというフォルダを作ってテクスチャをいれておくと、FBXインポート時にそこを見に行って自動的にAlbedoにテクスチャを繋いでくれるという機能があったりします。(新規に読み込む場合のみ)

続きを読む

Unity で Import設定をインポートしたときに変更する。

 モデルやテクスチャ、オーディオデータをインポートするとき、かならず決まった処理をすることはありませんか。

たとえば・・・。

f:id:sui332015:20170207010144p:plain

Model項目だったら、Scale Factorを10にしておきたいとか、Materialsの設定を読み込み時点で切り替えておきたいとか

Animation項目で言うと、key reduction(キー削減)をいちいちoffにしたりとか。(これは良くあります)

 

続きを読む