2012-11-14

Unity 3D 使用 Animation 工具調整 NGUI 之 UISprite 的 Color 及 Alpha 值

Unity 的 Animation 工具可以在 NGUI 的 UISprite 上增加位移,縮放,旋轉等動作控制,如下圖所示,圖中使用 Animation 工具編輯 Sprite 物件的位置資訊,值得注意的是,移動時間軸 (紅色垂直線) 即可同步觀察 Sprite 物件移動。

Animation 工具控制 Sprite 的位置資訊

但若更改 Sprite 的顏色 (Animation 工具的 MColor) ,會發現只有 Inspector 視窗內 Color Tint 屬性及 Previw 會依照時間軸的移動作相對應的變化,Scene 視窗裡 Sprite 的顏色沒有變化。如下圖所示,在時間軸所在位置的 Sprite 應該呈現黃色,但 Scene 內的 Sprite 仍然為紅色。

Animation 工具對顏色的控制

礙於 NGUI 程式架構的關係,無法直接以修改 MColor 參數的方法控制顏色。
本文提供方法讓 Animation 工具可以編輯顏色且 "在編輯的同時就可以同步觀察變化"
建立一 Component (C# Script 如下所述) 並加入到要編輯的物件上。
using UnityEngine;
using UnityEditor;
using System.Collections;
 
public class ngui_color_ani_setup : MonoBehaviour
{
    public float Alpha = 1.0f;
    public float Red = 1.0f;
    public float Green = 1.0f;
    public float Blue = 1.0f;
 
    protected UISprite uis = null;
 
    void LateUpdate()
    {
        setupcolor();
    }
 
    void OnDrawGizmos()
    {
        //關閉自動產生 keyframe
        //(避免因為更動 mColor 而自動產生新的 keyframe)
        SetDisableAutoRecordMode();
        setupcolor();
    }
 
    void setupcolor()
    {
        if (uis == null)
            uis = gameObject.GetComponent<UISprite>();
 
        uis.color = new Color(Red, Green, Blue, Alpha);
    }
 
    void SetDisableAutoRecordMode()
    {
        System.Type T =
            System.Type.GetType("UnityEditor.AnimationWindow,UnityEditor");
        Object[] allAniWindows = Resources.FindObjectsOfTypeAll(T);
        if (allAniWindows.Length > 0)
        {
            UnityEditor.EditorWindow win = 
                (UnityEditor.EditorWindow)allAniWindows[0];
            T.InvokeMember("SetAutoRecordMode",
                System.Reflection.BindingFlags.InvokeMethod,
                null,
                win,
                new object[1] { false });
        }
    }
 
}

如下圖所示,只要編輯 ngui_color_ani_setup 之值即可控制該 Sprite 之顏色,且在編輯時就能同步觀察顏色的變化。

編輯 NGUI 之 Sprite 的顏色動畫曲線,編輯時能同步觀察變化


0 意見 :

張貼留言