Unity 引擎做残影效果——1、BakeMesh

Unity实现残影效果

  大家好,我是阿赵。
  这次来分享一下在Unity里面做残影的效果。
  所谓的残影,就是在角色移动的过程中,留下一串残留的影子。
在这里插入图片描述
在这里插入图片描述

  这种效果比较常出现在格斗游戏和动作游戏。
  在Unity里面做残影,方法很多。我这里将会介绍三种方法:
1、BakeMesh
2、屏幕后处理
3、顶点偏移。
  这一篇先介绍最常见的BakeMesh方法。

一、原理

  用BakeMesh来实现残影,实际上是通过SkinnedMeshRenderer.BakeMesh方法实现的。
  这个方法的作用,是在调用的时候,把蒙皮的网格当前帧的网格情况复制出来,变成一个新的网格模型。
在这里插入图片描述
在这里插入图片描述

  实际上,这种方法做残影,是真的在场景里面生成了很多个物体,每个物体代表了某一帧的角色的网格模型。
  至于想复制出来的模型是什么效果,就自己选择一种材质球附上去就行了。比如你想要红色半透明的,或者边缘光半透明之类,都可以。

二、优缺点

1、优点

  这种方法的优点是效果还不错,通过控制复制网格的频率,就可以做出很细腻的残影效果。
  然后这种方法的实现难度非常低,你知道了SkinnedMeshRenderer.BakeMesh方法,在适当的时候调用,获得一个Mesh,并且塞到一个MeshFilter上面,加一个材质球,就可以显示出来。基本上不涉及到什么难的计算。

2、缺点

  缺点是显而易见的,首先是复制很多个Mesh出来,增加了内存的使用和GC回收的频率。然后是一个模型的网格渲染了很多次,渲染性能不是很好。
  如果同屏幕多个角色使用这种方式做残影,那么渲染压力是极端的增大。
  所以这种方法如果要使用,也要多考虑一下,比如只能主角使用,并且生成残影的数量可能要做一下控制。

三、代码

  这种方式,只需要写C#代码就行。然后生成的残影需要定时删除自己,或者自己建立一个对象池都可以。由于要做透明度渐变,所以附加在复制出来的MeshRender上的材质球,要么每个Render一个材质球,要么用SetPropertyBlock去设置每个材质球不同的透明度。
  我这里只是一个demo,所以写得不是很严谨,只是表达一下过程了:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveBakeMesh : MonoBehaviour
{
    public bool isMove = false;
    public SkinnedMeshRenderer[] skinList;
    public int spaceTime = 5;
    public int countTime = 0;
    public Material bakeMat;
    private Vector3 oldPos;
    // Start is called before the first frame update
    void Start()
    {
        skinList = this.gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        countTime++;
        if(countTime%spaceTime == 0)
        {
            BakeFun();
        }
    }

    private void BakeFun()
    {
        if(Vector3.Distance(this.gameObject.transform.position,oldPos)>0)
        {
            oldPos = this.gameObject.transform.position;
            for (int i = 0; i < skinList.Length; i++)
            {
                Mesh mesh = new Mesh();
                skinList[i].BakeMesh(mesh);
                GameObject go = new GameObject();
                MeshFilter mf = go.AddComponent<MeshFilter>();
                mf.mesh = mesh;
                MeshRenderer mr = go.AddComponent<MeshRenderer>();
                mr.material = new Material(bakeMat.shader);
                go.transform.position = this.transform.position;
                go.transform.rotation = Quaternion.Euler(-90, 0, 0);
                DelayDetele dd = go.AddComponent<DelayDetele>();
                dd.mat = mr.material;
            }
        }

    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DelayDetele : MonoBehaviour
{
    public float delTime = 0.8f;
    public float delSpeed = 1;
    public Material mat;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        delTime -= Time.deltaTime * delSpeed;
        if(mat)
        {
            mat.SetColor("_Color", new Color(1f, 0.2f, 0, delTime / 4));
        }
        
        if(delTime <=0)
        {
            GameObject.Destroy(this.gameObject);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/55572.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

无涯教程-Lua - Iterators(迭代器)

迭代器是一种构造&#xff0c;使您可以遍历所谓的集合或集合的元素。在Lua中&#xff0c;这些集合通常引用表&#xff0c;这些表用于创建各种数据结构(如数组)。 通用迭代器 通用的 for 迭代器提供集合中每个元素的键值对。下面给出一个简单的示例。 array{"Lua",…

Linux中的file命令:查看文件类型

2023年8月1日&#xff0c;周二上午 目录 简要说明使用方法MIME类型举例说明 简要说明 在Linux中&#xff0c;file命令用于识别文件类型。 file命令可以识别各种类型的文件&#xff0c;包括普通文件、目录、符号链接、设备文件、压缩文件、二进制可执行文件等。 它是一个非常…

云原生落地实践的25个步骤

一、什么是云原生&#xff1f; 云原生从字面意思上来看可以分成云和原生两个部分。 云是和本地相对的&#xff0c;传统的应用必须跑在本地服务器上&#xff0c;现在流行的应用都跑在云端&#xff0c;云包含了IaaS,、PaaS和SaaS。 原生就是土生土长的意思&#xff0c;我们在开始…

计算机视觉(六)图像分类

文章目录 常见的CNNAlexnet1乘1的卷积 VGG网络Googlenet&#xff08;Inception V1、V2、V3&#xff09;全局平均池化总结 Resnet、ResnextResNet残差网络ResNeXt网络 应用案例VGGResnet 常见的CNN Alexnet DNN深度学习革命的开始 沿着窗口进行归一化。 1乘1的卷积 VGG网络…

论文浅尝 | 预训练Transformer用于跨领域知识图谱补全

笔记整理&#xff1a;汪俊杰&#xff0c;浙江大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/pdf/2303.15682.pdf 动机 传统的直推式(tranductive)或者归纳式(inductive)的知识图谱补全(KGC)模型都关注于域内(in-domain)数据&#xff0c;而比较少关…

无涯教程-jQuery - scrollLeft( val )方法函数

scrollLeft(val)方法用于将所有匹配元素上的向左滚动偏移量设置为传递的值。 此方法适用于可见和隐藏元素。 scrollLeft( val ) - 语法 selector.scrollLeft( val ) 这是此方法使用的所有参数的描述- val - 代表所需滚动左偏移量的正数。 scrollLeft( val ) - 示例 以…

同为科技(TOWE)带热插拔功能机柜PDU插座的应用

所谓热插拔&#xff08;hot-plugging或Hot Swap&#xff09;&#xff0c;即带电插拔&#xff0c;指的是在不关闭系统电源的情况下&#xff0c;将模块、板卡插入或拔出系统而不影响系统的正常工作&#xff0c;从而提高了系统的可靠性、快速维修性、冗余性和对灾难的及时恢复能力…

24考研数据结构-树与二叉树的基本概念

目录 第五章&#xff1a;树5.1树的基本概念5.1.1树的定义5.1.2 基本术语5.1.3 树的性质 5.2二叉树的概念5.2.1 二叉树的定义与特性5.2.2 几种特殊的二叉树5.2.3 二叉树的性质5.2.4 完全二叉树的性质5.2.5 二叉树的存储结构1. 顺序存储重要的基本操作非完全二叉树2. 链式存储逆向…

十大排序|十大排序

稳定排序&#xff1a;冒泡排序、插入排序、归并排序、基数排序、桶排序 不稳定排序&#xff1a;选择排序、快速排序、希尔排序、堆排序 二、插入排序&#xff1a; 代码&#xff1a; #include<iostream> #include<cstdio> #include<stdlib.h> #include<ve…

测试|Selenium介绍及环境搭建

测试|Selenium介绍及环境搭建 1.Selenium是什么 Selenium是用来做web网站 UI自动化的测试工具/测试框架。 我们这里说的Selenium是Selenium2.0&#xff0c;它由Selenium IDE&#xff0c;Webdriver, Selenium Grid组成。 Selenium IDE是用于Selenium测试的完成集成开发环境&…

主流开源监控系统一览

减少故障有两个层面的意思&#xff0c;一个是做好常态预防&#xff0c;不让故障发生&#xff1b;另一个是如果故障发生&#xff0c;要能尽快止损&#xff0c;减少故障时长。而监控的典型作用&#xff0c;就是帮助我们发现及定位故障&#xff0c;这两个环节对于减少故障时长至关…

使用vscode进行远程开发服务器配置

1.下载vscode 2.给vscode 安装python 和 remote ssh插件 remote—SSH扩展允许您使用任何具有SSH服务器的远程机器作为您的开发环境。 3.安装remote-SSH插件之后&#xff0c;vscode左侧出现电脑图标&#xff0c;即为远程服务&#xff0c;按图依次点击&#xff0c;进行服务器配置…

Redis-基于内存的key-value结构数据库

读写性高&#xff0c;适合存储热点性高的数据 也称为结构化的NoSql数据库 redis依赖环境&#xff1a;gcc NoSql 非关系型数据库&#xff0c;是关系型数据库的补充 关系型(RDBMS)非关系型(NoSql)MySqlRedisOracleMongo dbDB2MemCachedSQLServer 常用命令 Redis 教程_redi…

机器学习深入浅出

机器学习是一种人工智能的分支&#xff0c;它使用算法和数学模型来让计算机自主学习数据并做出预测和决策。这种技术正在被广泛应用于各种领域&#xff0c;包括自然语言处理、计算机视觉、语音识别、医学诊断和金融预测等。在本篇博客中&#xff0c;我们将介绍机器学习的基本概…

踩坑(5)整合kafka 报错 java.net.UnknownHostException: 不知道这样的主机

java.net.UnknownHostException: 不知道这样的主机。 (5c0c3c629db9)at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) ~[na:na]at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:933) ~[na:na]at java.ba…

【Spring Boot】请求参数传json对象,后端采用(pojo)CRUD案例(102)

请求参数传json对象&#xff0c;后端采用&#xff08;pojo&#xff09;接受的前提条件&#xff1a; 1.Spring Boot 的启动类加注解&#xff1a;EnableWebMvc 2.Spring Boot 的控制层接受参数采用&#xff1a;RequestBody Spring Boot 启动类&#xff1a;加注解&#xff1a;En…

论文阅读 - Few-shot Network Anomaly Detection via Cross-network Meta-learning

论文链接&#xff1a;https://arxiv.org/pdf/2102.11165.pdf 目录 摘要&#xff1a; 引言 问题定义 方法 Graph Deviation Networks Cross-network Meta-learning 摘要&#xff1a; 网络异常检测旨在找到与绝大多数行为显着不同的网络元素&#xff08;例如节点、边、子图…

数字化失败最关键原因是是老板问题,技术问题还是产品问题?

大家都知道失败率高达80%&#xff0c;这太夸张了&#xff0c;ERP导入都没有这个失败率&#xff0c;那到底为什么呢&#xff1f;​ 数字化失败的最关键原因可能因具体环境和情况而异。题主提到的每个因素&#xff08;老板问题、技术问题和产品问题&#xff09;都可能以不同的方…

Java三大特征之继承【超详细】

文章目录 一、继承概念二、继承的语法三、父类成员访问3.1子类中访问父类的成员变量3.2子类和父类成员变量同名3.3子类中访问父类的成员方法 四、super关键字五、子类构造方法六、super和this七、再谈初始化八、protected 关键字九、继承方式十、final 关键字十一、继承与组合 …

IntelliJ IDEA快捷键大全 + 动图演示!

一、构建/编译 Ctrl F9&#xff1a;构建项目该快捷键&#xff0c;等同于菜单【Build】—>【Build Project】 执行该命令后&#xff0c;IntelliJ IDEA 会编译项目中所有类&#xff0c;并将编译结果输出到out目录中。IntelliJ IDEA 支持增量构建&#xff0c;会在上次构建的基…
最新文章