Unity委托基础实例

在网上看到一篇不错的文章比较不错适合新手,转过来

https://www.cnblogs.com/hejianchun/articles/3464985.html

 总结下使用C#中的委托(delegate)吧,其实这个并不难,但是对于没接触过的人还是有点小问题的,现在我在这做一个简单的例子来帮助大家对delegate的理解吧,想要更加加深对委托的理解,请度娘下吧,我就不在这丢人了,我也是百度后才对委托有了进一步的理解的!

    我们在unity中先建一个脚本,取名为TestDelegate。我做的这个测试主要是点击输出中文名字按钮来输出中文名字,点击英文名字来输出英文名字,这里有2个函数,一个是输出中文名字,还有一个就是输出英文名字的,如果我们不用委托的话,想要实现这个函数的话,那我们就要使用判断语句来实现吧(if  else  , switch)。现在用委托的话我们就不用写判断语句了,想我这样的人,大部分代码都是判断语句,现在我看见if  else, switch,都心烦啊,大神的代码都很少出现这些呀,在其中也为我敲醒了一个警钟了,还得好好加倍努力啊, 好了 现在我们来写下简单的代码吧。如下

using UnityEngine;
using System.Collections;

public class TestDelegate : MonoBehaviour
{

    //定义一个委托(格式是不是很类很像),用来指向我们某个函数。(c++里面的指针函数)
    //param参数是名字
    private delegate void DebugString(string param);

    /// <summary>
    /// 输出中文名字
    /// </summary>
    public void DebugNameOfChina(string str)
    {
        Debug.Log("中文名字:" + str);
    }

    /// <summary>
    /// 输出英文名字
    /// </summary>
    public void DebugNameOfEnglish(string str)
    {
        Debug.Log("English Name:" + str);
    }

    //定义一个委托的变量事件
    private DebugString handlerDebugString;


    void OnGUI()
    {
        if (GUILayout.Button("输出中文名字"))
        {
            //我想输出中文名字的话就给handlerDebugString  赋值成输出中文名字的这个函数DebugNameOfChina
            handlerDebugString = DebugNameOfChina;
            handlerDebugString("何建春");
        }
        else if (GUILayout.Button("Debug English Name"))
        {
            //我想输出英文名字的话就给handlerDebugString  赋值成输出中文名字的这个函数DebugNameOfEnglish
            handlerDebugString = DebugNameOfEnglish;
            handlerDebugString("Hejianchun");
        }
    }

   
}

好了  我们运行下,分别点击按钮,看看unity的Console台输出什么吧,截图如下:

         

就是这样简单呀。不知道大家有没有看明白我的意思。  其实委托还有+=和—+呢,我相信不知道委托的同学,大家在百度后也知道了。好了我们再来使用—+,—=来做个实验,将上面代码改成如下:

using UnityEngine;
using System.Collections;

public class TestDelegate : MonoBehaviour
{

    //定义一个委托(格式是不是很类很像),用来指向我们某个函数。(c++里面的指针函数)
    //param参数是名字
    private delegate void DebugString(string param);

    /// <summary>
    /// 输出中文名字
    /// </summary>
    public void DebugNameOfChina(string str)
    {
        Debug.Log("中文名字:" + str);
    }

    /// <summary>
    /// 输出英文名字
    /// </summary>
    public void DebugNameOfEnglish(string str)
    {
        Debug.Log("English Name:" + str);
    }

    //定义一个委托的变量事件
    private DebugString handlerDebugString;


    void Start()
    {
        //给委托对象赋值
        handlerDebugString = DebugNameOfChina;
        handlerDebugString("何建春");
        Debug.Log("................................");

        //给委托对象再加一个事件,叫多路广播
        handlerDebugString += DebugNameOfEnglish;
        handlerDebugString("Hejianchun");
        Debug.Log("................................");

        //给委托对象减去一个事件
        handlerDebugString -= DebugNameOfChina;
        handlerDebugString("Hejianchun");

    }


}

大家猜猜上面的结果吧,我们来运行下,看下结果,有没有别猜中。

 

看看吧,这就是委托的神奇之处,我觉得大家最容易猜错的是第二条,没想到它会输出2条信息吧,其实这就是委托变量包含了一个初始值和我们后来的赋值的原因引起的,到后来我们又减去了一个事件,这才和原始一样。大家如果没看懂,我建议还是去百度吧。觉得这和unity3d枚什么关系,还是C#的知识。

 

如需转载,还望表明出处,谢谢......

Unity中,委托和事件都是C#语言的特性。它们用于实现在不同对象之间进行通信和协作的机制。 委托是一种类型,它可以用来存储对方法的引用。我们可以将委托看作是一个变量,该变量引用一个或多个方法。当调用委托时,它将依次调用所有委托引用的方法。委托可以用于事件处理、回调等场景。 Unity中的事件是一种特殊的委托,它只能用于触发特定事件时通知其他对象。事件只能通过添加或移除处理程序来更改,而不能直接调用。事件通常用于游戏中的交互、动画等场景。 下面是一个使用委托和事件的示例: ```csharp //声明一个委托 public delegate void MyDelegate(); public class MyClass { //声明一个事件 public event MyDelegate myEvent; //调用事件 public void CallEvent() { if(myEvent != null) { myEvent(); } } } public class OtherClass { public void MyMethod() { Debug.Log("MyMethod is called."); } } public class Test : MonoBehaviour { private MyClass myClass; private void Start() { myClass = new MyClass(); OtherClass otherClass = new OtherClass(); //将一个方法添加到事件的处理程序列表中 myClass.myEvent += otherClass.MyMethod; //调用事件 myClass.CallEvent(); //将方法从事件的处理程序列表中移除 myClass.myEvent -= otherClass.MyMethod; } } ``` 在这个示例中,我们声明了一个委托 `MyDelegate` 和一个类 `MyClass`,该类包含一个事件 `myEvent`。我们还声明了一个类 `OtherClass`,其中包含一个方法 `MyMethod`。在 `Test` 类的 `Start` 方法中,我们创建了一个 `MyClass` 的实例,并将 `OtherClass` 中的方法 `MyMethod` 添加到 `myEvent` 事件的处理程序列表中。然后,我们调用 `myEvent` 事件,此时 `MyMethod` 方法会被执行。最后,我们将 `MyMethod` 方法从 `myEvent` 事件的处理程序列表中移除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值