天天看点

SRPG游戏开发(十一)第五章 颜色映射与职业动画 - 三 颜色转换器(Color Swapper)第五章 颜色映射与职业动画

返回目录

第五章 颜色映射与职业动画

三       颜色转换器(Color Swapper)

根据流程,我们需要提供一个Texture2D,一个源颜色组和多个映射颜色组。

1        创建ColorSwapper.cs

Texture2D是我们当前的主贴图(main texture),渲染2D的Sprite,使用SpriteRenderer组件中,所以获取贴图也是在SpriteRenderer组件中。
using System.Collections.Generic;
using UnityEngine;

namespace DR.Book.SRPG_Dev.ColorPalette
{
    /// <summary>
    /// 颜色转换器
    /// </summary>
    public class ColorSwapper : MonoBehaviour
    {
        [SerializeField]
        private SpriteRenderer m_Renderer;
        [SerializeField]
        private ColorChart m_SrcChart;
        [SerializeField]
        private List<ColorChart> m_SwapCharts = new List<ColorChart>();

        private Texture2D m_MainTexture;
    }
}
           

添加我们需要的属性。需要转换的Sprite所在贴图是在SpriteRenderer中获取,SpriteRenderer.sprite.texture就是我们要的。

如果贴图被打包进了图集,那么SpriteRenderer.sprite.texture指的是图集贴图,并不是原本的贴图。

public new SpriteRenderer renderer
        {
            get { return m_Renderer; }
            set { m_Renderer = value; }
        }

        private Texture2D mainTexture
        {
            get
            {
                if (m_MainTexture == null)
                {
                    if (m_Renderer == null || m_Renderer.sprite == null)
                    {
                        return null;
                    }
                    m_MainTexture = m_Renderer.sprite.texture;
                }
                return m_MainTexture;
            }
        }

        public ColorChart srcChart
        {
            get { return m_SrcChart; }
            set { m_SrcChart = value; }
        }

        public List<ColorChart> swapCharts
        {
            get { return m_SwapCharts; }
        }
           

2        添加所需的方法

流程中,我们只有使用转换颜色的方法,当然的,我们还应该添加不使用颜色映射的方法。其中,应用转换方法的是由Unity提供的Renderer.SetPropertyBlock(MaterialPropertyBlock block)方法。如果你在做3D游戏,那么对这个方法应该非常的熟悉,转换贴图时也常用它,2D游戏同样使用它。
private MaterialPropertyBlock m_SwapMaterialBlock;
           

2.1      转换颜色(Swap Colors)

转换颜色时,需要我们的source texture不能为null,source color chart不能为null,swap color charts不能为null。
/// <summary>
        /// 通过name转换颜色
        /// </summary>
        /// <param name="chartName"></param>
        public void SwapColors(string chartName)
        {
            if (string.IsNullOrEmpty(chartName) || mainTexture == null || srcChart == null || swapCharts == null)
            {
                return;
            }

            ColorChart chart = swapCharts.Find(c => c.name == chartName);
            if (chart != null)
            {
                Texture2D swapTexture;
                if (chart.TryGetSwapTexture(mainTexture, srcChart, out swapTexture))
                {
                    SetMaterialPropertyBlockTexture(swapTexture);
                }
            }
        }
           
其中,你可以看到获取了转换后的Texture2D,然后进行设置进MaterialPropertyBlock中,进行转换。我们来完成SetMaterialPropertyBlockTexture(Texture2Dtexture)方法。
/// <summary>
        /// 创建转换颜色的 MaterialPropertyBlock
        /// </summary>
        /// <param name="swapTexture"></param>
        private void SetMaterialPropertyBlockTexture(Texture2D swapTexture)
        {
            if (swapTexture == null)
            {
                return;
            }

            if (m_SwapMaterialBlock == null)
            {
                m_SwapMaterialBlock = new MaterialPropertyBlock();
                renderer.GetPropertyBlock(m_SwapMaterialBlock);
            }
            m_SwapMaterialBlock.SetTexture("_MainTex", swapTexture);
        }
           
这样就设置好了MaterialPropertyBlock了。要应用颜色映射,只需将它交给SpriteRenderer就好了,添加此方法。
renderer.SetPropertyBlock(m_SwapMaterialBlock);
           

2.2      回到源颜色

要回到源颜色,只需要重新使用我们的贴图就可以了,而在之前我们已经把源贴图保存进了m_MainTexture,重新使用MaterialPropertyBlock进行设置SpriteRenderer。
/// <summary>
        /// 清除Swap颜色
        /// </summary>
        public void ClearSwapColors()
        {
            if (m_SwapMaterialBlock != null)
            {
                m_SwapMaterialBlock.SetTexture("_MainTex", mainTexture);
                renderer.SetPropertyBlock(m_SwapMaterialBlock);
                m_SwapMaterialBlock = null;
                m_MainTexture = null;
            }
        }
           
再来修改SwapColors方法。
public void SwapColors(string chartName)
        {
            if (string.IsNullOrEmpty(chartName) || mainTexture == null || srcChart == null || swapCharts == null)
            {
                return;
            }

            // 如果是源颜色组的name,清除颜色,否则转换
            if (chartName == srcChart.name)
            {
                ClearSwapColors();
            }
            else
            {
                ColorChart chart = swapCharts.Find(c => c.name == chartName);
                if (chart != null)
                {
                    Texture2D swapTexture;
                    if (chart.TryGetSwapTexture(mainTexture, srcChart, out swapTexture))
                    {
                        SetMaterialPropertyBlockTexture(swapTexture);
                    }
                }
            }
        }
           
这样,颜色映射就创建好了。下一节内容,我们来测试颜色映射。

继续阅读