返回目录
第五章 颜色映射与职业动画
三 颜色转换器(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;
转换颜色时,需要我们的source texture不能为null,source color chart不能为null,swap color charts不能为null。2.1 转换颜色(Swap Colors)
其中,你可以看到获取了转换后的Texture2D,然后进行设置进MaterialPropertyBlock中,进行转换。我们来完成SetMaterialPropertyBlockTexture(Texture2Dtexture)方法。/// <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); } } }
这样就设置好了MaterialPropertyBlock了。要应用颜色映射,只需将它交给SpriteRenderer就好了,添加此方法。/// <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); }
renderer.SetPropertyBlock(m_SwapMaterialBlock);
要回到源颜色,只需要重新使用我们的贴图就可以了,而在之前我们已经把源贴图保存进了m_MainTexture,重新使用MaterialPropertyBlock进行设置SpriteRenderer。2.2 回到源颜色
再来修改SwapColors方法。/// <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; } }
这样,颜色映射就创建好了。下一节内容,我们来测试颜色映射。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); } } } }