Unity绘制二维动态曲线

 更新时间:2019年03月14日 08:38:16   作者:凯尔八阿哥  
这篇文章主要为大家详细介绍了Unity绘制二维动态曲线,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

一、前言

之前用Line Render实现过这个动态曲线的绘制,使用这个实在太不方便了,一直寻思怎么在一张图片上通过控制图片的像素值实现曲线的动态绘制。参考了Unity的官网教程实现了这个,效果图如图所示:

这样实现的效果比LineRender 要好,并且不怎么消耗计算和渲染

二、实现

1、代码创建一个背景贴图,并将这个贴图给UGUI的RawImage控件

//创建背景贴图
  widthPixels = (int)(Screen.width * width);
  heightPixels = (int)(Screen.height * height);
  bgTexture = new Texture2D(widthPixels, heightPixels);
 
  bgImage.texture = bgTexture;
  bgImage.SetNativeSize();

2、计算曲线数据列表对应贴图中的像素索引

int i;
  int j;
 
  if (Mathf.Abs(to.x - from.x) > Mathf.Abs(to.y - from.y))
  {
   // Horizontal line.
   i = 0;
   j = 1;
  }
  else
  {
   // Vertical line.
   i = 1;
   j = 0;
  }
 
  int x = (int)from[i];
  int delta = (int)Mathf.Sign(to[i] - from[i]);
  while (x != (int)to[i])
  {
   int y = (int)Mathf.Round(from[j] + (x - from[i]) * (to[j] - from[j]) / (to[i] - from[i]));
 
   int index;
   if (i == 0)
    index = y * widthPixels + x;
   else
    index = x * widthPixels + y;
 
   index = Mathf.Clamp(index, 0, pixelsDrawLine.Length - 1);
   pixelsDrawLine[index] = color;
 
   x += delta;
  }

3、在Update里实时更新贴图的像素值

Array.Copy(pixelsBg, pixelsDrawLine, pixelsBg.Length);
 
  // 基准线
  DrawLine(new Vector2(0f, heightPixels * 0.5f), new Vector2(widthPixels, heightPixels * 0.5f), zeroColor);
 
  for (int i = 0; i < listPoints.Count-1; i++)
  {
   Vector2 from = listPoints[i];
   Vector2 to = listPoints[i + 1];
   DrawLine(from, to, colorLine1);
  }
 
  bgTexture.SetPixels32(pixelsDrawLine);
  bgTexture.Apply();

三、总结

1、比使用Line Render要节省计算和渲染

2、真正实现了二维的曲线绘制,Line Render始终是3维的

3、曲线坐标的X和Y的值不能超过贴图的宽度和高度,否则不能绘制

4、完整的工程下载地址:Unity绘制二维动态曲线

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#/VB.NET 给Excel添加、删除数字签名的方法

    C#/VB.NET 给Excel添加、删除数字签名的方法

    这篇文章主要介绍了C#/VB.NET 给Excel添加、删除数字签名的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • C#中的扩展方法详解

    C#中的扩展方法详解

    “扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。”这是msdn上说的,也就是你可以对String,Int,DataRow,DataTable等这些类型的基础上增加一个或多个方法,使用时不需要去修改或编译类型本身的代码。
    2014-09-09
  • MessageBox的Buttons和三级联动效果

    MessageBox的Buttons和三级联动效果

    这篇文章主要介绍了MessageBox的Buttons和三级联动的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • c# 遍历 Dictionary的四种方式

    c# 遍历 Dictionary的四种方式

    这篇文章主要介绍了c# 遍历 Dictionary的四种方式,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-09-09
  • c# 动态构建LINQ查询表达式

    c# 动态构建LINQ查询表达式

    这篇文章主要介绍了c# 如何动态构建LINQ查询表达式,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-11-11
  • adonet基础示例分享(adonet连接数据库)

    adonet基础示例分享(adonet连接数据库)

    这篇文章主要介绍了adonet基础示例分享(adonet连接数据库),需要的朋友可以参考下
    2014-04-04
  • C# 获取程序集版本、文件版本

    C# 获取程序集版本、文件版本

    C# 获取程序集版本、文件版本的实现代码。
    2009-09-09
  • WPF中ImageBrush常用方式介绍

    WPF中ImageBrush常用方式介绍

    这篇文章介绍了WPF中ImageBrush的常用方式,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • unity中实现Edge浏览器鼠标手势的功能思路详解

    unity中实现Edge浏览器鼠标手势的功能思路详解

    这篇文章主要介绍了unity中实现Edge浏览器鼠标手势的功能思路详解,实现起来其实并不复杂,涉及的技术点有pc端和移动端屏幕拖动事件,二维向量的相关运算,手势匹配算法,事件系统设计模式,需要的朋友可以参考下
    2023-12-12
  • C#实现文章添加内链的方法

    C#实现文章添加内链的方法

    文章添加内链有利于提高读者阅读体验,有利于搜索引擎优化,提升页面浏览量,下面小编通过两种方法说下用c#实现文章添加内链的方法,一起看看吧
    2018-08-08

最新评论