垂直运动
需求
多个校徽:1.垂直方向上在一定范围内来回移动 2. 自转
两种运动同时进行,多个校徽应该是形成错落有致的效果,不要同步运动
只用给定运动速度的最小值和最大值,程序自动执行校徽随机速度运动,不需要每个单独设置
实现逻辑
- 定义Emblem类
Emblem类用来存储单独校徽自身的Transform,动画,运动速度,方便统一管理和参数可视化。 - 随机速度与随机初始运动方向
使用Random.range(minSpeed, maxSpeed) 获得随机的运动速度。
使用Random.Range((int)0, (int)2)判断,0的时话一开始向上运动,1的话是一开始向下运动。 - 垂直上下运动的动画
上下运动通过DoTween的路径动画来实现。
路径点为三个点:自身初始位置点,上目标点,下目标点。其中上目标点是自身初始位置在Y轴上加上浮动范围的位置点,下目标点是自身初始位置在Y轴上减去浮动范围的位置点。
假如初始方向为向上运动,则路径为 [上目标点 --> 下目标点 --> 自身初始位置点],闭环路径。
假如初始方向为向下运动,则路径为 [下目标点 --> 上目标点 --> 自身初始位置点],闭环路径。 - 同时自转的动画
以DoTween的Sequence()函数控制边移动边旋转的动画。
emblemsArray[i].emblemTween = DOTween.Sequence()
.SetLoops(-1)
.Append (emblemsArray[i].emblemTrans.DOPath(pathPoints, emblemsArray[i].duration).SetEase(Ease.Linear))
.Insert(0.0f, emblemsArray[i].emblemTrans.DORotate(new Vector3(0, 180, 0),emblemsArray[i].duration)
.SetEase(Ease.Linear));
结构
Scene
|–EmblemFloat Controller
·EmblemController(脚本)
|–Cube_Emblem_01(校徽01)
|–Cube_Emblem_02(校徽02)
|–Cube_Emblem_03(校徽03)
|–Cube_Emblem_04(校徽04)
|–Cube_Emblem_05(校徽05)
效果图如下
旋转运动
需求
【动画】主标题(烽火弦歌)和副标题(抗战时期华南学校迁徙办学档案史料展)立体字,环绕序厅大树水平旋转,其中旋转速度动态平滑变化,立体字在面向镜头时速度最慢,背向镜头时最快。
实现逻辑
1.计算路径点
根据标题字体和大树的位置可求出圆形路线上的路径点。因为忽略Y轴,以下以 X-Z 二维平面讲解:大树为圆心,标题字体为圆上的点,从该点依次计算出每次旋转 x 弧度后的点,这些点即作为路径点。首先计算初始位置在圆上相对大树的X-axis方向呈多少夹角,根据以下公式进行循环计算所有路径点(路径点个数可设置):
圆心(c1,c2),旋转角度 θ,半径 r ,旋转后得到的点(x1,y1)
x1 = c1 - r * sin(θ)
y1 = c2 + r * cos(θ)
其中 θ = 360除以路径点个数得到,r = 大树到标题字体的X-Z平面上的直线距离
2. 环绕旋转运动
在获得圆形路线上的路径点后,利用这些路径点通过DoTween的路径动画进行环形运动
tweenOfRotation = tweenOBJ
.DOPath (circlePoints, 10.0f, PathType.CatmullRom ) //设置路径为曲线
.SetEase (Ease.Linear) //设置运动状态为匀速运动
.SetLookAt( centerPoint) //设置标题字体一直看向大树
.SetLoops(-1) //设置一直循环运动
.SetOptions(true ); //设置运动路径为闭环,即头尾相连
3.判断什么时候该慢该快
通过判断 向量(大树- > 标题字体)和 向量(大树 -> 用户)之间的夹角是否符合设定的角度范围内,以达到标题字体在环绕移动时一旦进入靠近用户的那一段弧线则运动变得缓慢,一离开该区间则回复原本运动速度。
4.控制局部动画(环绕运动)的速度
因为运动是一直循环的,只能通过控制timeScale来达到控制速度的效果。在不影响其他动画的速度前提下,需要控制单独的Tween的timeScale。
如:改运动的动画是tweenOfRotation,则可通过 “tweenOfRotation.timeScale =0.2f;” 来改变。
结构
Scene
|–Player
|–TitleRotationController
·TitleRotationController(脚本)
|—CenterObject(大树物体)
|—Cube_Move(标题字体物体)
脚本TitleRotationController参数
效果图