5

Unity3D研究院之Image组件K特殊材质动画的一种方法(一百二十八)

 2 years ago
source link: https://www.xuanyusong.com/archives/4881
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之Image组件K特殊材质动画的一种方法(一百二十八)

Unity3D研究院之Image组件K特殊材质动画的一种方法(一百二十八)

有段时间没写东西了,最近有点小累啊。最近美术在K动画反映的问题,如果Image组件挂了新材质后,无法在Image上K材质中的效果。

Unity3D研究院之Image组件K特殊材质动画的一种方法(一百二十八) - 雨松MOMO程序研究院 - 1
使用MeshRenderer组件是可以K的,这里简单的给Image材质拓展了一个置灰的效果。如下图所示,MeshRenderer组件就可K材质动画。

Unity3D研究院之Image组件K特殊材质动画的一种方法(一百二十八) - 雨松MOMO程序研究院 - 2

所以我觉得,如果给Image组件同时在绑定MeshRenderer组件。动效师给MeshRenderer组件K动画,在Update中实时将数据同步给Image就可以了。如下图所示,脚本通过读取Image的材质取出所有属性,因为Update不需要将所有数据都同步,这里需要勾选那些数据进行同步。

Unity3D研究院之Image组件K特殊材质动画的一种方法(一百二十八) - 雨松MOMO程序研究院 - 3
如下代码所示

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

接着对image的MeshRenderer组件K一个Gray的置灰系数。

Unity3D研究院之Image组件K特殊材质动画的一种方法(一百二十八) - 雨松MOMO程序研究院 - 4

OK 大功告成,image已经可以由动画控制了。

Unity3D研究院之Image组件K特殊材质动画的一种方法(一百二十八) - 雨松MOMO程序研究院 - 5

这个方法只是我的一个思路,我也没有在项目中放手使用,有相关经验的朋友欢迎讨论。

作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

留下一个回复 取消回复

你的email不会被公开。

评论

显示名称 *

电子邮箱地址 *

网站地址

在此浏览器中保存我的显示名称、邮箱地址和网站地址,以便下次评论时使用。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK