夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Unityでワイヤフレーム表示に対応する新しいメッシュを作る その① Editor拡張

本日はUnity枠です。

UnityではAndorido、WindowsiOS、Switchなど様々なプラットフォームに対応しています。

 これによって同一のツールで様々なプラットフォームに向けてアプリケーションを展開できる反面、弊害として先日見たようにプラットフォームによって挙動が異なることがあります。

 一例としてiOSプラットフォームではグラフィックスAPIがMetalに固定されるため、ジオメトリシェーダーが使用できず、ワイヤフレーム表現がシェーダー単体で実装できませんでした。

 今回はアプローチを変えてワイヤフレーム表示対応の新しいメッシュを作ります。

〇環境

・Windows11PC

・Unity2022.3.21f1

〇ワイヤフレームのアプローチ

 今回はUVと画像(テクスチャ)を用いてワイヤフレーム表示を実装していきます。

 具体的にはオブジェクトを構成するすべてのメッシュについて同じUVを持つ新しいメッシュを作成し、対応する画像を使用するというものです。

 具体的にはポリゴンの頂点ごとのUVを(0,0)、(0,1)、(1,0)に設定することです。

〇UnityEditor拡張での実装

今回はエディタ実行中ではなくEditor拡張で実装します。

ウィンドウを表示させるコードは次のようになります。

    //Unirtのエディタ拡張で上部GameObjectメニューにコマンドを追加
    public class OpenWindow : Editor
    {
        [MenuItem("Window/MeshToChangeWireframe")]
        static void GameControlMenu()
        {
            EditorWindow.GetWindow<ObjectChangeWireframe>("ObjectChangeWireFrame");
        }

    }
    public class ObjectChangeWireframe : EditorWindow
    {
             
        void OnGUI()
        {
        }
    }

これによってエディタ上部のWindowメニューにウィンドウ起動のコマンドが表示されます。

次にボタンと変換するゲームオブジェクトを定義するフィールドを定義します。

コードとしては次のようになります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

namespace HoloMoto.Utils
{
    //Unirtのエディタ拡張で上部GameObjectメニューにコマンドを追加
    public class OpenWindow : Editor
    {
        [MenuItem("Window/MeshToChangeWireframe")]
        static void GameControlMenu()
        {
            EditorWindow.GetWindow<ObjectChangeWireframe>("ObjectChangeWireFrame");
        }

    }
    public class ObjectChangeWireframe : EditorWindow
    {
        public Material mat;
        public GameObject obj;
     
        
        void OnGUI()
        {
            //discriptionテキストを表示
            //システム言語が日本語の場合と英語の場合でif文で処理を分岐
            if (Application.systemLanguage == SystemLanguage.Japanese)
            {
                GUILayout.Label("ワイヤフレームにしたいオブジェクトを設定(新しいインスタンスを作成します。)", EditorStyles.boldLabel);
            }
            else
            GUILayout.Label("Select Mesh Object and Wireframe Material", EditorStyles.boldLabel);
            //スペースを配置
            EditorGUILayout.Space();
            
            
            //meshオブジェクトをアタッチするGUI
            GUILayout.Label("Mesh Object", EditorStyles.boldLabel);
            obj = (GameObject)EditorGUILayout.ObjectField("Mesh Object", obj, typeof(GameObject), true);
            //マテリアルをアタッチするGUI
            GUILayout.Label("Wireframe Material", EditorStyles.boldLabel);
            mat = (Material)EditorGUILayout.ObjectField("Material",mat,typeof(Material));
            //matの初期値は同ディレクトリにあるマテリアルを使用
            if (mat == null)
            {
                mat = AssetDatabase.LoadAssetAtPath<Material>("Assets/HoloMoto/Utils/Wireframe.mat");
            }           
            //実行するボタンを表示
            if (GUILayout.Button("ChangeWireframe"))
            {
                  CreateNewWireframeMeshObject();
            }
        }

        public void CreateNewWireframeMeshObject()
        {
           
        }
    }
}

ここではオブジェクトを格納するフィールドとボタンおよびボタンが押された際実行される処理を定義しています。

redhologerbera.hatenablog.com

このコードによって次のようにGUIが構築されます。

以上でGUIが完成し、objを使用することでメッシュを取得することができます。

続きはまた明日行います。