unity绘制一条流动的弧线(贝塞尔线)
作者:BBoy_Leon 发布时间:2022-09-03 18:15:00
标签:unity,弧线
本文实例为大家分享了unity绘制一条流动弧线的具体代码,供大家参考,具体内容如下
最终效果
把下面脚本复制,直接拖上脚本,设置两个点(物体)的位置
GameObject1是开始点的位置,GameObject2是结束点的位置
public Transform[] controlPoints;
public LineRenderer lineRenderer;
public float centerPoint =0.1f;
private int layerOrder = 0;
//生成弧线中间的点数
private int _segmentNum = 20;
//偏移
float m_offset;
float m_speed = 0.5f;
void Start()
{
if (!lineRenderer)
{
lineRenderer = GetComponent<LineRenderer>();
}
lineRenderer.sortingLayerID = layerOrder;
//调用画贝斯尔线
GetBeizerList(controlPoints[0].position, (controlPoints[0].position + controlPoints[1].position) * 0.5f + new Vector3(0, centerPoint, 0), controlPoints[1].transform.position, _segmentNum);
}
private void Update()
{
m_offset = m_offset - m_speed * Time.deltaTime;
//控制offset使材质移动
GetComponent<LineRenderer>().material.mainTextureOffset = new Vector2(m_offset, 0);
}
/// <summary>
/// 根据T值,计算贝塞尔曲线上面相对应的点
/// </summary>
/// <param name="t"></param>T值
/// <param name="p0"></param>起始点
/// <param name="p1"></param>控制点
/// <param name="p2"></param>目标点
/// <returns></returns>根据T值计算出来的贝赛尔曲线点
private static Vector3 CalculateCubicBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2)
{
float u = 1 - t;
float tt = t * t;
float uu = u * u;
Vector3 p = uu * p0;
p += 2 * u * t * p1;
p += tt * p2;
return p;
}
/// <summary>
/// 获取存储贝塞尔曲线点的数组
/// </summary>
/// <param name="startPoint"></param>起始点
/// <param name="controlPoint"></param>控制点
/// <param name="endPoint"></param>目标点
/// <param name="segmentNum"></param>采样点的数量
/// <returns></returns>存储贝塞尔曲线点的数组
public Vector3[] GetBeizerList(Vector3 startPoint, Vector3 controlPoint, Vector3 endPoint, int segmentNum)
{
Vector3[] path = new Vector3[segmentNum];
for (int i = 1; i <= segmentNum; i++)
{
float t = i / (float)segmentNum;
Vector3 pixel = CalculateCubicBezierPoint(t, startPoint,
controlPoint, endPoint);
//设置lineRenderer的control Points
lineRenderer.positionCount = i;
lineRenderer.SetPosition(i - 1, pixel);
//存储Point
path[i - 1] = pixel;
Debug.Log(path[i - 1]);
}
return path;
}
来源:https://blog.csdn.net/BBoyLXiang/article/details/88815637


猜你喜欢
- 前言:学习了SpringBoot分页查询的两种写法,一种是手动实现,另一种是使用框架实现。现在我将具体的实现流程分享一下。首先是手动实现分页
- 问题现象前段时间升级 Android Studio 3.1.3+ 版本后,决定尝试使用 Kotlin 做 APP 开发看看。结果却发现,修改
- 本文实例为大家分享了java实现三角形分形山脉的具体代码,供大家参考,具体内容如下三角形分形山脉原理原型图如图,这是三角形分形山脉的一个原型
- 本章节内容很丰富,主要有基本的表单操作,数据的格式化,数据的校验,以及提示信息的国际化等实用技能。首先看效果图项目结构图接下来用代码重点学习
- 本文实例为大家分享了android recyclerview模拟聊天界面的具体代码,供大家参考,具体内容如下效果图:实现代码:package
- 近期由于负责项目的一个模块,该模块下有很多分类,每个分类都有一个编码code,这个值是作为一个参数携带过来的。但是每个code确实对应一个方
- java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用
- LRU缓存替换策略缓存是一种非常常见的设计,通过将数据缓存到访问速度更快的存储设备中,来提高数据的访问速度,如内存、CPU缓存、硬盘缓存等。
- 本文源码:GitHub·点这里 || GitEE·点这里一、Ehcache缓存简介1、基础简介EhCache是一个纯Java的进程内缓存框架
- 样例代码在讲 Flutter 的盒子模型前,先看看HTML 中的盒子模型。如下图所示,一个页面元素包括了与父级容器的外边距(margin),
- 本文实例为大家分享了Android实现手势密码功能的具体代码,供大家参考,具体内容如下首先声明一下,九宫格布局是从网上扒了一个大神写好的,大
- 前言定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行。但定时器线程池也还是线程池,最底层实现还是ThreadPoolEx
- springboot使用mybatis一对多的关联查询由于刚开始写java不久,对sql语句的熟悉度还是不够熟练,虽然现在使用的mybati
- 一、下载Xxl-Job源代码并导入本地并运行Github地址:https://github.com/xuxueli/xxl-job中文文档地
- 本文实例讲述了C#中异步回调函数用法。分享给大家供大家参考。具体如下:static void Main(string[] args){ Fu
- (1) main.xml 代码如下:(声明四个按钮控件) XML代码: <?xml version="1.0" e
- 图库在播放幻灯片时,按power键灭屏,然后再亮屏,会发现幻灯片继续在播放,没有显示keyguard。如何在亮屏后显示解锁界面。 修改方法是
- struct InputStream 是单个输入流的管理器。是由 add_input_stream() 函数申
- Android中图片的左右切换随处可见,今天我也试着查阅资料试着做了一下,挺简单的一个小Demo,却也发现了一些问题,话不多说,上代码~:使
- NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。使用 NPOI 可以在没有安装 Office 或者相应环境的机