Unity如何控制物体的旋转、移动、缩放等参数同时进行且同时结束

案例下载
写项目时会遇到一些问题,比如物体 位移 时又要 旋转(甚至缩放、相机视角都要同时改变);
一般实现的方式为:

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) );
	}
    /// <summary>
    /// 移动变换函数
    /// </summary>
    /// <param name="cameraField">相机的FOV值</param>
    /// <param name="vector3ToEuler">vec3值计算旋转速率,旋转时转换为euler角度值</param>
    /// <param name="movePos">移动的目标位置</param>
    /// <param name="changeScale">缩放的目标值</param>
    /// <param name="speedFactor">速度系数</param>
    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。

猜你喜欢

转载自blog.csdn.net/gheartsea/article/details/92435043