using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor;
#endif
[RequireComponent(typeof(MeshRenderer))]
[RequireComponent(typeof(Image))]
public class ImageAnim : MonoBehaviour
[System.Serializable]
public class Data
public string name;
public string type;
public bool enable;
public List<Data> Property = new List<Data>();
private Image m_Image;
private Material m_ImageMat;
private MeshRenderer m_MeshRenderer;
private MaterialPropertyBlock m_MaterialPropertyBlock;
private void Awake()
m_MeshRenderer = GetComponent<MeshRenderer>();
m_MaterialPropertyBlock = new MaterialPropertyBlock();
m_Image = GetComponent<Image>();
m_ImageMat = Instantiate(m_Image.material);
m_Image.material = m_ImageMat;
private void LateUpdate()
if (m_MeshRenderer.HasPropertyBlock())
m_MeshRenderer.GetPropertyBlock(m_MaterialPropertyBlock);
foreach (var item in Property)
if (item.enable)
SetValue(item.name, item.type);
void SetValue (string name, string type)
switch (type)
case "Color":
m_Image.color = m_MaterialPropertyBlock.GetColor(name);
break;
case "Float":
case "Range":
m_Image.material.SetFloat(name,m_MaterialPropertyBlock.GetFloat(name));
break;
case "Vector":
m_Image.material.SetVector(name, m_MaterialPropertyBlock.GetVector(name));
break;
default:
break;
#if UNITY_EDITOR
[CustomEditor(typeof(ImageAnim))]
public class MyTestEditor : Editor
ImageAnim myTest;
MeshRenderer meshrenderer;
private void OnEnable()
myTest = (target as ImageAnim);
meshrenderer = myTest.GetComponent<MeshRenderer>();
public override void OnInspectorGUI()
base.OnInspectorGUI();
if (GUILayout.Button("refresh"))
myTest.Property = new List<ImageAnim.Data>();
Shader shader = meshrenderer.sharedMaterial.shader;
int count = shader.GetPropertyCount();
for (int i = 0; i < count; i++)
myTest.Property.Add(new ImageAnim.Data() { name = shader.GetPropertyName(i), type = shader.GetPropertyType(i).ToString() });
#endif