您的位置:首页 > 移动开发

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

2018-02-06 02:00 471 查看



返回目录

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

三       颜色转换器(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);
}
}
}
}


这样,颜色映射就创建好了。下一节内容,我们来测试颜色映射。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐