Unity3D 在自定義腳本中實現Button組件上的OnClick面板


下述內容不對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));
}
}

--------------------- 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM