Unity3D手游开发日记(8) - 运动残影效果
2016-08-18 22:39
281 查看
2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理.
实现原理也很简单:
1.间隔一定时间创建一个残影模型
[csharp] view plain copy
GameObject go = GameObject.Instantiate(origin, pos, dir) as GameObject;
2.对残影模型采用特殊的shader,要简单高效
[csharp] view plain copy
public class MotionGhost
{
public GameObject m_GameObject;
public List<Material> m_Materials;
public float m_DurationTime;
public float m_FadeTime;
public float m_Time;
public MotionGhost(GameObject go, Color color, float durationTime, float fadeTime)
{
m_GameObject = go;
m_DurationTime = durationTime;
m_FadeTime = fadeTime;
m_Time = durationTime;
if (MotionGhostMgr.Instance.m_MaterialMotionGhost == null)
MotionGhostMgr.Instance.m_MaterialMotionGhost = Resources.Load("Material/MotionGhost");
m_Materials = new List<Material>();
foreach (Renderer renderer in go.GetComponentsInChildren<Renderer>())
{
if (renderer as MeshRenderer || renderer as SkinnedMeshRenderer)
{
// 身体和武器
Material[] newMaterials = new Material[1];
newMaterials[0] = GameObject.Instantiate(MotionGhostMgr.Instance.m_MaterialMotionGhost) as Material;
if (newMaterials[0].HasProperty("_RimColor"))
newMaterials[0].SetColor("_RimColor", color);
renderer.materials = newMaterials;
m_Materials.Add(renderer.material);
}
else
{
// 隐藏粒子
renderer.enabled = false;
}
}
}
}
3.残影淡入淡出的处理
[csharp] view plain copy
public void Tick()
{
for (int i = m_MotionGhosts.Count - 1; i >= 0; --i)
{
m_MotionGhosts[i].m_Time -= Time.deltaTime;
// 时间到了删除掉
if (m_MotionGhosts[i].m_Time <= 0)
{
GameObject.Destroy(m_MotionGhosts[i].m_GameObject);
m_MotionGhosts.RemoveAt(i);
--m_Counter;
continue;
}
// 开始材质渐变
if (m_MotionGhosts[i].m_Time < m_MotionGhosts[i].m_FadeTime)
{
float alpha = m_MotionGhosts[i].m_Time / m_MotionGhosts[i].m_FadeTime;
foreach (Material material in m_MotionGhosts[i].m_Materials)
{
if (material.HasProperty("_RimColor"))
{
Color color = material.GetColor("_RimColor");
color *= alpha;
material.SetColor("_RimColor", color);
}
}
}
}
}
残影+扭曲的效果:
残影效果:
实现原理也很简单:
1.间隔一定时间创建一个残影模型
[csharp] view plain copy
GameObject go = GameObject.Instantiate(origin, pos, dir) as GameObject;
2.对残影模型采用特殊的shader,要简单高效
[csharp] view plain copy
public class MotionGhost
{
public GameObject m_GameObject;
public List<Material> m_Materials;
public float m_DurationTime;
public float m_FadeTime;
public float m_Time;
public MotionGhost(GameObject go, Color color, float durationTime, float fadeTime)
{
m_GameObject = go;
m_DurationTime = durationTime;
m_FadeTime = fadeTime;
m_Time = durationTime;
if (MotionGhostMgr.Instance.m_MaterialMotionGhost == null)
MotionGhostMgr.Instance.m_MaterialMotionGhost = Resources.Load("Material/MotionGhost");
m_Materials = new List<Material>();
foreach (Renderer renderer in go.GetComponentsInChildren<Renderer>())
{
if (renderer as MeshRenderer || renderer as SkinnedMeshRenderer)
{
// 身体和武器
Material[] newMaterials = new Material[1];
newMaterials[0] = GameObject.Instantiate(MotionGhostMgr.Instance.m_MaterialMotionGhost) as Material;
if (newMaterials[0].HasProperty("_RimColor"))
newMaterials[0].SetColor("_RimColor", color);
renderer.materials = newMaterials;
m_Materials.Add(renderer.material);
}
else
{
// 隐藏粒子
renderer.enabled = false;
}
}
}
}
3.残影淡入淡出的处理
[csharp] view plain copy
public void Tick()
{
for (int i = m_MotionGhosts.Count - 1; i >= 0; --i)
{
m_MotionGhosts[i].m_Time -= Time.deltaTime;
// 时间到了删除掉
if (m_MotionGhosts[i].m_Time <= 0)
{
GameObject.Destroy(m_MotionGhosts[i].m_GameObject);
m_MotionGhosts.RemoveAt(i);
--m_Counter;
continue;
}
// 开始材质渐变
if (m_MotionGhosts[i].m_Time < m_MotionGhosts[i].m_FadeTime)
{
float alpha = m_MotionGhosts[i].m_Time / m_MotionGhosts[i].m_FadeTime;
foreach (Material material in m_MotionGhosts[i].m_Materials)
{
if (material.HasProperty("_RimColor"))
{
Color color = material.GetColor("_RimColor");
color *= alpha;
material.SetColor("_RimColor", color);
}
}
}
}
}
残影+扭曲的效果:
残影效果:
相关文章推荐
- Unity3D手游开发日记(7) - 适合移动平台的天气效果
- Unity3D手游开发日记(7) - 适合移动平台的天气效果
- Unity3D手游开发日记(10) - 资源打包的一些思考
- Unity3D手游开发日记(3) - 场景加载进度条的完美方案
- Unity3D手游开发日记(1) - 移动平台实时阴影方案
- Unity3D研究院之手游开发中所有特殊的文件夹
- Unity3D 开发之shader教程(实时swirl 扭曲漩涡效果)
- Unity3D开发(九):Unity3d流光效果
- Unity3D开发:为地形添加水源和效果
- 【Cocos2d-x游戏引擎开发笔记(17)】实现运动的尾巴效果
- 【Cocos2d-x游戏引擎开发笔记(17)】实现运动的尾巴效果
- [Unity3D]Unity3D游戏开发之Logo渐入渐出效果的实现
- Unity3D手游开发---2013CSDN高校俱乐部全国巡讲
- unity3D 研究院之手游开发中所有特殊的文件夹
- [Unity3D]Unity3D游戏开发之Logo渐入渐出效果的实现
- (转)Unity3D研究院之手游开发中所有特殊的文件夹(assetbundle与Application.persistentDataPath)
- [Unity3D]Unity3D游戏开发之ACT游戏三连击效果实现综述
- Unity3D开发(八):NGUI之UILabel颜色渐变效果
- [Unity3D]手机3D游戏开发:如何实现最高分的存储与显示(六)----实现文字闪烁效果
- [Unity3D]Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果强化版