在游戏中使用Tween+贝塞尔曲线实现一个抛物线的效果。

1、线性贝塞尔曲线公式:

给定点P0、P1,线性贝兹曲线只是一条两点之间的直线。这条线由下式给出:

2、二次贝塞尔曲线公式:

二次方贝兹曲线的路径由给定点P0、P1、P2控制,这条线由下式给出:

3、三次贝塞尔曲线公式:

P0、P1、P2、P3四个点在平面或在三维空间中定义了三次方贝兹曲线。曲线起始于P0走向P1,并从P2的方向来到P3。一般不会经过P1或P2;这两个点只是用来充当控制点。P0和P1之间的间距,决定了曲线在转而趋进P3之前,走向P2方向的“长度有多长”。

曲线的参数形式为:

这里使用二次贝塞尔曲线实现抛物线运动:

代码如下

using DG.Tweening;
using System;
using System.Collections;
using UnityEngine;public class CurvedMoveEffect : MonoBehaviour
{private Action callback = null;[SerializeField]private GameObject startPos, endPos;private void Start(){MoveTo(startPos.transform.position, endPos.transform.position, 0.6f, 1, null);}private void OnComplete(){if (callback != null){callback.Invoke();}Destroy(gameObject);}/// <param name="centerOffset">中心点偏移量,0.5为基准,调整幅度0.01,根据实际调整</param>public void MoveTo(Vector3 startPos, Vector3 endPos, float centerOffset, float time = 0.5f, Action callback = null){this.callback = callback;gameObject.transform.position = startPos;gameObject.SetActive(true);StartCoroutine(Move(startPos, endPos, centerOffset, time, OnComplete));}//如果有拖尾效果,延迟一定时间再显示,否则尾巴会有残影IEnumerator Move(Vector3 startPos, Vector3 endPos, float centerOffset, float time = 0.5f, Action onComplete = null){TrailRenderer trail = gameObject.GetComponentInChildren<TrailRenderer>(true);yield return new WaitForSeconds(trail ? trail.time : 0);//如果路径点较少,可以使用CatmullRom曲线插值类型运动,默认PathType.Linear//同时可以设置easetype来使用不同的运动方式,其它easetype:https://blog.csdn.net/w0100746363/article/details/83587485//如果想让物体一直朝着路径方向可以加上SetLookAt(0):DOPath(path, time).SetLookAt(0);Tween tween = gameObject.transform.DOPath(Path(startPos, endPos, centerOffset, 6), time, PathType.CatmullRom).SetEase(Ease.OutSine);if (onComplete != null){tween.OnComplete(new DG.Tweening.Core.TweenCallback(onComplete));}if (trail)trail.enabled = true;}private Vector3[] Path(Vector3 startTrans, Vector3 endTrans, float centerCtl, int segmentNum){var startPoint = startTrans;var endPoint = endTrans;//中间点:起点和终点的向量相加再乘一个系数,系数可以根据实际调整var bezierControlPoint = (startPoint + endPoint) * centerCtl;//segmentNum为int类型,路径点数量,值越大,路径点越多,曲线越平滑Vector3[] path = new Vector3[segmentNum];for (int i = 0; i < segmentNum; i++){var time = (i + 1) / (float)segmentNum;//归化到0~1范围path[i] = GetBezierPoint(time, startPoint, bezierControlPoint, endPoint);//使用贝塞尔曲线的公式取得t时的路径点}return path;}/// <param name="t">0到1的值,0获取曲线的起点,1获得曲线的终点</param>/// <param name="start">曲线的起始位置</param>/// <param name="center">决定曲线形状的控制点</param>/// <param name="end">曲线的终点</param>private Vector3 GetBezierPoint(float t, Vector3 start, Vector3 center, Vector3 end){return (1 - t) * (1 - t) * start + 2 * t * (1 - t) * center + t * t * end;}
}

另外,相同的中间点偏移系数在场景中Canvas的不同Render Mode和MainCamera的不同Projection时都可能产生不同的效果,需要根据实际情况调整。

Unity 使用贝塞尔曲线实现抛物线运动相关推荐

  1. unity 控制点 贝塞尔曲线_在Unity中使用贝塞尔曲线(转)

    鼎鼎大名的贝塞尔曲线相信大家都耳熟能详.这两天因为工作的原因需要将贝塞尔曲线加在工程中,那么MOMO迅速的研究了一下成果就分享给大家了哦.贝塞尔曲线的原理是由两个点构成的任意角度的曲线,这两个点一个是 ...

  2. unity之贝塞尔曲线

    简介 什么是贝塞尔曲线 贝塞尔曲线(Bezier curve),又称 贝兹曲线 或 贝济埃曲线 ,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,当时主要用于汽车主体设计.现主要应 ...

  3. Unity ——使用贝塞尔曲线对三维管状物体进行弯曲

    参考链接:[Unity]弹性鱼竿简单实现-通过贝塞尔曲线修改Mesh - 简书 参考论文:吴晓亮, 黄襄念. Unity 中使用贝塞尔曲线对三维物体进行弯曲[J]. 现代计算机, 2016 (5): ...

  4. 【Unity】贝塞尔曲线关于点、长度、切线计算在 Unity中的C#实现

    写在前面 最近给项目做了个路径编辑,基本思路是满足几个基本需求: [额外说明]其实本篇和这个没关系,可以跳过"写在前面"这部分,跨到正文部分 编辑时: ① 随意增减.插入.删除路点 ...

  5. unity 控制点 贝塞尔曲线_在Unity中使用贝塞尔曲线

    前言 最近项目需要呈现各种轨道且随机性较强,在找了一天插件后打算自己实现平滑曲线,思路是策划对关卡中的轨道放置任意个节点,我通过代码将所有节点绘制成一条平滑的曲线,每两个节点之间通过三阶贝塞尔实现,最 ...

  6. Unity笔记-贝塞尔曲线

    定义 贝塞尔曲线(Bezier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线.一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像 ...

  7. unity 控制点 贝塞尔曲线_Handles.DrawBezier 绘制贝塞尔曲线

    Handles.DrawBezier 绘制贝塞尔曲线 static function DrawBezier (startPosition : Vector3, startTangent : Vecto ...

  8. 贝塞尔曲线实现抛物线运动,投掷功能实现

    贝塞尔曲线公式 /// <param name="t">0到1的值,0获取曲线的起点,1获得曲线的终点</param> /// <param name ...

  9. Unity画贝塞尔曲线自定义图片组件

    头一回写这个文章,也是就分享一点自己的学习心得,并且记录下自己做过的这个功能. 事实上我这也是借鉴了大佬的代码,统筹琢磨出来的,比较初级,但是有用. 话不多说,上效果图: 如图所见,展现出来的功能组件 ...

最新文章

  1. 是我太天真之被BUG按在地上疯狂摩擦
  2. java 底层方法_底层方法测试--【Java】
  3. 11g 64位部分安装过程
  4. 带参数的过滤器|| 过滤器案例:格式化日期|| time.js  ||
  5. union-find算法分析(1)
  6. IE与IE内核浏览器的那点事
  7. 怎么读取瑞萨mcu的 checksum_为物联网设备选择一颗“安全”的MCU
  8. Vue.js 介绍及其脚手架工具搭建
  9. python编程从入门到精通实践_《Python编程:从入门到实践》总结_Day01
  10. idea项目(git)版本回退
  11. Photoshop 入门教程「4」如何使用撤消命令?
  12. R语言不止可以做数据分析,还可以变着方法玩出花
  13. puppet学习—默认WEBRick安装DashBoard
  14. 6.面向对象的三大特征
  15. [转] Web前端开发工程师常用技术网站整理
  16. 软件开发模型-螺旋模型
  17. 格雷码转换成二进制c语言程序,各位老师格雷码和二进制有什么区别,怎么转换....
  18. ISO639等多语言列表信息
  19. html中电子邮件地址怎么写,电子邮件地址怎么写
  20. Only the Paranoid Survive

热门文章

  1. python发html邮件_在python中如何制作发送HTML格式的邮件?
  2. Kafka SSL 和 ACL 配置
  3. 总结:python代码实现矩阵最基本操作
  4. 硬件MSB最高位优先、LSB最低位优先的CRC计算原理详细解释和程序,正算反算成功等效,DS18B20和HTU31D传感器CRC
  5. ZBrush笔刷整理大合集
  6. 互动微剧《明星大侦探》打造沉浸式探案体验
  7. YOLO家族再度升级——阿里达摩院DAMO-YOLO重磅来袭
  8. 基于51单片机TLC2543芯片实现AD转换
  9. PhoneGapjQuery Mobile应用开发环境配置(For Android)
  10. 基于MatLab实现LSB(最低有效位)算法完成图片数字水印隐写功能