Skip to main content
VRCHINA
AR论坛
 首页 » 资源教程 » Unity3D教程

时光煮雨 Unity3d 序列目标点的移动(二)

2016年12月10日 00:12:083600蛮牛网

背景

在上篇也就是①,共享出来了网络上找的一些实现序列目标点移动的方案和代码。这篇的目的主要是加一些自己代码,增强实现,当然在实现的过程中,也对于动画的另一个角度有点感悟,特此记录一下。本文的主题有两个

一、通过时间线和MoveTwards实现序列目标点的移动;

二、基于帧率(时间)的动画实现初探(UniRX实现)

时光煮雨 Unity3d 序列目标点的移动(二) Unity3D教程 第1张

 

2实现

一、通过时间线和MoveTwards实现序列目标点的移动

A、还记得上篇老外的简单实现吗?

B、这里我做了下简单的封装代码和简单,添加了一个启动控制,循环播放控制,提取到一个函数中

在awake中,初始化目标点

时光煮雨 Unity3d 序列目标点的移动(二) Unity3D教程 第2张

 

至此一个简单的可控的序列点移动动画已经实现了。

C、基于时间线序列点移动动画实现

实际原理就是通过时间比控制插值移动

时光煮雨 Unity3d 序列目标点的移动(二) Unity3D教程 第3张


 

时光煮雨 Unity3d 序列目标点的移动(二) Unity3D教程 第4张

小总结,至此简单的基于MoveTowards和基于时间线的序列目标点移动的功能代码完成了,这里整体看来是基于MoveTowards的移动代码比较简洁,而基于时间线的扩展性更强,比如可以控制两点之间的移动方式等等,实际上还是可以继续扩展的。

二、基于帧率(时间)的动画实现初探(UniRX实现)

展开这个主题首先需要弄明白两个问题

1、什么是线性插值(Lerp),为什么要进行线性插值,才能使动画平滑?

2、如果场景中有很多物体都放在Update中,每个物体都是逐帧更新的,会不会有执行效率的问题?

1答案,为什么要进行线性插值?主要Update的帧率是不确定的,有波动,如果Update中执行定步长step位移,动画就会出现跳动不平滑的现象,如果要平滑必须按照时间匀速运动。

2答案,我是觉得的所有的动画都放在Update中逐帧执行,应该是没有必要的,会有性能上的浪费。

回答了这两个问题,才会有我们这个主题,就是基于时间线的动画而不是帧动画,看下面的代码

这是我的Awake函数,其实带有注释的Observable.的系列函数是UniRx的帧控制系列观察者函数的一部分,其实不使用UniRx自己用变量控制也是可以实现,原理相同。这里主要是还是想说明,其实完全可以每两帧做一次平移或者每隔多少毫秒进行一次移动。

这里我做了测试,基于隔帧或者进行抽样的平移都会出现不同程度的抖动(不平滑)我猜测可能是和问题1有关,如果有大牛路过可以解惑下。

评论列表暂无评论
发表评论