Unity3D手遊開發日記(8)
阿新 • • 發佈:2019-01-26
2D遊戲的殘影很簡單,美術做序列幀圖片就行了,那麼3D遊戲的殘影美術做不了,得靠程式設計師動態建立模型來處理.
實現原理也很簡單:
1.間隔一定時間建立一個殘影模型
GameObject go = GameObject.Instantiate(origin, pos, dir) as GameObject;
2.對殘影模型採用特殊的shader,要簡單高效
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.殘影淡入淡出的處理
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); } } } } }
殘影+扭曲的效果:
殘影效果: