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

//以下是残影特效代码  _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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity Spine 2D残影效果是一种在游戏开发中常用的特效技术,可以用来实现角色或物体移动时留下残影效果。通过在Spine动画中添加额外的骨骼或Sprite Renderer,并结合透明度和延迟淡出效果,可以实现残影特效的效果。 首先,在Spine中创建一个新的骨骼或Sprite Renderer,作为残影的载体。这个载体需要复制主角或物体的动画,可以通过复制骨骼及其关键帧并调整帧间延迟来实现。确保在复制动画的过程中,将残影骨骼或Sprite Renderer的透明度逐渐降低,以获得残影淡出效果。 接下来,在Unity中创建一个空物体作为残影对象的父物体,并将其位置与主角或物体保持一致。将残影载体作为父物体的子物体,并将残影载体的位置设置为与父物体的位置一致。 然后,通过控制残影骨骼的播放速度,以及调整透明度和延迟淡出效果,可以实现残影效果。可以尝试使用Animator组件或编写脚本来控制残影骨骼的动画播放速度和透明度变化。 最后,在游戏运行时,每一帧都需要更新残影对象的位置与主角或物体的位置保持一致,这样才能实现残影效果随着主角或物体的移动而产生。 总结来说,Unity Spine 2D残影效果实现步骤主要包括创建残影载体,复制动画、调整透明度和延迟淡出效果,创建父物体并保持位置一致,控制残影载体的动画播放速度和透明度变化,以及更新残影对象的位置。通过这些步骤,可以实现一个逼真的残影效果,增强游戏的视觉效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值