Unity 路径点弧线运动
最近项目需要设置围绕路点进行弧线运动,并且每个弧线的都不相同。
首先想到了椭圆形的弧线运动,试做了一版,策划认为弧线的弧度还是达不到要求。
于是,思考贝塞尔曲线运动,网上搜了一下贝塞尔曲线的方法
参考: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 路径点弧线运动相关推荐
- 【游戏开发实战】Unity 2D游戏物理运动曲线轨迹预测,以愤怒的小鸟为例,轨迹曲线云团圈圈
文章目录 一.前言 二.思考分析 三.场景搭建 1.导入图片素材 2.鸟预设 3.地面环境 4.曲线的点预设 5.预览效果 四.代码 1.鸟脚本:Bird.cs 2.曲线预测器:Trajectory. ...
- unity android sd卡路径,一、文件与路径——2、unity路径特点写法和文件读写全攻略...
1.Unity中各路径和目录的对应关系 image.png 其中,安卓中的路径是有两种分支的 image.png 在打包面板中,有个Write Access 当我们选择Internal Only就是表 ...
- css3 实现元素 弧线运动
如何使用CSS控制元素弧线运动 我们都知道,CSS3的新属性transfrom过渡效果可以实现元素位移.旋转.缩放.结合animation属性,就可以实现元素的动画效果.但是如何通过css实现元素实现 ...
- unity3d android 路径动画制作,Lesson11.Unity路径动画、路径变形动画实现方式
鲸鱼的絮絮叨叨 Lesson01.unity简介和菜单栏介绍 Lesson02.unity粒子系统_1 Lesson02.unity粒子系统_2 Lesson03.3dmax粒子系统_1 Lesson ...
- 知乎 运动规划和路径规划_运动路径–过去,现在和未来
知乎 运动规划和路径规划 Making animations that "feel right" can be tricky. 制作"感觉不错"的动画可能很棘手 ...
- 【Unity】控制小球运动
跟着B站教程,做了个简单的控制小球运动的场景,记录一下: 文章目录 搭建场景 小球运动脚本 相机跟随小球运动脚本 效果展示 搭建场景 建立地面Plane.小球Player和四面墙Wall. 小球运动脚 ...
- Unity Dotween插件的运动曲线(Ease)介绍Ease选项Ease效果示例以及C#修改动画曲线功能
前言 我们在制作动画时经常使用这个Dotween插件,在移动.旋转.透明度等等参数的控制都可以使用该插件,而且在这个插件上的控制动画可以设置曲线,内置的曲线有这些: 内置曲线 以InOutSine的曲 ...
- 【计算机动画】实验 路径曲线与运动物体控制/FFD/关键帧动画
https://github.com/Birdy-C/homework_computeranimation 下面是第一个实验的报告.当时大概是闲的无聊会把它复制出来吧-- 转载于:https://ww ...
- Flash动画学习指南七:运动路径
转自:http://bbs.9ria.com/thread-76164-1-1.html 本帖最后由 chocoZero 于 2011-3-16 14:18 编辑 准备知识:Flash工作空间的基本知 ...
- html5 路径运动,探秘神奇的运动路径动画 Motion Path
CSS 中有一个非常有意思的模块 -- CSS Motion Path Module Level 1,翻译过来也就是运动路径.本文将对 motion path 一探究竟,通过本文,你可以了解到:什么是 ...
最新文章
- SQL链表查询 数据库为空
- [YTU]_2635(P4 游戏中的Human角色)
- java 枚举_Java中的枚举类型(Enum)详解
- io和nio的缓冲_IO与NIO –中断,超时和缓冲区
- UVA 10635——Prince and Princess
- USACO Training Section 5.1 Fencing the Cows 圈奶牛(凸包)
- VS2017 启动调试报错无法启动程序 当前状态中非法
- PHP 常用代码大全
- 信贷三类业务风险如何把控
- 如何巧妙使用Camtasia库中的素材?
- Floyd 多源最短路径
- linux qgis编译安装,QGIS安装
- php开源桌面会议系统,开源视频会议系统 OpenMeetings
- 大数据存储峰会4月9日深圳开幕
- vue中使用海康插件实现视频监控-前端给视频画面中添加文字
- could not find driver
- 八股文写春联会是什么样子?
- 360 android系统 流量,360流量卫士 for Android
- MIP 和 MinIP
- 机器学习四大数据降维方法详解