示例#1
0
    // Update is called once per frame
    void Update()
    {
        if (!myMat)
        {
            myMat = myGo.GetComponent <MeshRenderer>().material;
        }
        float betweenAngle = GetRealAngle(transform.eulerAngles.y, preFrameAngle.y);

        if (Mathf.Abs(betweenAngle) > float.Epsilon)
        {
            qTimer.StartOrReset(lerpTime);
        }
        if (qTimer.IsRuning())
        {
            if (qTimer.IsOK())
            {
                recordAngle       = transform.eulerAngles;
                recordRadio       = 0;
                recordChangeAngle = 0;
            }
            else
            {
                float angleToRecord = GetRealAngle(recordAngle.y, transform.eulerAngles.y);



                //if (Mathf.Abs(angleToRecord) >= LimitValue)
                //{
                //    //如果夹角大于了限定角度,直接设置到限定角度
                //    float radio = angleToRecord >= 0 ? 1 : -1;
                //    float toAngle = (Mathf.Abs(angleToRecord)-LimitValue) * radio;
                //    myMat.SetMatrix("_TempLightPos", GetMatrix(new Vector3(0, -toAngle, 0)));
                //    //同时重新设定计时器和记录的角度
                //    qTimer.StartOrReset(lerpTime);
                //  //  recordAngle = (Quaternion.Euler(0, transform.eulerAngles.y, 0) * Quaternion.Euler(0, LimitValue * radio, 0)).eulerAngles;
                //  //  Debug.LogError("-----:"+ transform.eulerAngles.y+"  "+ recordAngle.y);
                //}
                //else
                //{
                //    float deltaAngle = angleToRecord * (1 - qTimer.GetPercent());
                //    myMat.SetMatrix("_TempLightPos", GetMatrix(new Vector3(0, deltaAngle, 0)));
                //}

                //如果是符号发生了变化,那就说明已经转了180度了,如果当前已经是超出最大角度了,则不进行其他处理
                //还有一种情况,就是转了一个大圈,转回来了,这种需要记录知道上一个记录的角度和现在的角度

                //1.突变不予理会,假定突变角度为60,则认为任何超过60度突变的行为,都不会影响此次衰减,正常的操作
                //都会是有过程的。没有过程的操作不建议使用这种衰减。

                int   radio      = angleToRecord >= 0 ? 1 : -1;
                float deltaAngle = 0;
                if (recordRadio == 0)
                {
                    recordRadio       = radio;
                    recordChangeAngle = radio * Mathf.Min(angleToRecord * radio, LimitValue);
                    deltaAngle        = recordChangeAngle * (1 - qTimer.GetPercent());
                }
                else
                {
                    //符号反向,或者符号相同,数值变小,我们认为是逆向旋转,只要是逆向旋转,都认为是突变
                    if (recordRadio != radio)
                    {
                        //有可能的一种情况是先转了5,然后反向转到-5,也是符号相反了
                        //说明一应超过了一定角度了,继续使用最大角度
                        deltaAngle        = recordRadio * LimitValue * (1 - qTimer.GetPercent());
                        recordChangeAngle = recordRadio * LimitValue;
                    }
                    else
                    {
                        recordChangeAngle = radio * Mathf.Min(angleToRecord * radio, LimitValue);
                        //当转动了一大圈回来之后,如果跟记录的数据差距很大则忽略影响
                        //比如,上一次是56,转了330度后,变成26度。如果不做限制,就会变成从56到26的突变。
                        //那我们如何确定突变数值,我们认为一帧的变化数据不能超过LimitValue*0.04的角度,凡是超过了这个角度
                        //的突变,都是无效的变化。继续执行上一次的数据
                        deltaAngle = recordChangeAngle * (1 - qTimer.GetPercent());
                    }
                }

                Debug.LogError("=============:" + angleToRecord + "    " + deltaAngle + "  " + Time.frameCount);
                myMat.SetMatrix("_TempLightPos", GetMatrix(new Vector3(0, deltaAngle, 0)));
            }
        }
        preFrameAngle = transform.eulerAngles;
    }