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模块、包、异常、文件(案例)
    jQuery DataTable 删除数据后重新加载
    Python|面向对象
    python开发的学生管理系统
    使用JDK开发WebServrice案例
    Python入门(案例)
    Spring总结以及在面试中的一些问题
    Web Services简单介绍
    Canvas实现文字粒子化,并且绕轴旋转(完善)
    HTML5 Canvas画数字时钟
  • 原文地址:https://www.cnblogs.com/sunxun/p/5804708.html
Copyright © 2011-2022 走看看