在这里我将演示怎样创建代表、 事件和Singletons 在一起工作。

本教程为 Unity3D 编写。

我想知道这为什么?
作为一个年轻的自学程序猿,我常常发现自己写tons 和布尔的语句,以确定是否发生了某些event 或action 。我听这些events 事件通过Coroutines 协同程序和其它方法来返回值。

假设你发现自己这做得一样好,停下来 !

欢迎光临Events事件......

介绍
近期。我一直要改善我的 C# 编程技能,以及发现自己缺乏知识,了解Events事件基础。所以,尽管通过很多教程在 MSDN 和其它博客上看着,发现了大多数的教程要复杂和茂盛用令人费解的代码不相关的核心概念。我不希望这发生在你身上 !

这样说过我会试着解释Events 事件和在项目中怎样使用它们的基础......

Singleton?
假设你不知道什么Singleton。。单身人士是不能 — 或反复的脚本。

嗯......。

我推荐使用Singleton不须要复制多次在game中的东西。如Inventory System库存系统。通常情况下,玩家仅仅须要一个库存,我们仅仅想要一个。

当我们调用它时,我们想要确保它不会得到复制。

有很多方法能够创建Singletons。但这样的方法常常使用,由于它非常easy......

// This class sits on my camera and handles all the clicks I send with a Raycast
public class Clicker : MonoBehaviour
{
// Singleton
private static Clicker instance; // Construct
private Clicker() {} // Instance
public static Clicker Instance
{
get
{
if (instance == null)
instance = GameObject.FindObjectOfType(typeof(Clicker)) as Clicker;
return instance;
} // Do something here, make sure this is public so we can access it through our Instance.
public void DoSomething() { }
...

在这里。'Clicker’ '类附加到我的Camera上。

此类处理点击 在3D 空间Raycast 的 。

若要从还有一个脚本訪问我 'DoSomething’  的方法。我仅仅能...

Clicker.Instance.DoSomething(); 

这消除了须要使用大量的静态方法和变量的调用,再加上仅仅给了我们一个实例 。

托付和事件?
托付能够看作是对对象的引用指针。

当它被调用时,它会通知全部引用该托付的方法。

所以。第一件事......

定义一个托付和获取调用时它触发的方法......

public class Clicker : MonoBehaviour
{
// Event Handler
public delegate void OnClickEvent(GameObject g);
public event OnClickEvent OnClick;

代理调用 'OnClickEvent' 通过一个‘GameObject’,我们能够使用来定义它来自什么游戏物体。然后。我们定义了 'event’  OnClick 获取调用时调用的托付。

如今。在同样的脚本中,我们须要调用托付。并将其传递我们的游戏对象。通过 Raycast......

public class Clicker : MonoBehaviour
{
// Event Handler
public delegate void OnClickEvent(GameObject g);
public event OnClickEvent OnClick; // Handle our Ray and Hit
void Update ()
{
// Ray
Ray ray = Camera.mainCamera.ScreenPointToRay(Input.mousePosition); // Raycast Hit
RaycastHit hit; if (Physics.Raycast(ray, out hit, 100))
{
// If we click it
if (Input.GetMouseButtonUp(0))
{
// Notify of the event!
OnClick(hit.transform.gameObject);
}
}
}
}

如你所见的,假设Ray 已联系 ,我们左鼠标单击对象,我们调用该事件并传递游戏物体。

我们必须做的最后一件事是从我们正在听call 的其它脚本引用托付。为此我创建了一个名为 GoldPile 类。

public class GoldPile : MonoBehaviour
{
// Awake
void Awake ()
{
// Start the event listener
Clicker.Instance.OnClick += OnClick;
} // The event that gets called
void OnClick(GameObject g)
{
// If g is THIS gameObject
if (g == gameObject)
{
Debug.Log("Hide and give us money!"); // Hide
gameObject.active = false;
}
}
}

在我们的 Awake() 方法中,我们定义我们listening 的事件并分配一个获取调用 OnClick 的本地方法。'OnClick' 不须要我们托付方法同样,但它能够。

注:在曾经的帖子我们加入一个单例到我们Clicker 类。这使我们能够使用 Clicker.Instance

正如你所示我们还创建了传递我们点击我们游戏的 OnClick() 方法。

注:假设您必须使用 if (g == gameObject)。否则,它将隐藏该方法以及场景中的其它实例...这就是为什么我们通过GameObject 供參考 !

如今你有空。假设须要将此方法加入到您的游戏中的不论什么其它脚本。别忘了定义的方法,并在你的 Awake() 委派。

Yes, best way is to use OnEnable/OnDisable:

void OnEnable
{
Clicker.Instance.OnClick += OnClick;
}

void OnDisable
{
Clicker.Instance.OnClick -= OnClick;
}

Delegates, Events and Singletons with Unity3D – C#的更多相关文章

  1. 【C#】学习笔记(1) Delegates,Events,Lambda Expressions

    C#是跟着杨老师的教程走的,在这里感谢一下老师的无私奉献,他的cnblog地址:>cgzl,他的B站地址:>solenovex. 进入正题: Delegate表示委托,委托是一种数据结构, ...

  2. Delegates, Events, and Anonymous Methods 委托、事件与匿名方法

    http://www.cnblogs.com/r01cn/archive/2012/11/30/2795977.html

  3. Explaining Delegates in C# - Part 6 (Asynchronous Callback - Way 3)

    By now, I have shown the following usages of delegates... Callback and Multicast delegatesEventsOne ...

  4. Explaining Delegates in C# - Part 4 (Asynchronous Callback - Way 1)

    So far, I have discussed about Callback, Multicast delegates, Events using delegates, and yet anothe ...

  5. Lambda 表达式(C# 编程指南) 微软microsoft官方说明

    Visual Studio 2013 其他版本 Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地 ...

  6. [转]c#.NET和VB.NET语法的比较

    本文转自:http://www.cnblogs.com/lify0407/archive/2007/08/01/838589.html c#.NET和VB.NET语法的比较   VB.NET C# C ...

  7. (转) 将VB.NET网站转换成C#的全过程

    在学习URL重写过程中碰到个是VB写的源码,看起来总是不爽的就GOOLE了下 感觉这个文章写的不错 原文地址 http://www.cnblogs.com/cngunner/archive/2006/ ...

  8. C# 与 VB.NET 对比

    C# 与 VB.NET 对比 2008-06-20 15:30 by Anders Cui, 1462 阅读, 3 评论, 收藏, 编辑 Table of Contents 1.0       Int ...

  9. VB.NET and C# 差异

    VB.NET Program Structure C# Imports System Namespace Hello    Class HelloWorld       Overloads Share ...

随机推荐

  1. 全面了解Linux下Proc文件系统

    全面了解Linux下Proc文件系统   Proc是一个虚拟文件系统,在Linux系统中它被挂载于/proc目录之上.Proc有多个功能 ,这其中包括用户可以通过它访问内核信息或用于排错,这其中一个非 ...

  2. finally不管有没有错都会运行 finally 块用于清除 try 块中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码

    finally 块用于清除 try 块中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码

  3. 二分图简单概念&&HDU 2063

    二分图: 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同 ...

  4. mysql 编码错误修改

    set character_set_results=utf8;

  5. CSS3:元素的边框、背景和大小

    边框 和边框相关的属性例如以下. border-width 用于设置边框的宽度,可选择包含: 1)<长度值>:将边框宽度设为以CSS度量单位(如em.px.cm)表达的长度值. 2)< ...

  6. zenDiscovery和master选举

    上一篇通过 ElectMasterService源码,分析了master选举的原理的大部分内容:master候选节点ID排序保证选举一致性及通过设置最小可见候选节点数目避免brain split.节点 ...

  7. vue ---webpack 打包上线

     先来描述一下期间遇到的问题有哪些: 1.打包后将 dist 文件夹和 index.html 放到 tomcat,在浏览器中访问时,出现空白页,f12 提示 404. 2.打包好的静态资源均是绝对路径 ...

  8. BZOJ4817: [Sdoi2017]树点涂色(LCT)

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

  9. ArcGIS小技巧——多图层情况下交互显示效果

    在使用ArcMap处理数据的过程中,通常需要对比不同图层之间的差异.或者查看影像配准情况,这时我通常会怀念ENVI中的强大的拉幕显示.闪烁.亮度和透明度显示工具...... 直到有一天,闲着没事干捣鼓 ...

  10. Unity新版网络-NetworkManager

    NetworkManager是一个组件,用来管理网络多人游戏的状态.它实际上是完全使用HLAPI实现,所以它所做的一切程序员可以使用其他方式实现.然而,NetworkManager封装好了很多有用的功 ...