zoukankan      html  css  js  c++  java
  • C# 之委托与事件

    这几天因为要弄这个任务系统,接触C#的委托与事件,刚开始看的时候头真的是很大,找了很多说明的,都是越看越是糊涂,最后看到一篇文章才渐渐有点灵感。感谢

    http://www.cnblogs.com/David-Huang/p/5150671.html 此博客博主。

    委托:个人在这里理解 委托就是 定义一个引用,一个可以记录函数指针的引用。

     public delegate void GreetingDelegate(int param);

    事件:就是基于委托定义的。

        public event GreetingDelegate payxx;

    其实这里的事件 payxx 就差不多和string 一样可,只不过是存函数指针的变量。

    这里上一个例子代码:

    using UnityEngine;
    using System.Collections;
    using UnityEngine.UI;
    using System;
    public class basetest : MonoBehaviour
    {
    
        public GameObject panel;
        private bool isclick = false;
        public delegate void GreetingDelegate(int param);
        public event GreetingDelegate payxx;
        // Use this for initialization
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
    
        }
        void OnMouseOver()
        {
            if (Input.GetMouseButtonDown(0))
            { //左键点击
                Debug.LogError("你点击了NPC");
                //playRenwu();
            }
    
        }
        public void pay() {
            Debug.LogError("触发了委托");
        }
    
        void playRenwu(bool isnotclick)
        {
            Debug.LogError("开始NPC任务");
            panel.gameObject.SetActive(isnotclick);
        }
    
    
        //protected virtual void Onpayxxxxx(int param)
        //{
        //    if (payxx != null)
        //    {
        //        Debug.LogError("委托的事件触发了");
        //        payxx(param);
        //    }
        //    else
        //    {
        //        Debug.LogError("委托的事件没触发");
        //    }
    
        //}
        public void Onpayxx(int param)
        {
            if (payxx != null)
            {
                payxx(param);
            }
            else { 
            }
           
        }
    
        public void Myfuntion2(int param)
        {
            Debug.LogError("第二次调用=" + param);
        }
        public void MyFunction(int param)
        {
            Debug.LogError("OKOKOKOKO=" + param);
        }
        public void Onclickbutton()
        {
            basetest eventTest = new basetest();
            eventTest.payxx += new GreetingDelegate(MyFunction);//安装事件
            eventTest.payxx += new GreetingDelegate(Myfuntion2);//安装事件
            eventTest.Onpayxx(10);
    
            if (isclick == false)
            {
                Debug.LogError("你点击了按钮");
                isclick = true;
                playRenwu(true);
            }
            else
            {
                isclick = false;
                playRenwu(false);
            }
    
    
        }
    }

    payxx 存函数的地址,调用是按次数来的。

    这里输出的结果是:

  • 相关阅读:
    python基本数据类型及其使用方法
    爬虫基础
    HTML标签marquee实现滚动效果
    Python学习之路_day_32(基于tcp协议的套接字/粘包问题)
    Python学习之路_day_31(tcp协议/socket)
    Python学习之路_day_30(单例模式,网络编程)
    Python学习之路_day_29(异常处理,元类)
    Python学习之路_day_25(面向对象之封装/多态/组合)
    Python学习之路_day_24(面向对象之继承)
    Python学习之路_day_23(面向对象)
  • 原文地址:https://www.cnblogs.com/sunxun/p/5804708.html
Copyright © 2011-2022 走看看