查看: 1280|回复: 4
打印 上一主题 下一主题

[其他] 武器拖尾效果实现的代码

[复制链接]

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38268
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-6-30 18:38:22 |只看该作者 |倒序浏览
注释比较清晰 就不做多的解释了
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;

  4. //内部类 用于存储每帧光效点信息
  5. class Wp
  6. {
  7.         public Vector3 point;
  8.     public Vector3 upDir;
  9.     public float time;
  10.     public Wp() {

  11.     }
  12.     public Wp(Vector3 p, float t) {
  13.         point = p;
  14.         time = t;
  15.     }
  16. }

  17. public class MyWeapon : MonoBehaviour {
  18.         private List<Wp> sections = new List<Wp>();//光效点列表
  19.         private Mesh mesh;
  20.         public float time = 2.0f;
  21.         public Color startColor = Color.white;
  22.     public Color endColor = new Color(1, 1, 1, 0);
  23.         private MeshRenderer meshRenderer;
  24.     private Material trailMaterial;
  25.         public float height = 2.0f;
  26.     private bool isPlay = false;
  27.         void Awake() {

  28.         MeshFilter meshF = GetComponent(typeof(MeshFilter)) as MeshFilter;
  29.         mesh = meshF.mesh;
  30.         meshRenderer = GetComponent(typeof(MeshRenderer)) as MeshRenderer;
  31.         trailMaterial = meshRenderer.material;
  32.       

  33.     }
  34.         void Start () {
  35.        
  36.         }
  37.        
  38.         // 每帧进行显示更新
  39.     void FixedUpdate()
  40.     {
  41.         if (isPlay)
  42.         {
  43.             Itterate(Time.time);
  44.             UpdateTrail(Time.time);
  45.         }
  46.         }

  47.     public void weStart() {
  48.         isPlay = true;
  49.     }

  50.     public void weStop() {
  51.         isPlay = false;
  52.         ClearTrail();
  53.     }
  54.        
  55.         public void Itterate(float itterateTime) { //记录拖尾点信息
  56.    
  57.         Vector3 position = transform.position;
  58.         float now = itterateTime;

  59.         // 将当前信息添加进列表
  60.         if (sections.Count == 0 || (sections[0].point - position).sqrMagnitude > 0) {
  61.             Wp section = new Wp();
  62.             section.point = position;
  63.             section.upDir = transform.TransformDirection(Vector3.up);//存入世界方向
  64.             section.time = now;
  65.             sections.Insert(0, section);
  66.             
  67.         }
  68.     }
  69.     public void UpdateTrail(float currentTime) { // ** call once a frame **
  70.    
  71.         // 清空mesh显示
  72.         mesh.Clear();
  73.         //
  74.         // 将超时点从列表移除
  75.         while (sections.Count > 0 && currentTime > sections[sections.Count - 1].time + time) {
  76.             sections.RemoveAt(sections.Count - 1);
  77.         }
  78.         // 两个点才能形成一个光效
  79.         if (sections.Count < 2)
  80.             return;
  81.                 //顶点 颜色 UV数组定义
  82.         Vector3[] vertices = new Vector3[sections.Count * 2];
  83.         Color[] colors = new Color[sections.Count * 2];
  84.         Vector2[] uv = new Vector2[sections.Count * 2];
  85.                 //获取列表第一个点
  86.         Wp currentSection = sections[0];
  87.                 //
  88.         // 用矩阵代替transform 性能较高
  89.         Matrix4x4 localSpaceTransform = transform.worldToLocalMatrix;
  90.         // 设置 顶点 颜色 UV信息
  91.         for (var i = 0; i < sections.Count; i++) {
  92.             currentSection = sections[i];
  93.             float u = 0.0f;
  94.             if (i != 0)
  95.                 u = Mathf.Clamp01((currentTime - currentSection.time) / time);
  96.                         //
  97.             // 获取朝向
  98.             Vector3 upDir = currentSection.upDir;

  99.             // 根据记录点 创建两个顶点
  100.             vertices[i * 2 + 0] = localSpaceTransform.MultiplyPoint(currentSection.point);
  101.             vertices[i * 2 + 1] = localSpaceTransform.MultiplyPoint(currentSection.point + upDir * height);

  102.             uv[i * 2 + 0] = new Vector2(u, 0);
  103.             uv[i * 2 + 1] = new Vector2(u, 1);

  104.             // 计算插值颜色
  105.             Color interpolatedColor = Color.Lerp(startColor, endColor, u);
  106.             colors[i * 2 + 0] = interpolatedColor;
  107.             colors[i * 2 + 1] = interpolatedColor;
  108.         }

  109.         // 创建三角形信息
  110.         //      1---3---5
  111.         //      |\  |\  |
  112.         //      | \ | \ |
  113.         //      |  \|  \|
  114.         //      0---2---4
  115.         int[] triangles = new int[(sections.Count - 1) * 2 * 3];
  116.         for (int i = 0; i < triangles.Length / 6; i++) {
  117.             triangles[i * 6 + 0] = i * 2;
  118.             triangles[i * 6 + 1] = i * 2 + 1;
  119.             triangles[i * 6 + 2] = i * 2 + 2;

  120.             triangles[i * 6 + 3] = i * 2 + 2;
  121.             triangles[i * 6 + 4] = i * 2 + 1;
  122.             triangles[i * 6 + 5] = i * 2 + 3;
  123.         }

  124.         // 对mesh赋值
  125.         mesh.vertices = vertices;
  126.         mesh.colors = colors;
  127.         mesh.uv = uv;
  128.         mesh.triangles = triangles;
  129.     }
  130.     public void ClearTrail() {
  131.                 //清空显示对象
  132.         if (mesh != null) {
  133.             mesh.Clear();
  134.             sections.Clear();
  135.         }
  136.     }
  137. }
复制代码
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏1 支持支持0 反对反对0
回复

使用道具 举报

115

主题

3

听众

5676

积分

高级设计师

Rank: 6Rank: 6

纳金币
7268
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-6-30 18:52:10 |只看该作者
Thanks for sharing !
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2014-6-30 21:45:27 |只看该作者
Thanks for sharing this !
回复

使用道具 举报

wucnj    

1

主题

1

听众

3160

积分

中级设计师

Rank: 5Rank: 5

纳金币
1065
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2014-7-1 10:26:01 |只看该作者
感谢分享!!!
回复

使用道具 举报

0

主题

1

听众

1082

积分

助理设计师

Rank: 4

纳金币
93
精华
0
5#
发表于 2014-8-15 18:09:07 |只看该作者
挺厉害的。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-9-20 17:39 , Processed in 0.101541 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部