1. 程式人生 > >[Unity]CutScene工具Cinema Suite Rotion 角度不能負數方向旋轉的bug修正。

[Unity]CutScene工具Cinema Suite Rotion 角度不能負數方向旋轉的bug修正。

美術使用這個工具做動畫時,對一些物體旋轉,結果想 y軸方向 從0 往-30° 旋轉,結果編輯模式自動會變出來一個 330°的關鍵幀。。。。完全不是美術預期。


研究發現原來 Unity的根本機制, 編輯工具Vector3支援負數,但 賦值給 localEulerAngles,unity自動會換算到 0~360
沒法處理這裡。

只能在編輯器,判斷是否要插關鍵幀的程式碼裡做判斷。

CinemaCurveControl.cs 裡,checkToAddNewKeyframes 函式裡 加了判斷是修改localEulerAngles,則把負數的情況換算一下,如果一致則不要加關鍵幀了。 完美解決這個問題。



                else if (typeInfo == PropertyTypeInfo.Vector3)
                {
                    Vector3 vec3 = (Vector3)value;
                    float curve1Value = data.Curve1.Evaluate(state.ScrubberPosition);
                    float curve2Value = data.Curve2.Evaluate(state.ScrubberPosition);
                    float curve3Value = data.Curve3.Evaluate(state.ScrubberPosition);

                    //解決編輯轉向時 角度不能為負的bug
                    if ("localEulerAngles" == data.PropertyName)
                    {
                        if (curve1Value < 0 && Mathf.Approximately(curve1Value % 360 + 360, vec3.x))
                        {
                            vec3.x = curve1Value;
                        }
                        if (curve2Value < 0 && Mathf.Approximately(curve2Value % 360 + 360, vec3.y))
                        {
                            vec3.y = curve2Value;
                        }
                        if (curve3Value < 0 && Mathf.Approximately(curve3Value % 360 + 360, vec3.z))
                        {
                            vec3.z = curve3Value;
                        }
                    }

                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.x, curve1Value, data.Curve1, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.y, curve2Value, data.Curve2, state.ScrubberPosition);
                    hasDifferenceBeenFound |= addKeyOnUserInteraction(vec3.z, curve3Value, data.Curve3, state.ScrubberPosition);
                    
                }