Unity运动残影技能
残影实现:
1、List<DrawMesh> list,此list中包含某一帧动画模型网格、材质
2、每过一段时间就将运动物体的模型add到list中(优化:未实现,网格合并)
3、LateUpdate里将list中所有模型材质alpha减少,为0,则remove;其余的模型 DrawMesh
技能实现:
技能为两部分,前一部分是运动残影,后一部分是落地爆炸,协程处理即可。
ps
此例简单实现了这个技能,不过应该能够做的更好一些,就是给运动物体添加状态:空中、即将落地,需要维护这两个状态,并且需要用射线处理将爆炸粒子放在合适的位置play
代码:
using UnityEngine;
using System.Collections;
using System.Collections.Generic; class DrawMesh
{
public Mesh mesh;
public Matrix4x4 matrix;
public Material material;
public DrawMesh(Mesh me, Matrix4x4 ma, Material mat, Color color)
{
this.mesh = me;
this.matrix = ma;
this.material = new Material(mat);
this.material.shader = Shader.Find("Transparent/VertexLit");
this.material.SetColor("_Emission", color);
}
} public class Skill4 : MonoBehaviour
{
private SkinnedMeshRenderer[] render; public float forwardPower;//移动速度
public float jumpPower;//跳跃速度
private bool isStart;//残影是否开始 public float Skill4ContinueTime;//残影过程总时间
private float time;
public float fadeSpeed;//残影渐变消失速率 public float rate;//绘制残影速率
public Color color;//残影颜色
private List<DrawMesh> list;//残影list public ParticleSystem particle;//结束爆炸粒子
private Vector3 particlePosition;//粒子初始位置,粒子挂在玩家身上 void Awake()
{
render = GetComponentsInChildren<SkinnedMeshRenderer>();
list = new List<DrawMesh>();
isStart = false;
time = ;
particlePosition = particle.transform.localPosition;
} void Update()
{
if (Input.GetKeyDown(KeyCode.H))
{
UseSkill();
}
} public void UseSkill()
{
playerCS.CrossFade("Attack3Anim", 0f);
isStart = true;
time = ;
StartCoroutine(IEStartSkill());
} private IEnumerator IEStartSkill()
{
rigidbody.velocity = rigidbody.velocity + Vector3.up * jumpPower;//跳跃速度
while (isStart)
{
for (int i = ; i < render.Length; i++)
{
Mesh mesh = new Mesh();
render[i].BakeMesh(mesh);
list.Add(new DrawMesh(mesh, render[i].transform.localToWorldMatrix, render[i].material, color));
}
yield return new WaitForSeconds(rate);
}
} void FixedUpdate()
{
if (isStart)
{
if (time < Skill4ContinueTime)//残影过程中
{
time += Time.deltaTime;
rigidbody.velocity = transform.TransformDirection(Vector3.forward * forwardPower) + Vector3.up * rigidbody.velocity.y;
}
else//残影过程结束 进入爆炸过程
{
isStart = false;
rigidbody.velocity = Vector3.up*rigidbody.velocity.y;
playerCS.CrossFade("IdleAnim", 1f);
StartCoroutine(IEBoom());
}
}
} IEnumerator IEBoom()
{
particle.transform.parent = null; particle.gameObject.SetActive(true);
particle.Play();
yield return new WaitForSeconds(particle.duration); //爆炸过程结束
particle.gameObject.SetActive(false);
particle.transform.parent = transform;
particle.transform.localPosition = particlePosition;
} void LateUpdate()
{
for (int i = list.Count - ; i >= ; i--)
{
list[i].material.SetColor("_Color", new Color(color.r, color.g, color.b, list[i].material.color.a - Time.deltaTime * fadeSpeed));
if (list[i].material.color.a <= 0.05f)
{
Destroy(list[i].material);//重要,如果不destroy显存占用越来越多
Destroy(list[i].mesh);
list.RemoveAt(i);
}
}
for (int i = list.Count - ; i >= ; i--)
{
Graphics.DrawMesh(list[i].mesh, list[i].matrix, list[i].material, gameObject.layer);
}
}
}
效果:
Unity运动残影技能的更多相关文章
- Unity3D手游开发日记(8) - 运动残影效果
2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理. 实现原理也很简单: 1.间隔一定时间创建一个残影模型 GameObject go = Gam ...
- Unity角色残影特效
残影特效在网上有很多例子,比如这个,我参考着自己整合了一下,算是整合了一个比较完整且特别简单易用的出来,只需要一个脚本挂上去无需任何设定就能用. 这里只针对SkinnedMeshRenderer的网格 ...
- Unity Shader : Ghost(残影) v1
前阵子组长给我提了个需求,要实现角色人物的残影.我百度google了一下,发现可以用两种方式实现这个效果:1.记录前几帧的人物位置,将其传入shader中,对每个位置进行一个pass渲染.2. 通过相 ...
- as3如何做出残影效果
在页游中,时不时能看到人物做一些快速移动动作如冲刺时,有残影效果,强化了画面表现.实际人肉眼之所以能看到残影的效果,是因为观察到的物体会在人视线中残留几十毫秒时间,当运动物体运动太快时,人肉眼所见未能 ...
- Win7去除桌面残影的方法
用户升级到Win7系统后使用正常,就是系统桌面会留有残影,怎么样也去不掉,影响用户的使用,那么要如何将这些残影去掉呢?可从计算机属性中进行相关配置. 解决方法 一.在计算机面板上,右键点击“计算机”, ...
- Unity3d 残影效果(狂拽炫酷叼炸天)
效果图,真的很叼啊 我根据别人的改进了一版,支持MeshFilter上的Mesh(需要确保Mesh的Read/Write是开启的否则不能正常工作) 非常感谢原作者给提供思路.http://blog.c ...
- HDOJ(HDU) 2153 仙人球的残影(谜一样的题、、、)
Problem Description 在美丽的HDU,有一名大三的同学,他的速度是众所周知的,跑100米仅仅用了2秒47,在他跑步过程中会留下残影的哎,大家很想知道他是谁了吧,他叫仙人球,既然名字这 ...
- Unity3D-Shader-人物残影效果
[旧博客转移 - 2016年1月7日 00:24 ] 前面的话 上一篇讲了一下人物边缘发光效果,链接: Unity-ShaderLab-实现X光效果,这次我们利用这个Shader来实现人物残影效果 先 ...
- cocos2dx - shader实现任意动画的残影效果
本节主要讲利用cocos2dx机制实现opengl es shader脚本的绘制 这里先看下最终效果: 这里分别实现了灰度效果及残影的效果. 一.绘制基类 这 ...
随机推荐
- Spring-data-redis操作redis知识汇总
什么是spring-data-redis spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对redis的操作,使用java操作redis最常用 ...
- Apache2.4.23+PHP5.6.30+MySQL5.7.18安装教程
最近在工作中常常接触到PHP,自己也写过一些简单的PHP页面.我们知道PHP是在服务器端运行的脚本语言,因此我们需要配置服务器环境.之前为了省事直接使用的是wamp集成环境,但是突然某一天领导要求我们 ...
- spring之bean
Bean的基本配置 id属性 id属性确定bean的唯一标识符,容器对bean的管理,访问,以及该bean的依赖关系,都通过该属性来完成.bean的id属性在Spring容器中应该是唯一的. clas ...
- 数据库Schema两种含义~~
1.数据库Schema有两种含义,一种是概念上的Schema,指的是一组DDL语句集,该语句集完整地描述了数据库的结构.还有一种是物理上的 Schema,指的是数据库中的一个名字空间,它包含一组表.视 ...
- POJ 1743 不可重叠的最长重复子串
原问题,其实是找最长的相似子串,所谓相似就是一个子串每个值加上一个偏移值可以得到另一个子串. 我们先求原数组的差值数组,对新数组求后缀数组,二分答案,判定是否有某个Height数组中的sa最小值与最大 ...
- Angular2.js——表单(下)
这部分是接表单上部分的内容,主要内容有: 1.添加自定义的CSS来提供视觉反馈: 2.显示和隐藏有效性验证的错误信息: 3.使用ngSubmit处理表单提交: 4.禁用表单提交按钮. 添加自定义的CS ...
- JavaScript动画1-速度动画
动画实际上就是在一定时间内,改变一个元素的某些属性. 这里简单实现一个JavaScript运动的框架.主要包括: 速度动画(改变left.right.width.height.opacity) 缓冲运 ...
- cmd 菜单学习
@ECHO OFF&PUSHD %~DP0 &TITLE 标题是随意的 mode con cols=36 lines=20 color 2C :menu cls echo. echo ...
- [C#学习]0.发表之前想说的
在这里我将学习C#编程,首先我也只是一个初学者,只是为了以后的学习,并且方便复习,所以决定在这里记录总结一些知识,简单的写一个教程.所以在这里或许难免有一些错误,欢迎大家指出,一起进步. 在这里我使用 ...
- C#基础知识-编写第一个程序(二)
通过上一篇数据类型已经介绍了C#中最基本的15种预定义数据类型,了解每一种类型代表的数据以及每种类型的取值范围,这是很重要也是最基本.下面我们通过实例来了解每个类型如何去使用.编写C#程序时我们需要用 ...