Unity RPG游戏角色残影效果如何实现

来源:互联网 发布:田单复国知乎 编辑:程序博客网 时间:2024/04/29 02:54

//以下是残影特效代码  _OpenAfterImage这个bool值开启则生成残影  须知:需要找到SkinnedMeshRenderer网格  一般角色的各个部位有这个网格

  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4. /// <summary>  
  5. /// 残影特效  
  6. /// </summary>  
  7. public class AfterImageEffects : MonoBehaviour {  
  8.   
  9.     //开启残影  
  10.     public bool _OpenAfterImage;  
  11.   
  12.     //残影颜色  
  13.     public Color _AfterImageColor = Color.black;  
  14.     //残影的生存时间  
  15.     public float _SurvivalTime = 1;  
  16.     //生成残影的间隔时间  
  17.     public float _IntervalTime = 0.2f;  
  18.     private float _Time = 0;  
  19.     //残影初始透明度  
  20.     [Range(0.1f, 1.0f)]  
  21.     public float _InitialAlpha = 1.0f;  
  22.   
  23.     private List<AfterImage> _AfterImageList;  
  24.     private SkinnedMeshRenderer _SkinnedMeshRenderer;  
  25.   
  26.     void Awake () {  
  27.         _AfterImageList = new List<AfterImage>();  
  28.         _SkinnedMeshRenderer = GetComponent<SkinnedMeshRenderer>();  
  29.     }  
  30.     void Update () {  
  31.         if (_OpenAfterImage && _AfterImageList != null)  
  32.         {  
  33.             if (_SkinnedMeshRenderer == null)  
  34.             {  
  35.                 _OpenAfterImage = false;  
  36.                 return;  
  37.             }  
  38.   
  39.             _Time += Time.deltaTime;  
  40.             //生成残影  
  41.             CreateAfterImage();  
  42.             //刷新残影  
  43.             UpdateAfterImage();  
  44.         }  
  45.     }  
  46.     /// <summary>  
  47.     /// 生成残影  
  48.     /// </summary>  
  49.     void CreateAfterImage()  
  50.     {  
  51.         //生成残影  
  52.         if (_Time >= _IntervalTime)  
  53.         {  
  54.             _Time = 0;  
  55.   
  56.             Mesh mesh = new Mesh();  
  57.             _SkinnedMeshRenderer.BakeMesh(mesh);  
  58.   
  59.             Material material = new Material(_SkinnedMeshRenderer.material);  
  60.             SetMaterialRenderingMode(material, RenderingMode.Fade);  
  61.   
  62.             _AfterImageList.Add(new AfterImage(  
  63.                 mesh,  
  64.                 material,  
  65.                 transform.localToWorldMatrix,  
  66.                 _InitialAlpha,  
  67.                 Time.realtimeSinceStartup,  
  68.                 _SurvivalTime));  
  69.         }  
  70.     }  
  71.     /// <summary>  
  72.     /// 刷新残影  
  73.     /// </summary>  
  74.     void UpdateAfterImage()  
  75.     {  
  76.         //刷新残影,根据生存时间销毁已过时的残影  
  77.         for (int i = 0; i < _AfterImageList.Count; i++)  
  78.         {  
  79.             float _PassingTime = Time.realtimeSinceStartup - _AfterImageList[i]._StartTime;  
  80.   
  81.             if (_PassingTime > _AfterImageList[i]._Duration)  
  82.             {  
  83.                 _AfterImageList.Remove(_AfterImageList[i]);  
  84.                 Destroy(_AfterImageList[i]);  
  85.                 continue;  
  86.             }  
  87.   
  88.             if (_AfterImageList[i]._Material.HasProperty("_Color"))  
  89.             {  
  90.                 _AfterImageList[i]._Alpha *= (1 - _PassingTime / _AfterImageList[i]._Duration);  
  91.                 _AfterImageColor.a = _AfterImageList[i]._Alpha;  
  92.                 _AfterImageList[i]._Material.SetColor("_Color", _AfterImageColor);  
  93.             }  
  94.   
  95.             Graphics.DrawMesh(_AfterImageList[i]._Mesh, _AfterImageList[i]._Matrix, _AfterImageList[i]._Material, gameObject.layer);  
  96.         }  
  97.     }  
  98.     /// <summary>  
  99.     /// 设置纹理渲染模式  
  100.     /// </summary>  
  101.     void SetMaterialRenderingMode(Material material, RenderingMode renderingMode)  
  102.     {  
  103.         switch (renderingMode)  
  104.         {  
  105.             case RenderingMode.Opaque:  
  106.                 material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);  
  107.                 material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);  
  108.                 material.SetInt("_ZWrite", 1);  
  109.                 material.DisableKeyword("_ALPHATEST_ON");  
  110.                 material.DisableKeyword("_ALPHABLEND_ON");  
  111.                 material.DisableKeyword("_ALPHAPREMULTIPLY_ON");  
  112.                 material.renderQueue = -1;  
  113.                 break;  
  114.             case RenderingMode.Cutout:  
  115.                 material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);  
  116.                 material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);  
  117.                 material.SetInt("_ZWrite", 1);  
  118.                 material.EnableKeyword("_ALPHATEST_ON");  
  119.                 material.DisableKeyword("_ALPHABLEND_ON");  
  120.                 material.DisableKeyword("_ALPHAPREMULTIPLY_ON");  
  121.                 material.renderQueue = 2450;  
  122.                 break;  
  123.             case RenderingMode.Fade:  
  124.                 material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);  
  125.                 material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);  
  126.                 material.SetInt("_ZWrite", 0);  
  127.                 material.DisableKeyword("_ALPHATEST_ON");  
  128.                 material.EnableKeyword("_ALPHABLEND_ON");  
  129.                 material.DisableKeyword("_ALPHAPREMULTIPLY_ON");  
  130.                 material.renderQueue = 3000;  
  131.                 break;  
  132.             case RenderingMode.Transparent:  
  133.                 material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);  
  134.                 material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);  
  135.                 material.SetInt("_ZWrite", 0);  
  136.                 material.DisableKeyword("_ALPHATEST_ON");  
  137.                 material.DisableKeyword("_ALPHABLEND_ON");  
  138.                 material.EnableKeyword("_ALPHAPREMULTIPLY_ON");  
  139.                 material.renderQueue = 3000;  
  140.                 break;  
  141.         }  
  142.     }  
  143. }  
  144. public enum RenderingMode  
  145. {  
  146.     Opaque,  
  147.     Cutout,  
  148.     Fade,  
  149.     Transparent,  
  150. }  
  151. class AfterImage : Object  
  152. {  
  153.     //残影网格  
  154.     public Mesh _Mesh;  
  155.     //残影纹理  
  156.     public Material _Material;  
  157.     //残影位置  
  158.     public Matrix4x4 _Matrix;  
  159.     //残影透明度  
  160.     public float _Alpha;  
  161.     //残影启动时间  
  162.     public float _StartTime;  
  163.     //残影保留时间  
  164.     public float _Duration;  
  165.   
  166.     public AfterImage(Mesh mesh, Material material, Matrix4x4 matrix4x4, float alpha, float startTime, float duration)  
  167.     {  
  168.         _Mesh = mesh;  
  169.         _Material = material;  
  170.         _Matrix = matrix4x4;  
  171.         _Alpha = alpha;  
  172.         _StartTime = startTime;  
  173.         _Duration = duration;  
  174.     }  
  175. }  
原文出处:http://blog.csdn.net/qq992817263/article/details/52994907

原创粉丝点击