【Unity】动作游戏开发实战详细分析-25-角色残影效果的实现


基本思路

Unity中的蒙皮网格组件提供了一个接口BakeMesh,允许我们拿到当前动画帧的网格数据,借此可对烘焙网格使用半透明的边缘泛光Shader,以达到残影效果。

代码实现

残影类

public class ShadowFx : MonoBehaviour
{const string SHADOW_FX_NAME_PREFIX = "Shadow_";public Shader shader;//透明边缘泛光Shaderpublic SkinnedMeshRenderer skinnedMeshRenderer;//蒙皮网格public float fadeTime = 0.5f;//淡出时间public MonoBehaviour coroutineMonoBehaviour;//协程开启对象,防止因自身关闭导致残影协程停止GameObject mShadowFxGO;void OnEnable(){coroutineMonoBehaviour.StartCoroutine(ShadowFxTrigger());//残影特效触发协程}void OnDestroy(){if (mShadowFxGO)//特殊情况残影销毁处理Destroy(mShadowFxGO);}IEnumerator ShadowFxTrigger(){mShadowFxGO = new GameObject(SHADOW_FX_NAME_PREFIX + Time.time);mShadowFxGO.transform.position = skinnedMeshRenderer.transform.position;mShadowFxGO.transform.rotation = skinnedMeshRenderer.transform.rotation;mShadowFxGO.transform.localScale = skinnedMeshRenderer.transform.localScale;//拷贝变换信息var meshRenderer = mShadowFxGO.AddComponent<MeshRenderer>();var meshFilter = mShadowFxGO.AddComponent<MeshFilter>();var mesh = new Mesh() { name = mShadowFxGO.name };skinnedMeshRenderer.BakeMesh(mesh);//烘焙残影meshFilter.sharedMesh = mesh;var mat = new Material(shader);mat.CopyPropertiesFromMaterial(skinnedMeshRenderer.sharedMaterial);//从主材质球拷贝参数meshRenderer.sharedMaterial = mat;var cacheMatColor = mat.color;var beginTime = Time.time;for (var duration = fadeTime; Time.time - beginTime <= duration;){var t = (Time.time - beginTime) / duration;mat.color = new Color(cacheMatColor.r, cacheMatColor.g, cacheMatColor.b, Mathf.Lerp(1f, 0f, t));yield return null;}//残影消隐插值Destroy(mShadowFxGO);//销毁残影}
}

Shader

Shader "ACTBook/RimFxShader"
{Properties{_Color ("Color", Color) = (1,1,1,1)_MainTex ("Albedo (RGB)", 2D) = "white" {}_Glossiness ("Smoothness", Range(0,1)) = 0.5_Metallic ("Metallic", Range(0,1)) = 0.0//一些常规字段_BumpMap("Normal Texture (RGB)", 2D) = "white" {}//法线贴图_RimColor("Rim Color", Color) = (1,0.0, 0.0, 0.0)//发光颜色_RimPower("Rim Power", float) = 2.0//发光强度}SubShader{Tags{"Queue" = "Transparent""RenderType" = "Transparent"}//半透明Shader标签声明Pass{ZWrite OnColorMask 0}//预先写深度CGPROGRAM#pragma surface surf Standard fullforwardshadows alpha:fade//留意alpha:fade,使用半透明Shader须加入这一段#pragma target 3.0sampler2D _MainTex;fixed4 _RimColor;//边缘发光的颜色half _RimPower;//边缘发光的强度struct Input{float2 uv_MainTex;float2 uv_BumpMap;half3 viewDir;//边缘发光所需要的缺省参数};sampler2D _BumpMap;half _Glossiness;half _Metallic;fixed4 _Color;UNITY_INSTANCING_BUFFER_START(Props)UNITY_INSTANCING_BUFFER_END(Props)void surf (Input IN, inout SurfaceOutputStandard o){o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));half rim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal));//计算边缘光强度fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;o.Albedo = c.rgb;o.Metallic = _Metallic;o.Smoothness = _Glossiness;o.Emission = _RimColor.rgb * pow(rim, _RimPower);//乘以边缘光颜色并赋予自发光通道o.Alpha = rim * c.a;//边缘光强度与颜色alpha相乘,并赋予Alphat通道}ENDCG}
}

【Unity】动作游戏开发实战详细分析-25-角色残影效果的实现相关推荐

  1. 【Unity】动作游戏开发实战详细分析-07-连续技与组合技功能设计

    [Unity]动作游戏开发实战详细分析-07-连续技与组合技功能设计 基本思路 在一些动作游戏中,存在着连续技这一功能,具体来说就是连续按下规定的按键会触发能力的功能,或者是长按触发等等. 实现解析 ...

  2. 【Unity】动作游戏开发实战详细分析-16-敌人AI设计

    [Unity]动作游戏开发实战详细分析-16-敌人AI设计 基本思想 本文来实现简单的敌人AI,使用协程来开发AI.如果想要使用行为树插件可自行学习使用. 代码实现 敌人的目标信息结构 用于存储所有的 ...

  3. 【Unity】动作游戏开发实战详细分析-06-技能系统设计

    [Unity]动作游戏开发实战详细分析-06-技能系统设计 基本思想 不同的技能可以设计为技能模版,当角色释放技能时,会通过模版ID将它进行实例化,这个实例技能类可以是一个挂载的MonoBehavio ...

  4. 【Unity】动作游戏开发实战详细分析-15-可扩展的战斗系统

    [Unity]动作游戏开发实战详细分析-15-可扩展的战斗系统 系统设计 攻击信息传递 通常情况下,伤害.属性.判定都会被封装到类中,在触发动画事件后将战斗信息发送给受击者. 我们可以结合Unity碰 ...

  5. 【Unity】动作游戏开发实战详细分析-24-流血喷溅程序

    [Unity]动作游戏开发实战详细分析-24-流血喷溅程序 溅落血迹效果 实现思路 利用对象池的代码设计思路,通过随机性来实现随机的溅落血迹效果. 代码 public class DripBloodF ...

  6. 游戏中制作酷炫拖尾残影效果实战

    发现好多人都想要这个拖尾残影的效果,今天贴出来. 今天制作拖尾残影效果,效果如图:两个视角 我的游戏中角色有冲刺技能,冲刺中身后要有一个残影效果,这种效果就满足了,现在分享给大家如何制作. 1.观察需 ...

  7. unity3D游戏开发实战(一)——角色移动与对白

    目录 游戏理念 游戏底层构建 初始房间设计 旁白脚本 游戏理念 欲制作的游戏为一款3D解密游戏,通过剥夺玩家的视觉,来增强听觉的重要性,让玩家在黑暗中依据声音进行探索,并且随着探索点亮部分地区,最终让 ...

  8. 五分钟详述:一文理解动作游戏开发中的攻击逻辑和受击逻辑

    前言: 本文节选自机械工业出版社出版的<Unity3D动作游戏开发实战>一书,略有改动. 攻击逻辑 一个好的操作手感对于战斗非常重要,玩家会根据当前动画状态来确定下一步输入,若手感混乱则会 ...

  9. 【游戏开发实战】Unity从零开发多人视频聊天功能,无聊了就和自己视频聊天(附源码 | Mirror | 多人视频 | 详细教程)

    文章目录 一.前言 二.思考问题与解决方案 1.思考问题 2.解决方案 2.1.Unity中如何开启摄像头并对图像进行采样 2.2.图像如何中转给其他客户端 2.3.如何实现清晰度切换 2.4.客户端 ...

最新文章

  1. 【撸码师登云梯】google
  2. windows7 下 安装ipython-5.1.0报错
  3. DOM4j读取XML文件(SAXReader)
  4. [leetcode]1.两数之和
  5. php 遍历所有网站网址,使用selenium获取网址所加载所有资源url列表信息
  6. 继扫楼推广后,P图病历也可发起筹款,水滴筹回应...
  7. c++ 迭代器++和+1_C ++中的迭代器简介
  8. 设置TOMCAT TITLE 、 内存大小 、jdk路径
  9. MFC获取当前应用程序实例句柄的三种方法
  10. delphi 2010 mysql_DELPHI 10.2 TOKYO搭建LINUX MYSQL开发环境
  11. OpenCV--二值化
  12. 【巧用百度地图】—百度地图生成器(直接获取代码)
  13. Summarization 文本摘要进展
  14. java全能速查宝典.chm_Java全能速查宝典
  15. Jshop小程序商城
  16. 【多目标跟踪论文阅读笔记——2021年CVPR论文粗读记录】
  17. 给初学者的RxJava2.0教程(八)
  18. 前端网格布局grid
  19. 爬虫大佬,把他总结的正则表达式使用给我了!
  20. Learning both Weights and Connections for Efficient Neural Networks

热门文章

  1. 码农逆袭传奇:二本Java程序员如何闭关6个月斩下月薪30k的字节Offer
  2. 强壮的ZZW (一维dp 01背包)
  3. 打印CAD图纸,CAD看图同时快速打印
  4. PostgreSQL中JSONB的索引
  5. Unity Animator不受Time.TimeScale影响
  6. Day01| 第四期-北京积分落户数据分析
  7. 全国计算机等级考试报名流程及报名照片在线制作教程(详细)
  8. nxp电源管理芯片计划及功能介绍
  9. 【C语言】计算器(支持括号和长式子)
  10. mysql 多选数据库设计_数据库设计:多选查询与匹配