Unity做残影效果是个不难的工作。
但是一些细节会对使用方法产生限制,这里整理一下各种情况下推荐的残影效果实现方案
1.3D网格 (高性能)
2.2D人物 (非骨骼动画) (高性能)
3.其它场景 (包括2D骨骼动画人物) (低性能)

3D人物

Unity3D的渲染主要是靠Mesh+Shader,
3D场景下人物往往用SkinnedMeshRenderer做网格渲染,这样方便换装系统。
无脑推荐这篇,针对使用了SkinnedMeshRenderer的网格(也就是带蒙皮的网格),
无需创建新实例,而是直接调用DrawMesh,性能更好使用也简单。
https://blog.csdn.net/qq992817263/article/details/52994907

2D人物 (非骨骼动画)

之所以不能无脑用上面的,是因为Unity中的2D图像渲染使用的不是Mesh而是Sprite,
用的渲染器也不是SkinnedMeshRenderer而是SpriteRenderer
因此原理上需要换一种方式。

也就是直接获取SpriteRenderersprite参数,然后作为残影绘制。
(也就是把2D精灵的图片单独拿出来画一下。)

网上有很多种做法,比较好的应该是这个朋友做的用粒子效果实现的:
https://www.bilibili.com/video/BV12V41117jW

其它场景 (包括2D骨骼动画人物)

如果上面的做法都不行,那就只能直接依靠最笨的方法,
在需要生成残影的位置克隆实体实现残影了。
如果有其它更高性能的方法,求大佬分享呜呜

比如使用2D骨骼做出来的精灵动画,
如果直接获取SpriteRenderersprite
你会发现根本和动画中的姿势不同,
而是默认姿势,像这样:

因为是依靠2D animation库中的spriteSkin脚本,
直接绘制到世界空间,而不是通过SpriteRenderer进行绘制。

又比如想要体现出换装效果,就不能静态设置指定的冲刺sprite

下面这个代码就是我自己写,也不复杂,基本上就是最低效的复制。
就是当需要生成残影时startSpawn=true时,
就计时间,对应间隔生成一些残影。
代码里设置生成的渲染层级是"PerGround",免得残影把本体挡住了,
用的话记得自己换成自己的背景层名。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class AfterImageManager : MonoBehaviour
{public GameObject go_BoneRoot;  //残影克隆对象public Transform tf_SpawnPosition; //残影产生位置public Color cr_AfterImageColor = Color.black; //颜色public float maxAfterTime = 1f; //产生残影持续时间public float maxIntervalSpawnTime = 0.2f; //产生残影间隔时间public float maxLiveTime = 0.5f;//残影生存时间public bool startSpawn = false;//是否开始生成float duringAfterTime = 0;float duringIntervalSpawnTime = 0;List<AfterImage> listAfterImage;//存放所有产生了的残影,方便管理与删除。private void Start() {listAfterImage = new List<AfterImage>();}void FixedUpdate() {if(startSpawn){if (duringAfterTime < maxAfterTime){duringAfterTime += Time.deltaTime;if(duringIntervalSpawnTime < maxIntervalSpawnTime){duringIntervalSpawnTime += Time.deltaTime;}else{duringIntervalSpawnTime = 0f;spawnOne();}}else{startSpawn = false;duringAfterTime = 0f;duringIntervalSpawnTime = 0f;}}    for (int i = 0; i < listAfterImage.Count; i++){listAfterImage[i].update(Time.deltaTime);}while(listAfterImage.Count >0 && listAfterImage[0].isDestroyed){listAfterImage.RemoveAt(0);}}void spawnOne(){//listAfterImage.Add(new AfterImage(go_BoneRoot, tf_SpawnPosition, cr_AfterImageColor, (duringAfterTime/maxAfterTime)*maxLiveTime));listAfterImage.Add(new AfterImage(go_BoneRoot, tf_SpawnPosition, cr_AfterImageColor, maxLiveTime));}
}class AfterImage{GameObject go;float maxLiveTime;float duringLiveTime = 0f;public bool isDestroyed = false;SpriteRenderer[] srList;public AfterImage(GameObject _go, Transform pos, Color cr, float maxLiveTime){this.go = GameObject.Instantiate(_go, pos.transform.position, pos.transform.rotation);this.go.transform.localScale = new Vector3(pos.localScale.x, pos.localScale.y, pos.localScale.z);this.maxLiveTime = maxLiveTime;srList =  this.go.GetComponentsInChildren<SpriteRenderer>();foreach(SpriteRenderer sr in srList){sr.color = cr;sr.sortingLayerName = "PerGround";}}public void update(float deltaTime){ //更新生存时间与透明化if(duringLiveTime < maxLiveTime){duringLiveTime += deltaTime;float alpha = 1f - duringLiveTime/maxLiveTime;foreach(SpriteRenderer sr in srList){sr.color = new Color(sr.color.r, sr.color.g, sr.color.b, alpha);}}else{GameObject.Destroy(go);isDestroyed = true;}}
}

如果直接用,复制的物体不能是被控制的实体,否则残影会和你一起走动,
或者可以自己在代码里自己将对应的脚本disable了。

Unity学习笔记(8) Unity残影效果整理,3D、2D、通用方案相关推荐

  1. Unity学习笔记(4)-----粒子效果的实现

    Unity学习笔记(4)-–粒子效果的实现 一.效果展示 下面用若干张张动图展示效果: 大概就是这样,并不是很难. 实际效果要比图中的好一点(顺畅得多). 实现步骤 大致可以分为如下几个步骤,然后逐个 ...

  2. 【Unity学习笔记】[Unity中文课堂教程] C#中级编程代码

    [Unity学习笔记][Unity中文课堂教程] C#中级编程代码 最近想补一补C#基础,Unity官方的C#中级编程教程质量很高,于是开个帖子把跟着敲+记录了部分价讲解和我自己的理解的代码存在这 原 ...

  3. Unity学习笔记:Unity 3D 飞机大战

    Unity学习笔记:Unity 3D 飞机大战 1.打开unity软件后,首先新建Quad作为背景,导入飞机模型,并为其添加刚体 然后创建C#脚本,挂载到飞机上. 2.给飞机创建子弹,让子弹成为预制体 ...

  4. 【Unity学习笔记】Unity中的欧拉角(Euler Angle)和万向节(Gimbal)

    声明:此篇文章是个人学习笔记,并非教程,所以内容可能不够严谨.可作参考,但不保证绝对正确.如果你发现我的文章有什么错误,非常欢迎指正,谢谢哦. 目录 1 奇怪的现象 1.2现象一 1.2 现象二 1. ...

  5. Unity学习笔记:unity介绍(一)

    一.Unity是什么? 1.Unity发音[ˈjuːnəti] 2.俗称有U3D,Unity3D.unity 3.Unity开发商是美国的Unity公司,成立于2004年,位于美国旧金山. 4.uni ...

  6. unity 学习笔记 受伤机制与反弹效果

    学习链接:M_Studio的个人空间_哔哩哔哩_Bilibili 现在,我要增加踩到怪物头上获得一个起跳反馈效果 并且横向碰到怪物也会被弹开,且受伤害 这样就可以了吗? No! 进入游戏发现没有横向碰 ...

  7. Unity学习笔记5 unity的js转c#

    上一篇已经说过,unity的js是一种变种的js,和真正的js还是有区别的,所以有时候会给人一种有点不伦不类的感觉--如果对于完全没有编程基础的人来说,建议一开始就直接学c#吧,不要浪费时间去学js. ...

  8. Unity学习笔记 关于Unity相机的FOV以及水平FOV和垂直FOV之间的转换

    前言 关于FOV FOV 是在任何给定时间通过人眼.相机取景器或在显示屏上可见的可观察世界的范围.它指的是整个区域的覆盖范围,而不是单个固定焦点.FOV 还描述了一个人可以看到可见世界的角度. FOV ...

  9. Unity学习笔记——Mesh

    Unity学习笔记--Mesh Unity中的Mesh组件是一个很好玩的东西,这次的目标是根据高程图创建出一个平面. 1.用脚本创建一个简单的三角形 新建空的物体,挂上MeshFilter.MeshR ...

最新文章

  1. as查看SHA1和MD5
  2. boost::mp11::mp_similar相关用法的测试程序
  3. 春泥计算机科技怎么样,【我最喜爱的教师班主任】李喜秋:化作春泥更护花
  4. [剑指offer][JAVA]面试题第[33]题[二叉搜索树的后序遍历][单调栈][递归分治]
  5. 关于c++的一些案例
  6. vs code怎么编译C语言,Visual Studio Code 如何编写运行 C、C++ 程序?
  7. 007-配置IP和DNS
  8. 2018深度学习十大趋势:元学习成新SGD,多数硬件创企将失败
  9. javascript 使用drop元素实现拖动(ondragstart、ondrag、 ondragend、ondragenter,ondragover、ondragleave、ondrop )
  10. D2 日报 2019年 03月 12日
  11. java服务器 c 服务器_c 编写服务器
  12. SpreadJS使用小结
  13. 字节跳动的面试算法题,实在太变态了
  14. ​5项人工智能实例,令人惊叹!
  15. 无人机影像的植被覆盖度、叶面积指数估算
  16. 判断链表是否中心对称(21.6.8)
  17. Windows XP 下载与安装-怀念过去
  18. ORB-SLAM2安装以及遇到问题
  19. 手机九宫格解锁所有可能
  20. 分享124个PHP源码,总有一款适合您

热门文章

  1. radioml2018数据集_7 Papers Radios | CVPR 2020获奖论文;知识蒸馏综述
  2. grdraw显示区域 lisp_CAD快捷健总揽2
  3. 电脑新手也能学会的diy装机教程
  4. HP 2015DN网络打印机安装配置
  5. 2023谷歌地图poi资源下载分享
  6. 【春节习俗】腊月二十三至腊月三十
  7. 关于apk程序的双开
  8. springboot 集成hibernate 集成struts2
  9. java 字符串拆分技巧_{转}Java 字符串分割三种方法
  10. NKCTF-easy_php