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

这篇具有很好参考价值的文章主要介绍了Unity 引擎做残影效果——1、BakeMesh。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity实现残影效果

  大家好,我是阿赵。
  这次来分享一下在Unity里面做残影的效果。
  所谓的残影,就是在角色移动的过程中,留下一串残留的影子。
unity 残影效果,Unity引擎Shader效果,unity,游戏引擎
unity 残影效果,Unity引擎Shader效果,unity,游戏引擎

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

一、原理

  用BakeMesh来实现残影,实际上是通过SkinnedMeshRenderer.BakeMesh方法实现的。
  这个方法的作用,是在调用的时候,把蒙皮的网格当前帧的网格情况复制出来,变成一个新的网格模型。
unity 残影效果,Unity引擎Shader效果,unity,游戏引擎
unity 残影效果,Unity引擎Shader效果,unity,游戏引擎

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

二、优缺点

1、优点

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

2、缺点

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

三、代码

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

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

到了这里,关于Unity 引擎做残影效果——1、BakeMesh的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity Shader学习3:透明效果

    Unity中的透明效果由透明通道控制(RGBA中的A),其值为0是完全透明,为1时完全不透明。有两种方法可以实现透明效果: 透明度测试(Alpha Test) 和 透明度混合(Alpha Blend) 。 透明度测试是指通过特定的条件(通常是Alpha通道的值是否超过某个阈值)来判断片元是否透明,只

    2024年01月19日
    浏览(59)
  • Unity Shader入门精要学习——透明效果

    要么完全透明,要么完全不透明。 实现简单,实质上是一种剔除机制,通过将不满足条件(通常使用小于某个阈值来判定,一般使用clip方法)的片元舍弃的方法来达到完全透明效果。这些被舍弃的片元不会再进行任何的处理,也不会对颜色缓冲产生任何影响,其余满足条件

    2024年02月17日
    浏览(47)
  • Unity用Shader实现边缘光效果

    《自学记录》 1、先创建一个Cube,再创建两个材质球Cube、Unilt 2、再创建一个shader代码UniltShader【Project右键Create-Shader-NewSurfaceShader】把里面原来的代码删除,写入下面的代码 3、把shader UniltShader拖给材质球Unilt 4、把Cube的Mesh Renderer中Materials的Size改为2,然后把材质球Cube、Unilt分

    2024年02月08日
    浏览(44)
  • Unity中Shader实现UI流光效果

    在很多游戏的 UI 中,都有实现 一道光扫过 UI 的效果 Unity中Shader的时间_Time 注意: 因为,这是UGUI的Shader,记着修改渲染顺序为 透明层级 和 混合模式 Tags {“Queue” = “TransParent”} Blend SrcAlpha OneMinusSrcAlpha 代码: 效果: Unity3D Shader系列之UI流光效果 Unity流光shader,无需图片

    2024年02月05日
    浏览(49)
  • 【unity shader】水体渲染基础-水下透视效果

    接下来是水体渲染基础的最后一篇,通过水面看到水下的物体,并呈现深度效果。 我们直接搭一个小场景。 增加水面,赋予uv变形的水面材质,并增加透明度的设置。 水体会吸收光线,所以真实的水体并不是完全透明的。此外,水体对不同频率的光吸收率不同,蓝光被吸收

    2024年03月14日
    浏览(53)
  • Unity Shader入门精要 第八章——透明效果

    目录 前言 一、渲染顺序的重要性 二、Unity Shader的渲染顺序 三、透明度测试 1、什么是透明度测试 2、实践 四、透明度混合 1、什么是透明度混合 2、实践  五、开启深度写入的半透明效果 1、实现方法  2、实践 六、ShaderLab的混合命令 1、混合等式和参数 2、混合操作  3、常见

    2024年02月04日
    浏览(42)
  • 【unity shader案例】如何实现一个玻璃效果

      原理:玻璃最大的特点当然就是半透明了,如何在游戏中实现这样的效果呢?我这里总体的思路就是先截取整个场景作为一张纹理,然后把玻璃区域的纹理贴到这个玻璃模型上。 下面看具体实现代码 实现效果如下    更进一步,还可以实现毛玻璃的效果,思路就是用一张

    2024年02月16日
    浏览(48)
  • 学习100个Unity Shader (14) ---透明效果

    由”Queue“ 标签决定,索引号越小越早被渲染: 名称 队列索引号 Background 1000 Geometry 2000 AlphaTest 2450 Transparent 3000 Overlay 4000 某一片元的透明度小于某个阈值,即被舍弃,反之,按非透明物体处理,进行正常的深度测试和深度写入【不需要关闭深度写入】。 UnityObjectToClipPos 将顶

    2024年04月29日
    浏览(43)
  • Unity Shader学习记录(11) ——透明效果的实现方式

    1 透明效果的两种方法 透明是游戏中经常要使用的一种效果。在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道(Alpha Channel)。当开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值之外,它还有另一个属性一一透明度。 当透明度

    2024年02月07日
    浏览(41)
  • Unity中Shader抓取屏幕并实现扭曲效果(优化)

    对上一篇中实现的shader进行优化 1、定义结构体用于传入顶点坐标系 struct appdata { float4 vertex : POSITION; //从应用程序阶段的输入,多加一个uv,用于对扭曲纹理的采样 float2 uv : TEXCOORD; }; 2、因为UnityObjectToClipPos是从本地空间转换到裁剪空间,但是没有进行透视除法,所以需要对其

    2024年02月03日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包