Script_Top - OPTPiX/IndexColorShaderForUnity GitHub Wiki
IndexColorShader for Unity(以降「ICS」)のスクリプト機能群を解説します。
原則として、ICSのランタイム機能の中核クラス(Library_IndexColorShader.Data.ControlMaterialPalette)を、MonoBehaviourを継承したクラスで所有し・呼び出すことで運用します。
実装上の扱い方としては、下記のファイルがサンプルになります。
- Assets/IndexColorShader/Script/Script_IndexColorShader_SpritePalette.cs
※本クラスは、サンプルとしてだけでなく、ICSを描画する単体のスクリプトとしても使用可能です。
ICS機能の中核クラスを使用するための、最小コードは下記になります。
※下記コードの前提は下記になります。
- DataPaletteは、インスペクタから設定されます。
- このスクリプトが付与されるGameObjectに、MeshFilterが付いており、MeshFilterのメッシュにはQuadが設定されています。
- このスクリプトが付与されるGameObjectに、MeshRendererが付いており、MeshRendererにはICSでのテクスチャーのインポート時に作成されたマテリアルが設定されています。
public class FooBar : MonoBehaviour
{
public Script_IndexColorShader_Palette DataPalette;
private Library_IndexColorShader.Data.ControlMaterialPalette ControlMaterial = null;
void Start()
{
ControlMaterial = new Library_IndexColorShader.Data.ControlMaterialPalette ControlMaterial();
ControlMaterial.BootUp();
}
void Update()
{
ControlMaterial.Update( GetComponent<MeshRenderer>();,
DataPalette.Color,
Color.white,
Library_IndexColorShader.Data.ControlMaterialPalette.KindInterpolation.NONE,
null,
null
);
}
}
実装として、Startで記載されている処理は(Startを実装せずに)Updateなどで行った方が効率が良い場合もあります(例えば、サンプルの役割も兼ねている「Script_IndexColorShader_SpritePalette」クラスでは、ControlMaterialのnewはUpdateで行われています)。
また、上記のControlMaterial.Updateの呼び出しは、LateUpdateで行っても構いません(Unityのレンダリング処理の前までに行われていれば問題はありません)。
上記のコードの亜形として、上記のStartとUpdateの処理を「各GameObject毎にスクリプトを付与して行う」のではなく、「どこか1つのGameObjectでまとめて行う」というような処理も可能です(そして、大量のオブジェクトを扱う場合、この方法の方が実行効率が良いことでも知られています)。
それらの実行コードの例は、下記のような形になります。
※下記コードの前提は下記になります。
- DataPaletteは、(とりあえず)統一した値を適用するものとしています。
- TableGameObjectは、インスペクタから登録されているものとします。
- それぞれの描画を担当するGameObject(TableGameObjectに登録されるGameObject群)には、ICSを操作するためのスクリプトは付けないものとします。
- それぞれの描画を担当するGameObjectには、MeshFilterが付いており、MeshFilterのメッシュにはQuadが設定されています。
- それぞれの描画を担当するGameObjectには、MeshRendererが付いており、MeshRendererにはICSでのテクスチャーのインポート時に作成されたマテリアルが設定されています。
public class Integrated_FooBar : MonoBehaviour
{
public Script_IndexColorShader_Palette DataPalette;
public GameObject[] TableGameObject;
private Renderer[] TableRenderer;
private Library_IndexColorShader.Data.ControlMaterialPalette[] TableControlMaterial = null;
void Start()
{
int count = TableGameObject.Length;
TableRenderer = new Renderer[count];
TableControlMaterial = new Library_IndexColorShader.Data.ControlMaterialPalette[count]:
for(int i=0; i<count; i++)
{
TableRenderer[i] = TableGameObject[i].GetComponent<MeshRenderer>();
TableControlMaterial[i] = new Library_IndexColorShader.Data.ControlMaterialPalette();
TableControlMaterial[i].BootUp();
}
}
void Update()
{
for(int i=0; i<count; i++)
{
TableControlMaterial[i].Update( TableRenderer[i],
DataPalette.Color,
Color.white,
Library_IndexColorShader.Data.ControlMaterialPalette.KindInterpolation.NONE,
null,
null
);
}
}
}
上記は、あくまで最小手のサンプルで、これらで行われている基本処理を応用して、独自の処理を追加したりする(例えばリアルタイムでパレットを変更するような処理など)ことで、ICSを使用して様々な画像効果を得ることも可能です。
ICSのランタイムの機能は、下記のクラスに実装されています。
-
インポート時に作成される、パレットデータを格納している「Script_IndexColorShader_Palette」クラス(Assets/IndexColorShader/Script/Script_IndexColorShader_Palette.cs)の内容は、直接変更しないでください。
本クラスはScriptableObjectであるため、変更するとプロジェクト全体に影響を及ぼします。特に、パレットを変更するような処理を組んだ場合に、Script_IndexColorShader_Palette.Colorの配列を書き換えたりしてしまうミスはやりがちです。 そういった場合、先にScript_IndexColorShader_Palette.Colorの内容を、処理を行うクラス内に複製するなどしてバッファ(ワークエリア)として設置し、そのバッファを書き換えて・ICSのUpdateに与えるようにしてください。