最近项目需要设置围绕路点进行弧线运动,并且每个弧线的都不相同。

首先想到了椭圆形的弧线运动,试做了一版,策划认为弧线的弧度还是达不到要求。

于是,思考贝塞尔曲线运动,网上搜了一下贝塞尔曲线的方法

参考:Unity 工具类 之 贝塞尔 Bezier 曲线_仙魁XAN-CSDN博客

在此基础上只能说是完成关键的路径信息,但是如何运动以及如何配置还不能够完善。

第一步:生成曲线

贝塞尔曲线,通过四个点(包括起始点、终点)生成曲线

如图-四条曲线:

每个Cube对应路径的曲线

其中:point1/2/3/4各对应cube/1/2/3的四个点的位置信息,目的是为了可视化操作(这里完全可以直接填入四个关键点)

第二步:正向运动

借助DoTween的DoPath(当然,已知这条路径上的路径点,完全可以update下完成操作)

我这里为了方便:

Tween pathTween = temp.moveObj.DOPath(temp.points, m_duration, PathType.CatmullRom);
pathTween.SetEase(temp.pathData.speedCure);
pathTween.SetLoops(-1, LoopType.Restart);
pathTween.onComplete = delegate { Debug.LogError("pathTween Complete"); };

效果是这样:

第三步:运动的同时加入缩放比例

Sequence mSquence = DOTween.Sequence();
Tween pathTween = temp.moveObj.DOPath(temp.points, m_duration, PathType.CatmullRom);
pathTween.SetEase(temp.pathData.speedCure);
pathTween.SetLoops(-1, LoopType.Restart);
pathTween.onComplete = delegate { Debug.LogError("pathTween Complete"); };
Tween scaleTween1 = temp.moveObj.DOScale(temp.pathData.scale, temp.pathData.timeNode);
scaleTween1.onComplete = delegate { Debug.LogError("scaleTween1 Complete"); };
Tween scaleTween2 = temp.moveObj.DOScale(Vector3.one, m_duration-temp.pathData.timeNode);
scaleTween2.onComplete = delegate { Debug.LogError("scaleTween2 Complete"); };
mSquence.Insert(0,pathTween);
mSquence.Insert(0, scaleTween1);
mSquence.Insert(1, scaleTween2);mSquence.SetAutoKill(false);
mSquence.Pause();
mSquence.onComplete = delegate
{Debug.LogError("Squence Complete");
};
sequenceList.Add(mSquence);

这里用到了:Dotween的Sequence 参考:DOTween Sequence 使用图解_J.J.Cat's Blog-CSDN博客

这里面的timeNode是一个时间节点,指的是在某一个时间点或者说到达某时间点干什么事。

效果:

第五步:运动过去之后还能反向操作

直接在Sequence上去调用PlayBackward()

注意:必须有mSquence.SetAutoKill(false);这一句,默认是true,会直接kill掉

效果:

所有代码:

[Serializable]public class PathData{public AnimationCurve speedCure;public float timeNode;public Vector3 scale;}[Serializable]public class BezierData{public Transform moveObj;public PathData pathData;public Transform[] controlPoints;public Vector3[] points;}public class BezierMotion : MonoBehaviour{public List<BezierData> data;public float m_duration = 0.8f;private List<Sequence> sequenceList;// 设置贝塞尔插值个数private int _segmentNum = 50;void OnEnable(){sequenceList = new List<Sequence>();RefreshPathData();}void Update(){//updatePoints();//UpdatePosition();}private void OnDrawGizmos(){Color defaultColor = Gizmos.color;int idx = 0;foreach (var temp in data){switch (idx){case 0:Gizmos.color = Color.green;break;case 1:Gizmos.color = Color.blue;break;case 2:Gizmos.color = Color.black;break;case 3:Gizmos.color = Color.red;break;default:Gizmos.color = Color.green;break;}idx++;int posIndex = 0;Vector3 posTemp = Vector3.zero;foreach (var pos in temp.points){if (posIndex == 0){posTemp = pos;}else{Gizmos.DrawLine(posTemp, pos);}posTemp = pos;posIndex = 1;}Gizmos.color = defaultColor;}// 恢复默认颜色Gizmos.color = defaultColor;}void updatePoints(){foreach (var temp in data){temp.points = null;temp.points = BezierUtils.GetThreePowerBezierList(temp.controlPoints[0].position, temp.controlPoints[1].position, temp.controlPoints[2].position, temp.controlPoints[3].position, _segmentNum);}}private int temp = 0;private int index = 0;void UpdatePosition(){foreach (var temp in data){if (index >= temp.points.Length)continue;temp.moveObj.position = temp.points[index];}temp++;if (temp > 60){index--;if (index == 0){temp = 0;}}else{index++;}}public void DoPathStart(){for (int i=0; i < sequenceList.Count; i++){sequenceList[i].PlayForward();}}public void DoPathBack(){for (int i=0; i < sequenceList.Count; i++){sequenceList[i].PlayBackwards();}}public void DoPathEnd(){for (int i=0; i < sequenceList.Count; i++){sequenceList[i].Kill();}sequenceList.Clear();}public void RefreshPathData(){DoPathEnd();foreach (var temp in data){if (temp.moveObj == null){continue;}temp.moveObj.position = temp.controlPoints[0].position;}updatePoints();foreach (var temp in data){Sequence mSquence = DOTween.Sequence();Tween pathTween = temp.moveObj.DOPath(temp.points, m_duration, PathType.CatmullRom);pathTween.SetEase(temp.pathData.speedCure);pathTween.SetLoops(-1, LoopType.Restart);pathTween.onComplete = delegate { Debug.LogError("pathTween Complete"); };Tween scaleTween1 = temp.moveObj.DOScale(temp.pathData.scale, temp.pathData.timeNode);scaleTween1.onComplete = delegate { Debug.LogError("scaleTween1 Complete"); };Tween scaleTween2 = temp.moveObj.DOScale(Vector3.one, m_duration-temp.pathData.timeNode);scaleTween2.onComplete = delegate { Debug.LogError("scaleTween2 Complete"); };mSquence.Insert(0,pathTween);mSquence.Insert(0, scaleTween1);mSquence.Insert(1, scaleTween2);mSquence.SetAutoKill(false);mSquence.Pause();mSquence.onComplete = delegate{Debug.LogError("Squence Complete");};sequenceList.Add(mSquence);}}}
 [CustomEditor(typeof(BezierMotion), true)]public class BezierMotionEditor : Editor{private BezierMotion montion;private void OnEnable(){montion = (BezierMotion)target;}public override void OnInspectorGUI(){base.OnInspectorGUI();if (GUILayout.Button("开始运动")){montion.DoPathStart();}if (GUILayout.Button("反向运动")){montion.DoPathBack();}if (GUILayout.Button("停止运动")){montion.DoPathEnd();}if (GUILayout.Button("刷新路径")){montion.RefreshPathData();}}}

一些坑:

[CustomEditor(typeof(BezierMotion), true)] 如果不填true的话会提示:Multi-object editing not supported

squence Insert必须从0开始 append不能同时多个动画 join也不能同时多个动画

sequence Insert 第一个参数为时间,第二个参数为tween

join 在上一个tween末尾加进来,与接下来的并行执行

Unity 路径点弧线运动相关推荐

  1. 【游戏开发实战】Unity 2D游戏物理运动曲线轨迹预测,以愤怒的小鸟为例,轨迹曲线云团圈圈

    文章目录 一.前言 二.思考分析 三.场景搭建 1.导入图片素材 2.鸟预设 3.地面环境 4.曲线的点预设 5.预览效果 四.代码 1.鸟脚本:Bird.cs 2.曲线预测器:Trajectory. ...

  2. unity android sd卡路径,一、文件与路径——2、unity路径特点写法和文件读写全攻略...

    1.Unity中各路径和目录的对应关系 image.png 其中,安卓中的路径是有两种分支的 image.png 在打包面板中,有个Write Access 当我们选择Internal Only就是表 ...

  3. css3 实现元素 弧线运动

    如何使用CSS控制元素弧线运动 我们都知道,CSS3的新属性transfrom过渡效果可以实现元素位移.旋转.缩放.结合animation属性,就可以实现元素的动画效果.但是如何通过css实现元素实现 ...

  4. unity3d android 路径动画制作,Lesson11.Unity路径动画、路径变形动画实现方式

    鲸鱼的絮絮叨叨 Lesson01.unity简介和菜单栏介绍 Lesson02.unity粒子系统_1 Lesson02.unity粒子系统_2 Lesson03.3dmax粒子系统_1 Lesson ...

  5. 知乎 运动规划和路径规划_运动路径–过去,现在和未来

    知乎 运动规划和路径规划 Making animations that "feel right" can be tricky. 制作"感觉不错"的动画可能很棘手 ...

  6. 【Unity】控制小球运动

    跟着B站教程,做了个简单的控制小球运动的场景,记录一下: 文章目录 搭建场景 小球运动脚本 相机跟随小球运动脚本 效果展示 搭建场景 建立地面Plane.小球Player和四面墙Wall. 小球运动脚 ...

  7. Unity Dotween插件的运动曲线(Ease)介绍Ease选项Ease效果示例以及C#修改动画曲线功能

    前言 我们在制作动画时经常使用这个Dotween插件,在移动.旋转.透明度等等参数的控制都可以使用该插件,而且在这个插件上的控制动画可以设置曲线,内置的曲线有这些: 内置曲线 以InOutSine的曲 ...

  8. 【计算机动画】实验 路径曲线与运动物体控制/FFD/关键帧动画

    https://github.com/Birdy-C/homework_computeranimation 下面是第一个实验的报告.当时大概是闲的无聊会把它复制出来吧-- 转载于:https://ww ...

  9. Flash动画学习指南七:运动路径

    转自:http://bbs.9ria.com/thread-76164-1-1.html 本帖最后由 chocoZero 于 2011-3-16 14:18 编辑 准备知识:Flash工作空间的基本知 ...

  10. html5 路径运动,探秘神奇的运动路径动画 Motion Path

    CSS 中有一个非常有意思的模块 -- CSS Motion Path Module Level 1,翻译过来也就是运动路径.本文将对 motion path 一探究竟,通过本文,你可以了解到:什么是 ...

最新文章

  1. SQL链表查询 数据库为空
  2. [YTU]_2635(P4 游戏中的Human角色)
  3. java 枚举_Java中的枚举类型(Enum)详解
  4. io和nio的缓冲_IO与NIO –中断,超时和缓冲区
  5. UVA 10635——Prince and Princess
  6. USACO Training Section 5.1 Fencing the Cows 圈奶牛(凸包)
  7. VS2017 启动调试报错无法启动程序 当前状态中非法
  8. PHP 常用代码大全
  9. 信贷三类业务风险如何把控
  10. 如何巧妙使用Camtasia库中的素材?
  11. Floyd 多源最短路径
  12. linux qgis编译安装,QGIS安装
  13. php开源桌面会议系统,开源视频会议系统 OpenMeetings
  14. 大数据存储峰会4月9日深圳开幕
  15. vue中使用海康插件实现视频监控-前端给视频画面中添加文字
  16. could not find driver
  17. 八股文写春联会是什么样子?
  18. 360 android系统 流量,360流量卫士 for Android
  19. MIP 和 MinIP
  20. 机器学习四大数据降维方法详解

热门文章

  1. hdu1260Tickets
  2. 个人和企业都免费的office办公软件
  3. mumu模拟器Android版本才6,MuMu模拟器官方下载
  4. ACM/IOI 历年国家集训队论文集和论文算法分类整理
  5. 线性插值_c语言实现
  6. 多开助手完美版,APP一键多开,支持安卓10
  7. 树套树【bzoj3262】陌上花开
  8. java 用word模板打标签,并插入图片 动态生成word
  9. Android Framework 音频子系统(02)音频系统框架
  10. python学习笔记6---数据解析