案例下载
写项目时会遇到一些问题,比如物体 位移 时又要 旋转(甚至缩放、相机视角都要同时改变);
一般实现的方式为:
Vector3.MoveTowards(transform.localPosition, targetPos, Time.deltaTime*posFactor);
Quaternion.RotateTowards(transform.localRotation, targetEuler,Time.deltaTime*eulerFactor);
通过调整posFactor和eulerFactor的方式来控制物体的位移和旋转时间,但是往往两者很难达到同步。而且调整起来非常麻烦。
以下介绍两种方式实现:
way1:插件;有个简单好用的插件,dotween,只需要把每个参数的时间设置一致即可。使用方法不做过多介绍,网上很多栗子。
way2:内置函数实现。
Vector3.MoveTowards、Quaternion.RotateTowards的重载中最后均有一个相关参数,maxDistanceDelta和maxDegreesDelta,移动限速和角速度。
控制不同参数的相关速度从而达到同时运行同时结束的目的。
上代码:demo地址(Supported For Unity2018.2.10f1)
//private float _cameraFieldOfViewMaxDelta;//相机视角变换移动速率
private float _scaleMaxDelta;变换移动速率
private float _rotateMaxDelta;//变换旋转角速度
private float _moveMaxDelta;//变换缩放速率
public bool IsCalculated;//是否计算了
void Update () {
_setController(60f,new Vector3(30,45,60), new Vector3(20,15,13),new Vector3(0.8f,1.2f,1.4f) );
}
///
/// 移动变换函数
///
/// 相机的FOV值
/// vec3值计算旋转速率,旋转时转换为euler角度值
/// 移动的目标位置
/// 缩放的目标值
/// 速度系数
public void _setController(float cameraField,Vector3 vector3ToEuler, Vector3 movePos,Vector3 changeScale, float speedFactor = 1.5f)
{
if (!IsCalculated)//计算Transform的各个速率值
{
//_cameraFieldOfViewMaxDelta = (Mathf.Abs(cameraField - Camera.main.fieldOfView) * Time.deltaTime) / speed;
_scaleMaxDelta = (Vector3.Distance(changeScale, transform.localScale) * Time.deltaTime) / speedFactor;
_rotateMaxDelta = (Vector3.Distance(vector3ToEuler, transform.localEulerAngles) * Time.deltaTime) / speedFactor;
_moveMaxDelta = (Vector3.Distance(movePos, transform.localPosition) * Time.deltaTime) / speedFactor;
IsCalculated = true;
}
//按照计算好的速率进行变换
//Camera.main.fieldOfView = Mathf.MoveTowards(Camera.main.fieldOfView, cameraField, _cameraFieldOfViewMaxDelta);
transform.localScale = Vector3.MoveTowards(transform.localScale, changeScale, _scaleMaxDelta);
transform.localPosition = Vector3.MoveTowards(transform.localPosition, movePos, _moveMaxDelta);
transform.localRotation = Quaternion.RotateTowards(transform.localRotation, Quaternion.Euler(vector3ToEuler), _rotateMaxDelta);
}
That’s All。