跳到主要內容

Unity 近三個月的整理..Part2

1.而我在用monobehaviour時 有用到了invoke,它的作用應該是去叫用Script中的某個function,例如Invoke("function name",2) 在兩秒之後去Call這個function。

或是A物件掛載了一個Script,例如我想Tween一個物件然後在物件下方新增一個Component叫EggTween,在EggTween 是一個MonoBehaviour 在Start時候會去設定起始時間,所以我就用Invoke("Start",在2秒後啟用)。

然而類似方法有(Invoke、CancelInvoke、InvokeRepeating)。

2.在Unity中效能也是很重要的,所以盡量避免用GameObject.Find("場景物件"),他會掃過所有在場景中的gameobject來做比對,所以盡量可以不要用到就不要用這種方法。

在此引用別人寫的效能篇作為往後參考用。
http://unityin.tumblr.com/post/16915417774/%E6%95%88%E8%83%BD%E6%95%88%E8%83%BD%E6%95%88%E8%83%BD

3.在Script裡面,我以前都不太用(事件),比較常去用其他的資料型態,例如GameObject、int、List等等的基本資料型態。但像UnityEvent這型態就比較少用到。

這型態最常見的地方就是在UGUI裡面的Button或其他物件,他會有OnClick,這就是事件。所以我們現在可以自製事件然後再叫這事件去做一些事情,我們進而呼叫事件去做事。

  
using UnityEngine;
using System.Collections;
using UnityEngine.Events;

public class TestLoader : MonoBehaviour {
    [SerializeField]
    protected UnityEvent onLoad = new UnityEvent(); //這邊就是自製事件
    [SerializeField]
    protected UnityEvent unLoad = new UnityEvent();
    // Use this for initialization
    void Start () {
        Load();
        UnLoad();
    }
    
    // Update is called once per frame
    void Update () {
    
    }

    [ContextMenu("Load")]
    public void Load() {
        onLoad.Invoke(); //去執行onLoad這事件,例如在這事件下去掛載某個函示,功能是刪除場景上物件,此方法就會去執行那個函示
    }

    [ContextMenu("unLoad")]
    public void UnLoad() {
        unLoad.Invoke();
    }
}

下圖就是事件UnityEvent視覺化效果


4.在新增參數型態時候向我們之前熟知的private public之外,在unity裡面 還有不同的形態,例如[SerializeField]bool IsTheUserCanClickButton1;他可以當作public 並且在Inspector看的到他的變化。

在寫這個的時候去查了一下相關資料,得到序列化的概念。
public似乎是他序列化的值,意思是不需要再次賦予它值,他會記住上賜給的值,那是否private就不是?!然而不想在Inspector顯示就可以使用[HideInInspector]這用法。

而[SerialzeField]意思是把原本不會被序列化的私友或保護等變量讓他序列化,下次讀取時就是上次賦予的值。

5.在Unity中,程式賦予資料型態在Inspector也會以不同方式顯示,例如:List或Array都可以變成一個集合體在Inspector可以把object等等元素拉進去編輯並賦予值。
public AnimationCurve curve;可以去選擇與新增儲存Curve曲線,在這邊我是用在Tween的時間走向。並切搭配public enum Tweens{ LINEAR,EASE_IN,CURVE }  public Tweens tweenType; 去選擇Tween的Type。還有其他像Color、Renderer、Transform、Vector等等都會在Inspector有不一樣的樣式顯示。

下列為List基本用法
 
public class SubUIButtonCallPrefab : MonoBehaviour {
  [SerializeField]
  protected List AllButton = new List();

  void Start()
  { 
    //把物件放到list中
    AllButton.Add(IndustryButton1);
    AllButton.Add(IndustryButton2);
    AllButton.Add(IndustryButton3);
  }

  void TestFunction()
  {
    //用forLoop去解析
    for (int i = 0; i < AllButton.Count; i++)
        {
            //做事情
            AllButton[i].SetActive(false);
        }
  }
}

留言