Unity运动残影技能

  残影实现:

    1、List<DrawMesh> list,此list中包含某一帧动画模型网格、材质

    2、每过一段时间就将运动物体的模型add到list中(优化:未实现,网格合并)

    3、LateUpdate里将list中所有模型材质alpha减少,为0,则remove;其余的模型 DrawMesh

  技能实现:

    技能为两部分,前一部分是运动残影,后一部分是落地爆炸,协程处理即可。

ps

 此例简单实现了这个技能,不过应该能够做的更好一些,就是给运动物体添加状态:空中、即将落地,需要维护这两个状态,并且需要用射线处理将爆炸粒子放在合适的位置play

代码:

  1 using UnityEngine;
  2 using System.Collections;
  3 using System.Collections.Generic;
  4
  5 class DrawMesh
  6 {
  7     public Mesh mesh;
  8     public Matrix4x4 matrix;
  9     public Material material;
 10     public DrawMesh(Mesh me, Matrix4x4 ma, Material mat, Color color)
 11     {
 12         this.mesh = me;
 13         this.matrix = ma;
 14         this.material = new Material(mat);
 15         this.material.shader = Shader.Find("Transparent/VertexLit");
 16         this.material.SetColor("_Emission", color);
 17     }
 18 }
 19
 20 public class Skill4 : MonoBehaviour
 21 {
 22     private SkinnedMeshRenderer[] render;
 23
 24
 25     public float forwardPower;//移动速度
 26     public float jumpPower;//跳跃速度
 27     private bool isStart;//残影是否开始
 28
 29     public float Skill4ContinueTime;//残影过程总时间
 30     private float time;
 31     public float fadeSpeed;//残影渐变消失速率
 32
 33     public float rate;//绘制残影速率
 34     public Color color;//残影颜色
 35     private List<DrawMesh> list;//残影list
 36
 37     public ParticleSystem particle;//结束爆炸粒子
 38     private Vector3 particlePosition;//粒子初始位置,粒子挂在玩家身上
 39
 40
 41     void Awake()
 42     {
 43         render = GetComponentsInChildren<SkinnedMeshRenderer>();
 44         list = new List<DrawMesh>();
 45         isStart = false;
 46         time = 0;
 47         particlePosition = particle.transform.localPosition;
 48     }
 49
 50     void Update()
 51     {
 52         if (Input.GetKeyDown(KeyCode.H))
 53         {
 54             UseSkill();
 55         }
 56     }
 57
 58     public void UseSkill()
 59     {
 60         playerCS.CrossFade("Attack3Anim", 0f);
 61         isStart = true;
 62         time = 0;
 63         StartCoroutine(IEStartSkill());
 64     }
 65
 66     private IEnumerator IEStartSkill()
 67     {
 68         rigidbody.velocity = rigidbody.velocity + Vector3.up * jumpPower;//跳跃速度
 69         while (isStart)
 70         {
 71             for (int i = 0; i < render.Length; i++)
 72             {
 73                 Mesh mesh = new Mesh();
 74                 render[i].BakeMesh(mesh);
 75                 list.Add(new DrawMesh(mesh, render[i].transform.localToWorldMatrix, render[i].material, color));
 76             }
 77             yield return new WaitForSeconds(rate);
 78         }
 79     }
 80
 81     void FixedUpdate()
 82     {
 83         if (isStart)
 84         {
 85             if (time < Skill4ContinueTime)//残影过程中
 86             {
 87                 time += Time.deltaTime;
 88                 rigidbody.velocity = transform.TransformDirection(Vector3.forward * forwardPower) + Vector3.up * rigidbody.velocity.y;
 89             }
 90             else//残影过程结束  进入爆炸过程
 91             {
 92                 isStart = false;
 93                 rigidbody.velocity = Vector3.up*rigidbody.velocity.y;
 94                 playerCS.CrossFade("IdleAnim", 1f);
 95                 StartCoroutine(IEBoom());
 96             }
 97         }
 98     }
 99
100     IEnumerator IEBoom()
101     {
102         particle.transform.parent = null;
103
104         particle.gameObject.SetActive(true);
105         particle.Play();
106         yield return new WaitForSeconds(particle.duration); //爆炸过程结束
107         particle.gameObject.SetActive(false);
108         particle.transform.parent = transform;
109         particle.transform.localPosition = particlePosition;
110     }
111
112     void LateUpdate()
113     {
114         for (int i = list.Count - 1; i >= 0; i--)
115         {
116             list[i].material.SetColor("_Color", new Color(color.r, color.g, color.b, list[i].material.color.a - Time.deltaTime * fadeSpeed));
117             if (list[i].material.color.a <= 0.05f)
118             {
119                 Destroy(list[i].material);//重要,如果不destroy显存占用越来越多
120                 Destroy(list[i].mesh);
121                 list.RemoveAt(i);
122             }
123         }
124         for (int i = list.Count - 1; i >= 0; i--)
125         {
126             Graphics.DrawMesh(list[i].mesh, list[i].matrix, list[i].material, gameObject.layer);
127         }
128     }
129 }

效果:

时间: 2024-10-14 19:07:40

Unity运动残影技能的相关文章

Unity3D手游开发日记(8) - 运动残影效果

2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理. 实现原理也很简单: 1.间隔一定时间创建一个残影模型 [csharp] view plain copy GameObject go = GameObject.Instantiate(origin, pos, dir) as GameObject; 2.对残影模型采用特殊的shader,要简单高效 [csharp] view plain copy public class MotionGho

关于unity中spine动画切换时有残影或者动画播放不正确的解决方法

问题描述: 最近在用spine动画时发现,有时候角色在切换动画的时候会有残影,或者动画播放不正确,例如会丢失一部分节点,例如切换动画后角色虽然动画播放正常,但丢失了武器. 解决办法: 在unity编辑器下找到spine动画的SkeletonData文件,在Animationgs下面有一个"Setup Pos",这个按钮可以将骨骼(bones).资源槽(slots)或两者重置为装配动作(setup pose).它与调用`setBonesToSetupPose` 或 `setSlotsTo

Unity Shader : Ghost(残影) v1

前阵子组长给我提了个需求,要实现角色人物的残影.我百度google了一下,发现可以用两种方式实现这个效果:1.记录前几帧的人物位置,将其传入shader中,对每个位置进行一个pass渲染.2. 通过相机的targetRender,记录前几帧的人物的影像,然后通过后处理混合上去. 这里先介绍方法1,先看效果: 残影用了alpha混合的方法,将它们变得透明. 先列出shader代码: Shader "Custom/Ghost" { Properties { _MainTex ("

as3如何做出残影效果

在页游中,时不时能看到人物做一些快速移动动作如冲刺时,有残影效果,强化了画面表现.实际人肉眼之所以能看到残影的效果,是因为观察到的物体会在人视线中残留几十毫秒时间,当运动物体运动太快时,人肉眼所见未能跟上物体运动速度,旧的物体影像未消失,物体已经移动到别的位置,就会产生残影效果. 实际游戏里物体的移动速度当然不可能这么快,但我们可以根据原理做出残影效果.用一张Bitmap专门draw运动物体,当物体移动时,并不把上一帧的bitmapData进行dispose,而是对bitmapData加上一层透

仙人球的残影

Problem Description 在美丽的HDU,有一名大三的同学,他的速度是众所周知的,跑100米仅仅用了2秒47,在他跑步过程中会留下残影的哎,大家很想知道他是谁了吧,他叫仙人球,既然名字这样了,于是他的思想是单一的,他总是喜欢从一点出发,经过3次转折(每次向右转90°),回到出发点,而且呢,他每次转折前总是跑相同长度的路程,所以很多人都想知道如果用‘1’算他跑步出发的第一个残影的话,那么回到起点的时候,他的残影是怎么样的呢? Input 测试数据有多行,每一行为一个数N(1<=N<

PS制作gif动图以及背景透明与消除残影

摘要: 用Photoshop制作gif动画的要点:在窗口菜单中找到“时间轴”选中打开时间轴,单击一帧,设置该帧显示持续时间在图层里将该帧要显示的图层显示,并将不该显示的层隐藏,新建一帧,接下来就是重复劳动了.最后在文件菜单里找到存储为Web所用的格式,设置一下存储选项即可. 透明背景制作方法有二:一是删除每层的背景,这种方法应该算是通用的方法.二是在存储时在颜色表中选择设为透明色的颜色,在颜色表下方有个将选中的颜色映射为透明色的按钮,点一下就行了,这个方法应该是适合背景色是纯色,并且是主体没有的

Spine动画在Cocos2d-x中,多动画切换播放出现残影的解决方法

最近在做的一个项目,NPC的动画是用Spine来做的.游戏中随着不同的状态变化,会导致NPC在"待机"."准备进攻"."进攻"."眩晕"."死亡"等等多种状态之间来回切换,NPC每切换一种状态,随之就要立刻播放该状态对应的动画. 游戏中播放spine动画是用SkeletonAnimation对象调用setAnimation方法,我遇到的问题是,在多种动画这样切换播放时,有的动画被切换后仍有残影存留,直到再一

cocos2dx - shader实现任意动画的残影效果

本节主要讲利用cocos2dx机制实现opengl es shader脚本的绘制 这里先看下最终效果:                      这里分别实现了灰度效果及残影的效果. 一.绘制基类 这里主要参考了cocos2dx源码中 RenderTexture 的实现,有兴趣的可以了解下. 绘制基类RenderShader主要实现以下方法: //****************************************************************** // 文件名:

HDOJ(HDU) 2153 仙人球的残影(谜一样的题、、、)

Problem Description 在美丽的HDU,有一名大三的同学,他的速度是众所周知的,跑100米仅仅用了2秒47,在他跑步过程中会留下残影的哎,大家很想知道他是谁了吧,他叫仙人球,既然名字这样了,于是他的思想是单一的,他总是喜欢从一点出发,经过3次转折(每次向右转90°),回到出发点,而且呢,他每次转折前总是跑相同长度的路程,所以很多人都想知道如果用'1'算他跑步出发的第一个残影的话,那么回到起点的时候,他的残影是怎么样的呢? Input 测试数据有多行,每一行为一个数N(1<=N<