こんにちはkayanuma.です。
UNITY5ではそれまでPro版しか使えなかった機能が無料(*使用条件あり)のPersonl版で使えるようになりました。
なので個人的に使っているUNITYをバージョンアップしてみました。
被写界深度などのポストエフェクトなどうれしくてつい使いまくってしまいますが、 地味だけど大きな変更があったのは標準シェーダーといえるかも。
これまでは マテリアルを普通に作るとDiffuseがアタッチされたものが生成されましたが このバージョンでは 何気に物理シェーダになってます。
実は僕がちょこちょこ使っている3D-Coatも今年のバージョンアップで物理ペインティング対応になってまして、 そんなUNITYへの出力も比較的滞りなくできます。
今回はこれでお茶を濁そうと思ったのですが3行ぐらいで終わってしまうのでそれはやめて UNITYのマテリアルを少しいじることにしました。
標準シェーダーの基本的な使い方は 表現したい素材のパラメーターをテクスチャで表現します。 画像なので一つのマテリアル内で複数の素材を自在に表現できます。
これはこれで便利ですが、素材感を決定する数値、すなわちAlbedo,Metallic,Smoothnessなど
その範囲内ではほぼフラットな値なのでこれをテクスチャで持つのはもったいないなあ・・と考えがよぎり
マテリアルをドロップダウンで簡単に設定できるツールを作ってみました。
といってもたいそうなものではなく↓で示されているようなパラメータをプリセットでいくつか持つだけです。 http://docs.unity3d.com/jp/current/Manual/StandardShaderMetallicVsSpecular.html
テクスチャでパラメータを持つ代わりにただの値なのでマテリアル全体で均一な質感です。
内容的には標準シェーダー+エディター拡張となります。
ドロップダウンリストにはゴムや銅などの素材が並んでいて それを選ぶと登録してあるパラメーターをマテリアルに渡します。
マテリアルにはあらかじめ標準シェーダーを充てています。
スクリプトからマテリアルに渡す値は
・素材の色 (RGB)
・金属か否か (0、1の概ねどちらか)
・表面の粗さ(0~1の値)
だけです。
Albedoの数値は UNITY用のメタリック・スペキュラーのチャートが公開されているので ここから値を使わせていただきました。
http://docs.unity3d.com/jp/current/Manual/StandardShaderMaterialCharts.html
画像からスポイトで数値を取り出しただけなので厳密な値じゃあないかもしれません。
なお金属もAlbedoに色を付ける方式にしました。
表面の粗さ、は同じ素材でも状態によって変化するものですが、 リストから選ぶだけというコンセプトなのでそれらしい値を付けてしまいます。
気になるオクルージョンや法線は標準シェーダーなので付けたければ付けられます。という扱い。
無くてもエラーにはならないみたいなので。
簡単なスクリプトで期待してなかったのですがすが、使ってみると案外面白いです。
細かな質感調整はできないし、 素材の種類数だけマテリアルが必要になりますが、 手っ取り早く素材変更して確認が出来ることを生かして
キャラクターのしているアクセサリーの素材をすばやく変更して比較検討してみるときなどに使えるかもです。
レベル作成の構想段階なんかにもいいかもしれません。
素材指定が番号指定などでできることを生かしてメモリや通信に制限のあるスマートフォン向けにありかもしれないなあとおもったりしてます。
マテリアルの付いたオブジェクトに張り付けるスクリプト
素材を指定する番号を保持するだけ
MaterialSelect.cs
using UnityEngine; using System.Collections; public class MaterialSelect : MonoBehaviour { public int Type; }
Assets/Edit以下に置いておく拡張部分
MaterialEditGUI.cs
using UnityEngine; using System.Collections; using UnityEditor; [CustomEditor(typeof(MaterialSelect))] public class MaterialEditGUI : Editor { private static readonly string[] Types = { "Coal","Rubber","Mud","Grass","Brick","Wood","Concrete", "Gold", "Brass", "Copper", "Iron","Platinum","Aluminium","Silver" }; private static readonly Color[] Albedo= new Color[14] { new Color(0.196f,0.196f,0.196f,1), new Color(0.208f,0.208f,0.208f,1), new Color(0.333f,0.239f,0.192f,1), new Color(0.482f,0.510f,0.306f,1), new Color(0.580f,0.490f,0.459f,1), new Color(0.667f,0.600f,0.518f,1), new Color(0.753f,0.749f,0.733f,1), new Color(0.961f,0.843f,0.475f,1), new Color(0.980f,0.902f,0.588f,1), new Color(0.980f,0.745f,0.627f,1), new Color(0.769f,0.780f,0.780f,1), new Color(0.835f,0.816f,0.784f,1), new Color(0.961f,0.965f,0.965f,1), new Color(0.988f,0.980f,0.961f,1), }; private static readonly float[] Metal = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, }; private static readonly float[] Smooth = { 0.0f, 0.335f, 0.176f, 0.2f, 0.268f, 0.122f, 0.0f, 0.667f, 0.8f, 0.621f, 0.377f, 0.74f, 0.642f, 0.458f, }; public override void OnInspectorGUI() { MaterialSelect obj = target as MaterialSelect; obj.Type = EditorGUILayout.Popup("材質", obj.Type, Types); obj.GetComponent().sharedMaterial.color = Albedo[obj.Type];// obj.color; obj.GetComponent().sharedMaterial.SetFloat("_Metallic", Metal[obj.Type]); obj.GetComponent().sharedMaterial.SetFloat("_Glossiness", Smooth[obj.Type]); EditorUtility.SetDirty(obj); } }
忘れてた。ちなみに
照明用にSKYマップが必要になりますが、iPhoneのパノラマモードなどで景色を撮って
パノラマからSKYマップ作成ができる便利なアセットも紹介します。(UNITYアセットストア)
https://www.assetstore.unity3d.com/jp/#!/content/13616
では