Unity3D – iTween for UGUI Element Component – (Image Color)

簡介

當我們想要在Unity中在一定時間內進行物件的”平滑動態移動”,有一個套件叫做”ITween”,這常是大家耳熟能詳的外掛套件,也是很好使用的工具。只需要參考官方文件提供的程式碼直接使用即可。

MoveTo(GameObject target, Vector3 position, float time)

如上段程式碼所示,需要輸入三種資料型態,GameObject(場景物件)、Vector3(目標位移三維空間位置)、Float(移動時間),我們可以看到在ITween預設的位移場景物件是GameObject,那我們這篇是要講述假如我們想要Tween的物件不是GameObject而是UGUI,要怎麼辦?以下我們則會講述實作方法。

事前設定

請先開啟Unity Asset Store下在Free版本的ITween套件,快速連結
大家可以到Plugin→Pixelplacement→ITween→Sample來開啟範例場景, 先執行看看ITween的程式有沒有在你環境中正常執行。

大家可以看到上圖場景中該物件點下去後,在Inspector視窗中有一個Script Component叫做MoveSample.cs,按右鍵點選Edit Script。

iTween.MoveBy(gameObject, iTween.Hash("x", 2, "easeType", "easeInOutExpo", "loopType", "pingPong", "delay", .1));
//官方MoveBy 範例如下
//MoveBy(GameObject target, Vector3 amount, float time)
//MoveBy(GameObject target, Hashtable args)

可以看到程式碼,Sample中是使用第二種範例,在gameobject後面的iTween.Hash是Hashtale資料型態,在裡面帶有(移動目標位置、移動曲線、移動方式、是否要重複執行、位移模組、是否要延遲、延遲時間)(這可以在官方參考文件找),這一方面是要看你環境可不可以執行,另一方面是讓大家熟悉itween的運作與itween物件,是object。

建置UGUI Image 與 修改ITween.cs

我們在場景中新增UGUI物件→Image,新增後可以點選Image物件可以看到它有個Component叫做Image(Script),我們可以視做Image視個GameObject。那我們接著請打開ITween的原始碼。

Step1 : 新增UGUI name Space
當開啟程式碼時,可以看到如下圖有個地方叫做NameSpace,為了要讓程式碼認得UGUI的Components,就必須新增一段程式碼: using UnityEngine.UI;
個人建議做了每一動都計的存檔,ctrl + S。

Step2 : 我們的目的是要變化Image→Color,所以這邊我們會用到ITween的其中一個方法,叫做ColorFrom。下方是官方提供的程式碼。而在我們環境中的程式碼請使用Ctrl + F5來找到 ColorFrom 。
請搜尋 “public static void ColorFrom(GameObject target, Hashtable args)” 類別。

ColorFrom(GameObject target, Hashtable args)
ColorFrom(GameObject target, Color color, float time)

Step3 : 請在此類別大括弧中加入以下程式碼,(在文章後面附上整個ColorFrom的完整程式碼),用意是除了GameObject物件之外,我們還想要加入UGUI,而且在UGUI中我們想要控制Image的color,所以要使用target(UGUI物件).GetComponent(取得物件子元素)<Image>(子元素名稱)().color(元素中的public參數,我們就是要改變此參數,進而改變物件的顏色)。

if(target.GetComponent<Image>())
{
  tempColor = fromColor = target.GetComponent<Image>().color;
}

Step4 : 為了驗證時作了以上動作後可以真的Tween UGUI的Color必須在新增一個程式碼,用來啟動此效果,程式碼如下。你先新增一個C# Script並將她拖到UGUI物件中,當成此物件的子元件。以下程式碼是用透過鍵盤按下A則可觸發itween的ColorFrom – 紅色 至 ColorTo -黃色。

void Update()
    {
        if(Input.GetKeyDown(KeyCode.A))
        {
            iTween.ColorFrom(this.gameObject, Color.red, 1f);
            iTween.ColorTo(this.gameObject, Color.yellow, 1f);
        }
    }

Step5 : 可以看到實際執行結果,確實ITween除了gameobject之外,UGUI也是可以來使用的。

小結

當我們把ITween的類別檔案改成可以使用UGUI後,大家可以嘗試Tween UGUI中的不同元素,本篇是在實現Image Color也可以使用到ITween來做顏色的轉換,在下一篇會提到並實驗UGUI中實用的元件與參數的轉換。

    public static void ColorFrom(GameObject target, Hashtable args)
    {
        Color fromColor = new Color();
        Color tempColor = new Color();

        //clean args:
        args = iTween.CleanArgs(args);

        //handle children:
        if (!args.Contains("includechildren") || (bool)args["includechildren"])
        {
            foreach (Transform child in target.transform)
            {
                Hashtable argsCopy = (Hashtable)args.Clone();
                argsCopy["ischild"] = true;
                ColorFrom(child.gameObject, argsCopy);
            }
        }

        //set a default easeType of linear if none is supplied since eased color interpolation is nearly unrecognizable:
        if (!args.Contains("easetype"))
        {
            args.Add("easetype", EaseType.linear);
        }

        //set tempColor and base fromColor:
        if (target.GetComponent<GUITexture>())
        {
            tempColor = fromColor = target.GetComponent<GUITexture>().color;
        }
        else if (target.GetComponent<GUIText>())
        {
            tempColor = fromColor = target.GetComponent<GUIText>().material.color;
        }
        else if (target.GetComponent<Renderer>())
        {
            tempColor = fromColor = target.GetComponent<Renderer>().material.color;
        }
        else if (target.GetComponent<Light>())
        {
            tempColor = fromColor = target.GetComponent<Light>().color;
        }
        else if (target.GetComponent<Graphic>())
        {
            tempColor = fromColor = target.GetComponent<Graphic>().color;
        }else if(target.GetComponent<Image>())
        {
            tempColor = fromColor = target.GetComponent<Image>().color;
        }

        //set augmented fromColor:
        if (args.Contains("color"))
        {
            fromColor = (Color)args["color"];
        }
        else
        {
            if (args.Contains("r"))
            {
                fromColor.r = (float)args["r"];
            }
            if (args.Contains("g"))
            {
                fromColor.g = (float)args["g"];
            }
            if (args.Contains("b"))
            {
                fromColor.b = (float)args["b"];
            }
            if (args.Contains("a"))
            {
                fromColor.a = (float)args["a"];
            }
        }

        //alpha or amount?
        if (args.Contains("amount"))
        {
            fromColor.a = (float)args["amount"];
            args.Remove("amount");
        }
        else if (args.Contains("alpha"))
        {
            fromColor.a = (float)args["alpha"];
            args.Remove("alpha");
        }

        //apply fromColor:
        if (target.GetComponent<GUITexture>())
        {
            target.GetComponent<GUITexture>().color = fromColor;
        }
        else if (target.GetComponent<GUIText>())
        {
            target.GetComponent<GUIText>().material.color = fromColor;
        }
        else if (target.GetComponent<Renderer>())
        {
            target.GetComponent<Renderer>().material.color = fromColor;
        }
        else if (target.GetComponent<Light>())
        {
            target.GetComponent<Light>().color = fromColor;
        }
        else if (target.GetComponent<Graphic>())
        {
            target.GetComponent<Graphic>().color = fromColor;
        }

        //set new color arg:
        args["color"] = tempColor;

        //establish iTween:
        args["type"] = "color";
        args["method"] = "to";
        Launch(target, args);
    }

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *