1. 程式人生 > >Unity3D手遊開發日記(8)

Unity3D手遊開發日記(8)

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);
                        }
                    }
                }             
            }
        }


殘影+扭曲的效果:

殘影效果: