找回密碼
 注冊帳號

掃一掃,訪問微社區

搶樓 搶樓 本帖為搶樓帖,歡迎搶樓! 

我為游戲狂 在unity4.6之前使用UnityEvent

10
回復
3459
查看
打印 上一主題 下一主題
[ 復制鏈接 ]
排名
2911
昨日變化

39

主題

92

帖子

1278

積分

Rank: 9Rank: 9Rank: 9

UID
18602
好友
14
蠻牛幣
3638
威望
0
注冊時間
2014-3-23
在線時間
192 小時
最后登錄
2018-9-9

專欄作家

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

x
在unity4.6之后多了個這個東東
當然應該在UI中有應用了那么還有其他別的用處么?
我們來看看官方蠻牛對UnityEvents的介紹:
UnityEvents 是允許用戶從編輯時驅動回調的方式來保存,運行時無需額外的編程和腳本配置。
UnityEvents 在很多事情上很有用:
?內容驅動的回調Content driven callbacks
?解耦系統Decoupling systems
?持續回調Persistent callbacks
?預配置的調用事件Preconfigured call events

UnityEvents 可以添加到任何的MonoBehaviour類中和被執行。
他類似.net標準的delegate委托,怎么知道的呢?1、看源代碼呀,2、按如下圖搜索:
。
點擊進入:

                       
當UnityEvent添加到MonoBehaviour上,它出現在檢查器,可以添加持續回調。
使用 UnityEvents
要配置一個回調在編輯器中有幾個步驟:
1.請確保您的腳本導入/使用using UnityEngine.Events.
2.選擇 + 圖標以添加一個回調方法的槽
3.選擇UnityEngine.Object您希望接收的回調 (您可以使用為這個對象選擇
器)
4.選擇您希望調用的函數
5.您可以添加更多關于一個事件的回調

在Inspector 檢查器中配置的UnityEvent時有兩種類型的受支持的函數調用:
?Static靜態。靜態調用是預配置的調用,在 UI 中設置的預配置值。這意味著當調用回調時,使用已輸入到 UI 的參數調用目標函數。
?Dynamic動態。使用代碼,從發送的參數來調用動態調用,這綁定到 UnityEvent 正在調用的類型。UI 篩選回調,并只顯示有效的 UnityEvent 的動態調用。
泛型 UnityEvents
默認情況下在Monobehaviour的UnityEvent將動態地綁定到 void 函數。這不必是這種情況的 UnityEvents 的動態調用支持綁定到帶有達 4 參數的函數。要做到這一點,您需要定義一個自定義的UnityEvent類,支持多個參數。
這是很容易做到:
[csharp] view plaincopyprint?

  • [Serializable]  
  • public class StringEvent : UnityEvent <string> {}  

[Serializable]public class StringEvent : UnityEvent <string> {}

這個實例添加到您的類中,而不是base UnityEvent ,它將允許回調來將動態綁定到字符串函數。這然后可以通過調用Invoke()函數使用一個string作為參數調用。

UnityEvents 可以用達 4 參數在其泛型定義中定義。
例子:

1、UnityEngine.Events Classes
UnityEventBase  類:
Namespace: UnityEngine.Events
描述:UnityEvents 的抽象基類。
此類為 UnityEvents 提供的基本功能。
UnityEvent  類:
Namespace: UnityEngine.Events/Inherits from: Events.UnityEventBase
描述:零參數持續回調可以被現場保存。
例子:

[csharp] view plaincopyprint?

  • using UnityEngine;  
  • using System.Collections;  
  • using UnityEngine.Events;  
  • public class Event0 : MonoBehaviour {  
  •     public UnityEvent m_MyEvent;    // 注意這個一定要是public才能應用在Inspector上通過+-號操作  
  •     // Use this for initialization  
  •     void Start () {  
  •         if (m_MyEvent == null)  
  •             m_MyEvent = new UnityEvent ();  
  •          
  •         m_MyEvent.AddListener (Ping);  
  •     }  
  •       
  •     // Update is called once per frame  
  •     void Update () {  
  •         if (Input.anyKeyDown && m_MyEvent != null)  
  •         {  
  •             m_MyEvent.Invoke ();  
  •         }  
  •     }  
  •     public void Ping ()  
  •     {  
  •         Debug.Log ("Ping");  
  •     }  
  • }  

using UnityEngine;using System.Collections;using UnityEngine.Events;public class Event0 : MonoBehaviour {        public UnityEvent m_MyEvent;    // 注意這個一定要是public才能應用在Inspector上通過+-號操作        // Use this for initialization        void Start () {                if (m_MyEvent == null)                        m_MyEvent = new UnityEvent ();                                m_MyEvent.AddListener (Ping);        }                // Update is called once per frame        void Update () {                if (Input.anyKeyDown && m_MyEvent != null)                {                        m_MyEvent.Invoke ();                }        }        public void Ping ()        {                Debug.Log ("Ping");        }}

UnityEvent<T0> 類:
Namespace: UnityEngine.Events/Inherits from: Events.UnityEventBase
描述:一個參數的 UnityEvent 版本。
如果您想要使用泛型的 UnityEvent 類型,您必須重寫的類類型。
例子:
[csharp] view plaincopyprint?

  • using UnityEngine;  
  • using System.Collections;  
  • using UnityEngine.Events;  
  •   
  • public class MyIntEvent : UnityEvent<int> {}  
  • public class Event1 : MonoBehaviour {  
  •   
  •     public MyIntEvent m_MyEvent;  
  •     // Use this for initialization  
  •     void Start () {  
  •         if (m_MyEvent == null)  
  •             m_MyEvent = new MyIntEvent ();  
  •          
  •         m_MyEvent.AddListener (Ping);  
  •     }  
  •       
  •     // Update is called once per frame  
  •     void Update () {  
  •         if (Input.anyKeyDown && m_MyEvent != null)  
  •         {  
  •             m_MyEvent.Invoke (5);  
  •         }  
  •     }  
  •     void Ping ( int i)  
  •     {  
  •         Debug.Log ("Ping" + i);  
  •     }  
  • }  

using UnityEngine;using System.Collections;using UnityEngine.Events;public class MyIntEvent : UnityEvent<int> {}public class Event1 : MonoBehaviour {        public MyIntEvent m_MyEvent;        // Use this for initialization        void Start () {                if (m_MyEvent == null)                        m_MyEvent = new MyIntEvent ();                                m_MyEvent.AddListener (Ping);        }                // Update is called once per frame        void Update () {                if (Input.anyKeyDown && m_MyEvent != null)                {                        m_MyEvent.Invoke (5);                }        }        void Ping ( int i)        {                Debug.Log ("Ping" + i);        }}


UnityEvent<T0,T1> 類 :
Namespace: UnityEngine.Events/Inherits from: Events.UnityEventBase
描述:兩個參數的 UnityEvent 版本。
如果您想要使用泛型的 UnityEvent 類型,您必須重寫的類類型。
例子:
[csharp] view plaincopyprint?

  • using UnityEngine;  
  • using System.Collections;  
  • using UnityEngine.Events;  
  •   
  • public class My2ArgEvent : UnityEvent<int, int> {}  
  • public class Event2 : MonoBehaviour {  
  •     public My2ArgEvent m_MyEvent;  
  •     // Use this for initialization  
  •     void Start () {  
  •         if (m_MyEvent == null)  
  •             m_MyEvent = new My2ArgEvent ();  
  •          
  •         m_MyEvent.AddListener (Ping);  
  •     }  
  •       
  •     // Update is called once per frame  
  •     void Update () {  
  •         if (Input.anyKeyDown && m_MyEvent != null)  
  •         {  
  •             m_MyEvent.Invoke (5, 6);  
  •         }  
  •     }  
  •     void Ping (int i0, int i1)  
  •     {  
  •         Debug.Log (i0 + i1);  
  •     }  
  • }  

using UnityEngine;using System.Collections;using UnityEngine.Events;public class My2ArgEvent : UnityEvent<int, int> {}public class Event2 : MonoBehaviour {        public My2ArgEvent m_MyEvent;        // Use this for initialization        void Start () {                if (m_MyEvent == null)                        m_MyEvent = new My2ArgEvent ();                                m_MyEvent.AddListener (Ping);        }                // Update is called once per frame        void Update () {                if (Input.anyKeyDown && m_MyEvent != null)                {                        m_MyEvent.Invoke (5, 6);                }        }        void Ping (int i0, int i1)        {                Debug.Log (i0 + i1);        }}

UnityEvent<T0,T1,T2> 類:
Namespace: UnityEngine.Events/Inherits from: Events.UnityEventBase
描述:3 個參數的 UnityEvent 版本。
如果您想要使用泛型的 UnityEvent 類型,您必須重寫的類類型。
例子:
[csharp] view plaincopyprint?

  • using UnityEngine;  
  • using System.Collections;  
  • using UnityEngine.Events;  
  •   
  • public class My3ArgEvent : UnityEvent<int, int, int> {}  
  • public class Event3 : MonoBehaviour   
  • {  
  •     public My3ArgEvent m_MyEvent;  
  •     // Use this for initialization  
  •     void Start () {  
  •         if (m_MyEvent == null)  
  •             m_MyEvent = new My3ArgEvent ();  
  •          
  •         m_MyEvent.AddListener (Ping);  
  •     }  
  •       
  •     // Update is called once per frame  
  •     void Update () {  
  •         if (Input.anyKeyDown && m_MyEvent != null)  
  •         {  
  •             m_MyEvent.Invoke (5, 6, 7);  
  •         }  
  •     }  
  •     void Ping (int i0,int i1,int i2)  
  •     {  
  •         Debug.Log (i0 + i1 + i2);  
  •     }  
  • }  

using UnityEngine;using System.Collections;using UnityEngine.Events;public class My3ArgEvent : UnityEvent<int, int, int> {}public class Event3 : MonoBehaviour {        public My3ArgEvent m_MyEvent;        // Use this for initialization        void Start () {                if (m_MyEvent == null)                        m_MyEvent = new My3ArgEvent ();                                m_MyEvent.AddListener (Ping);        }                // Update is called once per frame        void Update () {                if (Input.anyKeyDown && m_MyEvent != null)                {                        m_MyEvent.Invoke (5, 6, 7);                }        }        void Ping (int i0,int i1,int i2)        {                Debug.Log (i0 + i1 + i2);        }}

UnityEvent<T0,T1,T2,T3> 類:
Namespace: UnityEngine.Events/Inherits from: Events.UnityEventBase
描述:4 個參數的 UnityEvent 版本。
如果您想要使用泛型的 UnityEvent 類型,您必須重寫的類類型。
例子:

[csharp] view plaincopyprint?

  • using System.Collections;  
  • using UnityEngine.Events;  
  •   
  • public class My4ArgEvent : UnityEvent<int, int, int, int> {}  
  • public class Event4 : MonoBehaviour   
  • {  
  •     public My4ArgEvent m_MyEvent;  
  •     // Use this for initialization  
  •     void Start () {  
  •         if (m_MyEvent == null)  
  •             m_MyEvent = new My4ArgEvent ();  
  •          
  •         m_MyEvent.AddListener (Ping);  
  •     }  
  •       
  •     // Update is called once per frame  
  •     void Update () {  
  •         if (Input.anyKeyDown && m_MyEvent != null)  
  •         {  
  •             m_MyEvent.Invoke (5, 6, 7, -5);  
  •         }  
  •     }  
  •     void Ping (int i0,int i1,int i2,int i3)  
  •     {  
  •         Debug.Log (i0 + i1 + i2 + i3);  
  •     }  
  • }  

using System.Collections;using UnityEngine.Events;public class My4ArgEvent : UnityEvent<int, int, int, int> {}public class Event4 : MonoBehaviour {        public My4ArgEvent m_MyEvent;        // Use this for initialization        void Start () {                if (m_MyEvent == null)                        m_MyEvent = new My4ArgEvent ();                                m_MyEvent.AddListener (Ping);        }                // Update is called once per frame        void Update () {                if (Input.anyKeyDown && m_MyEvent != null)                {                        m_MyEvent.Invoke (5, 6, 7, -5);                }        }        void Ping (int i0,int i1,int i2,int i3)        {                Debug.Log (i0 + i1 + i2 + i3);        }}


2 Uni tyEngine.Events Enumerations
PersistentListenerMode
描述:偵聽器的運作模式。
UnityEventCallState
描述:控制 UnityEvent 回調的范圍。

知道了它的用法,那么回到標題吧,基本上現在的項目都還是在使用NGUI所以不會使用unity4.6版本。
但是又不想錯過unity原生的好東西。 怎么辦?那就得到源代碼吧。
本人測試后是沒有問題的!
下載地址如下:http://download.csdn.net/detail/u010019717/8483193
參與人數 3鮮花 +5 收起 理由
XXXXXXXXXX + 2 贊一個!
sanguojixuan + 2 贊一個!
a99677137 + 1

查看全部評分總評分 : 鮮花 +5

本帖被以下淘專輯推薦:

  • · I Like|主題: 89, 訂閱: 14
回復

使用道具 舉報

排名
2401
昨日變化

18

主題

448

帖子

2299

積分

Rank: 9Rank: 9Rank: 9

UID
31561
好友
57
蠻牛幣
186
威望
0
注冊時間
2014-6-27
在線時間
397 小時
最后登錄
2019-12-19

七夕浪漫情人認證開發者

QQ
沙發
2015-3-10 12:16:09 只看該作者
前來支持一下。
回復

使用道具 舉報

排名
2911
昨日變化

39

主題

92

帖子

1278

積分

Rank: 9Rank: 9Rank: 9

UID
18602
好友
14
蠻牛幣
3638
威望
0
注冊時間
2014-3-23
在線時間
192 小時
最后登錄
2018-9-9

專欄作家

板凳
樓主 2015-3-10 21:58:51 只看該作者
本帖最后由 我為游戲狂 于 2015-3-10 22:04 編輯

謝謝,很多人沒聽說過這個,更別提使用了,希望對你有用。  類似于:http://wiki.unity3d.com/index.php/Advanced_CSharp_Messenger
回復

使用道具 舉報

5熟悉之中
773/1000
排名
3745
昨日變化

4

主題

134

帖子

773

積分

Rank: 5Rank: 5

UID
11019
好友
1
蠻牛幣
871
威望
0
注冊時間
2013-12-24
在線時間
233 小時
最后登錄
2020-1-17
地板
2015-3-13 13:13:21 只看該作者
這個 主要 作用于什么地方?
回復

使用道具 舉報

5熟悉之中
773/1000
排名
3745
昨日變化

4

主題

134

帖子

773

積分

Rank: 5Rank: 5

UID
11019
好友
1
蠻牛幣
871
威望
0
注冊時間
2013-12-24
在線時間
233 小時
最后登錄
2020-1-17
5#
2015-3-13 13:15:05 只看該作者
我為游戲狂 發表于 2015-3-10 21:58
謝謝,很多人沒聽說過這個,更別提使用了,希望對你有用。  類似于:http://wiki.unity3d.com/index.php/A ...

有沒有中文的,英文的看著頭痛
回復

使用道具 舉報

頭像被屏蔽
排名
64939
昨日變化

0

主題

2

帖子

4

積分

UID
79791
好友
0
蠻牛幣
15
威望
0
注冊時間
2015-3-14
在線時間
0 小時
最后登錄
2015-3-14
6#
2015-3-14 18:34:15 只看該作者
提示: 作者被禁止或刪除 內容自動屏蔽
回復

使用道具 舉報

5熟悉之中
559/1000
排名
5020
昨日變化

0

主題

63

帖子

559

積分

Rank: 5Rank: 5

UID
66851
好友
3
蠻牛幣
1662
威望
0
注冊時間
2015-1-8
在線時間
208 小時
最后登錄
2019-5-6
QQ
7#
2015-3-23 14:45:25 只看該作者
     {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  {:2_25:}  
回復

使用道具 舉報

排名
13485
昨日變化

50

主題

127

帖子

474

積分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
25491
好友
3
蠻牛幣
206
威望
0
注冊時間
2014-5-17
在線時間
225 小時
最后登錄
2020-2-1
8#
2015-4-6 06:29:26 只看該作者
這樣也給贊?ISerializationCallbackReceiver 這個接口都不存在,代碼壓運行不了
回復

使用道具 舉報

排名
2911
昨日變化

39

主題

92

帖子

1278

積分

Rank: 9Rank: 9Rank: 9

UID
18602
好友
14
蠻牛幣
3638
威望
0
注冊時間
2014-3-23
在線時間
192 小時
最后登錄
2018-9-9

專欄作家

9#
樓主 2015-4-7 09:29:56 只看該作者
koljy11 發表于 2015-4-6 06:29
這樣也給贊?ISerializationCallbackReceiver 這個接口都不存在,代碼壓運行不了

直接用 是運行不了, 主要是GameObject的  引用要使用,  在你下載的文件中我有說明的!   其他的問題我沒遇到過。

把所有 報錯的文件的 上方, using下方添加:
using Object = UnityEngine.Object;
回復

使用道具 舉報

排名
13485
昨日變化

50

主題

127

帖子

474

積分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
25491
好友
3
蠻牛幣
206
威望
0
注冊時間
2014-5-17
在線時間
225 小時
最后登錄
2020-2-1
10#
2015-4-9 10:49:03 只看該作者
我為游戲狂 發表于 2015-4-7 09:29
直接用 是運行不了, 主要是GameObject的  引用要使用,  在你下載的文件中我有說明的!   其他的問題我沒 ...

那你也要把代碼改好,測試通過發出來,發帖也要講求質量的
回復

使用道具 舉報

排名
2911
昨日變化

39

主題

92

帖子

1278

積分

Rank: 9Rank: 9Rank: 9

UID
18602
好友
14
蠻牛幣
3638
威望
0
注冊時間
2014-3-23
在線時間
192 小時
最后登錄
2018-9-9

專欄作家

11#
樓主 2015-4-9 12:20:56 只看該作者
koljy11 發表于 2015-4-9 10:49
那你也要把代碼改好,測試通過發出來,發帖也要講求質量的

哥白尼當初發表太陽圍繞地球轉的學說,當時的人是不是都應該找他算賬。 不親自動手去弄,知道怎么來的么?
好吧!世界觀不一樣,你說的我會虛心接受!   這篇文章給你帶來不便,表示抱歉。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

女校游泳队彩金 盈网球比分 巴甲投注技巧 中国竞猜比分直播 今日竞彩比分投注 最新娱乐棋牌游戏下载 足彩即时赔率最权威 河北20选5河北排列7 1000炮金蟾捕鱼机 陕西11选5 我是微信麻将群主 甘肃快三遗漏数据查询 广东快乐10分开奖时间 熊猫麻将官方版 透视 舟山飞鱼直播走势图片 65彩票网址 缅甸龙虎算牌方法