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

残影+扭曲的效果:


残影效果:


原文地址:http://blog.csdn.net/qq18052887/article/details/51094142

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值