2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理.

实现原理也很简单:

1.间隔一定时间创建一个残影模型

  1. GameObject go = GameObject.Instantiate(origin, pos, dir) as GameObject;

2.对残影模型采用特殊的shader,要简单高效

  1. public class MotionGhost
  2. {
  3. public GameObject m_GameObject;
  4. public List<Material> m_Materials;
  5. public float m_DurationTime;
  6. public float m_FadeTime;
  7. public float m_Time;
  8. public MotionGhost(GameObject go, Color color, float durationTime, float fadeTime)
  9. {
  10. m_GameObject = go;
  11. m_DurationTime = durationTime;
  12. m_FadeTime = fadeTime;
  13. m_Time = durationTime;
  14. if (MotionGhostMgr.Instance.m_MaterialMotionGhost == null)
  15. MotionGhostMgr.Instance.m_MaterialMotionGhost = Resources.Load("Material/MotionGhost");
  16. m_Materials = new List<Material>();
  17. foreach (Renderer renderer in go.GetComponentsInChildren<Renderer>())
  18. {
  19. if (renderer as MeshRenderer || renderer as SkinnedMeshRenderer)
  20. {
  21. // 身体和武器
  22. Material[] newMaterials = new Material[1];
  23. newMaterials[0] = GameObject.Instantiate(MotionGhostMgr.Instance.m_MaterialMotionGhost) as Material;
  24. if (newMaterials[0].HasProperty("_RimColor"))
  25. newMaterials[0].SetColor("_RimColor", color);
  26. renderer.materials = newMaterials;
  27. m_Materials.Add(renderer.material);
  28. }
  29. else
  30. {
  31. // 隐藏粒子
  32. renderer.enabled = false;
  33. }
  34. }
  35. }
  36. }

3.残影淡入淡出的处理

  1. public void Tick()
  2. {
  3. for (int i = m_MotionGhosts.Count - 1; i >= 0; --i)
  4. {
  5. m_MotionGhosts[i].m_Time -= Time.deltaTime;
  6. // 时间到了删除掉
  7. if (m_MotionGhosts[i].m_Time <= 0)
  8. {
  9. GameObject.Destroy(m_MotionGhosts[i].m_GameObject);
  10. m_MotionGhosts.RemoveAt(i);
  11. --m_Counter;
  12. continue;
  13. }
  14. // 开始材质渐变
  15. if (m_MotionGhosts[i].m_Time < m_MotionGhosts[i].m_FadeTime)
  16. {
  17. float alpha = m_MotionGhosts[i].m_Time / m_MotionGhosts[i].m_FadeTime;
  18. foreach (Material material in m_MotionGhosts[i].m_Materials)
  19. {
  20. if (material.HasProperty("_RimColor"))
  21. {
  22. Color color = material.GetColor("_RimColor");
  23. color *= alpha;
  24. material.SetColor("_RimColor", color);
  25. }
  26. }
  27. }
  28. }
  29. }

残影+扭曲的效果:

Unity3D手游开发日记(8) - 运动残影效果-LMLPHP

残影效果:

Unity3D手游开发日记(8) - 运动残影效果-LMLPHP

 
 
04-21 03:31