サンマプログラミング

ゲームプログラマーとして主にUnity&UnrealEngineについての記事を掲載させてもらいます。時々DirectXとか・・・どうぞ見てらえれば幸いです。

UnityのMaterialの拡張メソッドクラスでのColor変更のShader対応についてのあれこれ

今回の拡張メソッドMaterial型のカラーについてのものです。

拡張の理由としては毎回newで宣言し数値を挿入するといったコードを書く手間を省くということもあります。自分がゲームを制作していた過程でMaterial型を拡張する機会があったので、記事にしてみました。

 まずそのオブジェクトのMaterialへアクセスする方法としては

 renderer.materials[参照したい配列番号]( Unity5ではできなかった)

と思っていたのですがUnity5からかわからないですがrendererは使用しないでくださいとでていたので、

 gameObject.GetComponent<Renderer>().materials[参照したい配列番号]

こちらだと大丈夫でした。

参照した配列番号の確認は 

f:id:SirasuSanma:20150323191727p:plain

普段はMaterialsは隠れてるので▼クリックで中が開くのでElementの番号でそのMaterialに参照できます。

 

さぁ~続いてはColorへのアクセスです。内蔵シェーダーへのカラーアクセスです。

public static void SetColorRGB(this Material material, float color_r, float color_g, float color_b)
{
material.color = new Color(color_r, color_g, color_b, material.color.a);
}

Transform型と同じような形でアクセスすることができます。このように拡張すれば

gameObject.GetComponent<Renderer>().materials[0].SetColorRGB(0,0,0)

といった感じでメソッドを使用することができます。

 

そしてこちらが内蔵シェーダー以外&自作シェーダーでのカラー型へのアクセス方法です。

material.SetColor(変数名, r,g,b,a)

これでアクセスすることができます。ぱっと見では下の赤い丸の部分だと思ってしまうのですが、

f:id:SirasuSanma:20150323191740p:plain

Shaderの変数のアクセスなので歯車のアイコンをクリックしEdit Shaderをクリック

f:id:SirasuSanma:20150323191752p:plain

するとエディタか内蔵シェーダーだと下のような画像がでるので確認できます。だいたい _変数名 なので変数名の前に_をつけてればokだと思います。

f:id:SirasuSanma:20150323191859p:plain

そして自分的には上でrendererへ参照が長くなってしまったのでGameObjectも拡張したほうがいいと思いました。そして現在使用している拡張クラスのソースです。

/// <summary>
/// Material 型の拡張メソッドを管理するクラス
/// </summary>
public static class MaterialExtensions
{
/// <summary>
/// カラーRGBA値を設定します
/// </summary>
/// <param name="material"></param>
/// <param name="color_r">カラーR値</param>
/// <param name="color_g">カラーG値</param>
/// <param name="color_b">カラーB値</param>
/// <param name="color_a">アルファ値</param>
public static void SetColor(this Material material, float color_r, float color_g, float color_b, float color_a)
{
material.color = new Color(color_r, color_g, color_b, color_a);
}

/// <summary>
/// カラーRGB値を設定します
/// </summary>
/// <param name="material"></param>
/// <param name="color_r">カラーR値</param>
/// <param name="color_g">カラーG値</param>
/// <param name="color_b">カラーB値</param>
public static void SetColorRGB(this Material material, float color_r, float color_g, float color_b)
{
material.color = new Color(color_r, color_g, color_b, material.color.a);
}

/// <summary>
/// カラーR値を設定します
/// </summary>
/// <param name="material"></param>
/// <param name="color_r">カラーR値</param>
public static void SetColorR(this Material material, float color_r)
{
material.color = new Color(color_r, material.color.g, material.color.b, material.color.a);
}

/// <summary>
/// カラーG値を設定します
/// </summary>
/// <param name="material"></param>
/// <param name="color_g">カラーG値</param>
public static void SetColorG(this Material material, float color_g)
{
material.color = new Color(material.color.r, color_g, material.color.b, material.color.a);
}

/// <summary>
/// カラーB値を設定します
/// </summary>
/// <param name="material"></param>
/// <param name="color_b">カラーB値</param>
public static void SetColorB(this Material material, float color_b)
{
material.color = new Color(material.color.r, material.color.g, color_b, material.color.a);
}

/// <summary>
/// アルファ値を設定します
/// </summary>
/// <param name="material"></param>
/// <param name="alpha">アルファ値</param>
public static void SetColorA(this Material material, float alpha)
{
material.color = new Color(material.color.r, material.color.g, material.color.b, alpha);
}

/// <summary>
/// アルファ値に数値加算
/// </summary>
/// <param name="material"></param>
/// <param name="alpha_value">カラーA値加算値</param>
public static void AddColorA(this Material material, float alpha_value)
{
material.color = new Color(material.color.r, material.color.g, material.color.b, material.color.a + alpha_value);
}

/// <summary>
/// Shader対応のMaterialColorのR値変更関数
/// </summary>
/// <param name="material">自分自身のマテリアル</param>
/// <param name="_InputName">シェーダー変数名</param>
/// <param name="_Red">Red値</param>
public static void SetShaderColorR(this Material material, string _InputName, float _Red)
{
material.SetColor(_InputName, new Color(_Red, material.GetColor(_InputName).g
, material.GetColor(_InputName).b, material.GetColor(_InputName).a));
}

/// <summary>
/// Shader対応のMaterialColorのG値変更関数
/// </summary>
/// <param name="material">自分自身のマテリアル</param>
/// <param name="_InputName">シェーダー変数名</param>
/// <param name="_Green">Green値</param>
public static void SetShaderColorG(this Material material, string _InputName, float _Green)
{
material.SetColor(_InputName, new Color(material.GetColor(_InputName).r, _Green
, material.GetColor(_InputName).b, material.GetColor(_InputName).a));
}

/// <summary>
/// Shader対応のMaterialColorのB値変更関数
/// </summary>
/// <param name="material">自分自身のマテリアル</param>
/// <param name="_InputName">シェーダー変数名</param>
/// <param name="_Blue">Blue値</param>
public static void SetShaderColorB(this Material material, string _InputName, float _Blue)
{
material.SetColor(_InputName, new Color(material.GetColor(_InputName).r, material.GetColor(_InputName).g
, _Blue, material.GetColor(_InputName).a));
}

/// <summary>
/// Shader対応のMaterialColorのAlpha値変更関数
/// </summary>
/// <param name="material">変更したいマテリアル</param>
/// <param name="_InputName">シェーダー変数名</param>
/// <param name="_Alpha">Alpha値</param>
public static void SetShaderColorA(this Material material, string _InputName, float _Alpha)
{
material.SetColor(_InputName, new Color(material.GetColor(_InputName).r, material.GetColor(_InputName).g
, material.GetColor(_InputName).b, _Alpha));
}
}