Delegates in Unity

Introduction

Delegate is a container for a function that can be used as a variable. Delegate helps in making code modular and efficient. It works like a subscription-based service, where the passed method gets called when subscribed and vice versa.

There are two types of Delegates

Single-Cast Delegate — can hold single method.

Multi-Cast Delegate — can hold multiple methods.

Getting Started

Declare Delegate

Delegates in C# can be defined by using delegate keyword followed by return-type, name, and parameter.

Member variable can be declared by using member-type followed by a variable name.

//Defining Delegate

public delegate void MyDelegate();

public static MyDelegate myDelegate;

Using Single-Cast Delegate

Declared methods can be assigned to Single-Cast Delegate using “=”.

//Subscribing to Single-Cast delegate

myDelegate = myMethod;

Using Multi-Cast Delegate

Declared methods can be assigned to Single-Cast Delegate using “+=”.

//Subscribing to Multi-Cast delegate

myDelegate += myMethodOne;

myDelegate += myMethodTwo;

De-Assign method from delegate

To De-Assign methods from delegate, “-=” is used.

//UnSubscribing to Delegate

myDelegate -= myMethod;

myDelegate -=myMethodOne

myDelegate -=myMethodTwo

Calling Delegate

Delegates are called like methods.

//Delegates without parameters

myDelegate()

//Delegates with integer as parameters

myDelegate(20)

Understanding Delegates

Delegates are used to perform tasks assigned to different methods with one call. The feasibility of subscribing and un-subscribing methods helps programmers to develop efficient and easy-to-expandable code structures.

Delegates vs Events

Events and delegates, both works on subscription-based service, but Delegates are independent of Events, whereas Events are dependent on Delegates and cannot be created without Delegates. Delegates are able to pass parameters, whereas Events are incapable of passing parameters.

Example Program

using UnityEngine;
using System.Collections;
public class DelegateHandler : MonoBehaviour
{
public delegate void MyDelegate (string m_name);
public static MyDelegate myDelegate;

public void Start()
{
myDelegate = PrintName;
myDelegate("John");
}

public void PrintName(string name)
{
print(name);
}

}

Output

John

Conclusion

Delegates are efficient, and helps to create modular, expandable, and re-usable code, but should be un-subscribed when required or may lead to memory leaks.

Written by

XR Developer responsible for end-to-end development of XR solutions spanning multiple domains, by using various XR and WebXR libraries.

Leave a Reply