Unity3D學習資源:委託和lambda表達式二

 

四.把一個方法賦值給一個委託變量的這種機制,能夠實現把方法當作參數進行傳遞,若是一個方法,其參數是一個委託,則調用該方法時,就能夠把與該委託格式同樣的方法傳給形參.下面的代碼以List集合類型裏面的RemoveAll方法爲例:設計模式

[C] 純文本查看 複製代碼this

List<int> list = new List<int>();
                        list.Add(123);
                        list.Add(123);
                        list.Add(234);
                        list.Add(123);
                        list.RemoveAll((int a) =>
                                {
                                        if (a == 123)
                                        {
                                                return true;
                                        }
                                        return false;
                                });
                        foreach (int s in list)
                        {
                                Console.WriteLine(s);
                        }

先看一下RemoveAll方法的原型,public int RemoveAll(Predicate<T> match);進入到API裏面,看到其形參是一個委託類型,原型爲:public delegate bool Predicate<in T>(T obj);T爲泛型類型佔位符,上面的代碼中list中用的是int類型,故此委託裏面的T也爲int,委託的原型爲返回值爲bool類型,參數爲int類型,在調用方法時,用的是lambda表達式,參數是int類型的a,方法體裏面的返回值類型爲bool類型,a會遍歷集合裏面的全部元素,只要等於123,返回爲true,就會把123從集合裏面刪除掉,遍歷完一遍後,把集合裏面的123所有刪除了,輸出的結果只有234了.spa




五.委託能夠綁定多個方法這種特性,能夠用在設計模式上面,下面有個Unity的一個Demo,先看一下截圖:

屏幕快照 2015-09-15 下午10.13.47.png (100.63 KB, 下載次數: 0)設計

下載附件code

前天 22:45 上傳orm


工程運行前,場景中有四個帶顏色的物體,中間是一個小球,而後移動小球,與四個物體中的任何一個碰撞後,再按下空格鍵,則把碰撞過的物體顏色改成藍色.效果圖以下:

屏幕快照 2015-09-15 下午10.14.11.png (19.95 KB, 下載次數: 0)對象

下載附件繼承

前天 22:45 上傳接口


其主要的思想就是:在移動的小球的腳本里面,定義了一個接口類型的變量,在其它四個物體的腳本都繼承接口,接口類裏面有一個委託屬性,只有get方法,而後四個物體的腳本都繼承該接口,實現接口裏面的屬性,委託屬性的返回值是其腳本里面的方法,其格式和定義的委託格式同樣,當移動的小球與四個物體碰撞後,就把所碰撞物體腳本組件賦值給移動小球腳本組件裏面的接口變量,而後再調用相對應的委託變量所返回的方法,把相對應的物體的顏色改變便可.下面是代碼:
腳本一是綁定在四個帶有顏色物體上的腳本組件

[C] 純文本查看 複製代碼ci

using UnityEngine;
using System.Collections;

public class EnemyHurt : MonoBehaviour,IEventInterface
{

                public HurtDelegate hurtdelegate { 
                                get {
                                                return Hurt; 
                                } 
                }

                public void Hurt ()
                {
                                //把物體材質的顏色變成黑色,表明已死亡
                                transform.renderer.material.color = Color.blue;
                }
}
下面兩個腳本是加到移動小球上面的:
腳本二.

[C] 純文本查看 複製代碼

using UnityEngine;
using System.Collections;

//此腳本是用來控制小球移動的
public class Move : MonoBehaviour
{
                //小球移動的速度
                public float speed = 3.0f;

                void Update ()
                {
                                //獲得橫豎虛擬軸的值
                                float hor = Input.GetAxis ("Horizontal");
                                float vec = Input.GetAxis ("Vertical");
                                //小球的移動
                                transform.position += new Vector3 (hor, 0, vec) * Time.deltaTime * speed;
                }
}
腳本三:

[C] 純文本查看 複製代碼

using UnityEngine;
using System.Collections;

public class Boom : MonoBehaviour
{
                //定義一個接口的屬性,因爲敵人繼承了該接口,只須要把子類的對象賦值給該接口變量便可執行子類裏面的方法
                public IEventInterface eventInterface{ get; set; }
                //碰撞檢測,當小球與四個物體發生碰撞時,
                void OnCollisionEnter (Collision other)
                {
                                //若是碰撞物體的父物體不爲空而且父物體的名字是Enemies時
                                if (other.transform.parent != null && other.transform.parent.name == "Enemies") {
                                //接口變量指向子類的對象,就會調用所指向的子類裏面的委託.
                                                this.eventInterface = other.transform.GetComponent<EnemyHurt> ();
                                }
                }
                // Update is called once per frame
                void Update ()
                {
                                //當按下空格鍵時,調用委託,實際上調用的就是接口變量所指向的子類裏面的委託,而
                                //其委託又返回的是子類裏面的方法
                                if (Input.GetKeyDown (KeyCode.Space)) {
                                                this.eventInterface.hurtdelegate ();
                                }
                }
}

腳本四:是一個公有的文件其它腳本組件能夠引用該文件裏面的接口

[C] 純文本查看 複製代碼

using UnityEngine;
using System.Collections;

//聲明一個委託
public delegate void HurtDelegate ();
//建立一個接口
public interface IEventInterface
{
                //聲明一個委託屬性
                HurtDelegate hurtdelegate{ get; }
}

如下是Unity場景裏面的各物體之間的父子關係圖:

屏幕快照 2015-09-15 下午10.27.44.png (12.33 KB, 下載次數: 0)

下載附件

前天 22:45 上傳

以上就是關於委託的應用,因爲書寫時間倉促,有什麼問題還請各位大神多多指教.
相關文章
相關標籤/搜索