下述內容不對c#語法做過多講解,僅對已入門並有興趣的同學做為學習和拓展的資料
大家在Unity制作的過程中一定都使用過UI功能,那么很多人也一定見過這個面板:
那么我們如何能在自己的腳本中添加上像OnClick這樣的面板呢。
UnityEvent
Unity中內置了一個UnityEvent類作為事件處理的類,我們只要在腳本中聲明出來,Unity便會自動添加到腳本面板上,這樣便可以在腳本之外添加移除事件,非常方便。
腳本代碼
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;//需要引用命名空間
public class SelfScript : MonoBehaviour {
public UnityEvent OnStartEvent;//聲明公有變量
// Use this for initialization
void Start () {
OnStartEvent.Invoke();//執行添加的事件
}
/// <summary>
/// 要執行的事件
/// </summary>
public void OnStart()
{
print("-----OnStart Log");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
腳本寫好后掛載到物體上,設置好執行的事件,運行查看結果
事件傳參
如果需要向方法內傳入參數的話,直接寫出來即可
public void OnStart(string str)
{
print("-----OnStart Log" + str);
}
1
2
3
4
結果:
其他任何類型的參數都可以這樣傳入,同樣也可以傳入Transform,Gameobject這樣的對象。
這樣的事件是不支持多參數的,最多只能傳入一個參數。
多參數傳入
事實上UnityEvent是支持多參數傳入的,只不過必須通過腳本實現,一般情況下只會在制作一些易用的插件工具時會用到,
我用EasyTouch中的QuickSwipe來舉例
在事件聲明的地方有這樣一段代碼
[System.Serializable]
public class OnSwipeAction : UnityEvent<Gesture>{}
[SerializeField]
public OnSwipeAction onSwipeAction;
1
2
3
4
5
6
7
通過API可知泛型UnityEvent是一個抽象類,所以想要實現只能通過類繼承的方式來實現並聲明泛型事件
此腳本只傳入了一個參數,我們可以通過泛型來寫入多個參數:
[System.Serializable]//想顯示在面板上必須序列化該類
public class ValueEvent : UnityEvent<int,string,GameObject,SelfScript> { }//泛型中寫入參數類型
public ValueEvent eventByValue;
void Start () {
eventByValue.Invoke(5, " value ", gameObject, this);
}
public void OnValue(int i,string str,GameObject obj,SelfScript script)
{
Debug.Log( string.Format( "-----OnValue: int:{0}, string: {1}, ObjName: {2}, script.gameobject.name: {3}",i,str,obj.name,script.gameObject.name));
}
1
2
3
4
5
6
7
8
9
10
11
12
UnityEvent最多支持4個不同類型參數的傳入。
運行:
下面放出完整代碼,需要的同學可直接復制:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;//需要引用命名空間
public class SelfScript : MonoBehaviour {
public UnityEvent OnStartEvent;//聲明公有變量
[System.Serializable]//想顯示在面板上必須序列化該類
public class ValueEvent : UnityEvent<int,string,GameObject,SelfScript> { }
//[SerializeField]
public ValueEvent eventByValue;
// Use this for initialization
void Start () {
OnStartEvent.Invoke();//執行添加的事件
eventByValue.Invoke(5, " value ", gameObject, this);
}
/// <summary>
/// 要執行的事件
/// </summary>
public void OnStart(string str)
{
print("-----OnStart Log" + str);
}
public void OnValue(int i,string str,GameObject obj,SelfScript script)
{
print( string.Format( "-----OnValue: int:{0}, string: {1}, ObjName: {2}, script.gameobject.name: {3} ",i,str,obj.name,script.gameObject.name));
}
}
---------------------