Wzorzec projektowy Observer w Unity

Poniżej przykład prostej implementacji wzorca Obserwatora na podstawie Youtubera, który wrzuca nowy film i subskrybenta, który dostaje powiadomienie po wrzuceniu filmu.
W tym przykładzie, informacja poleci w świat po kliknięciu LMB.
W skrypcie Youtubera tworzymy taki event i jednocześnie sprawdzamy później czy ktokolwiek go nasłuchuje, ponieważ jeśli nikt nie będzie nasłuchiwał to nie ma sensu wysyłać komunikatu 😉
W skrypcie Subskrybenta subskrybujemy do tego eventu w metodzie OnEnable(), ale trzeba pamiętać by też odsubskrybować, gdy dany obiekt znika ze sceny i robimy to w metodzie OnDisable().

// Youtuber

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Youtuber : MonoBehaviour
{
    public static event Action NewVideo;

    private void Update()
    {
        if (Input.GetMouseButtonDown(1))
        {
            if (NewVideo != null)
            {
                NewVideo();
            }
            // Instrukcja poniżej zastępuje 4 powyższe więc warto jej użyć ;)
            //NewVideo?.Invoke();
        }
    }
}
// Subscriber

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Subscriber : MonoBehaviour
{
    private void OnEnable()
    {
        Youtuber.NewVideo += OpenYoutube;
    }

    private void OnDisable()
    {
        Youtuber.NewVideo -= OpenYoutube;   
    }

    void OpenYoutube()
    {
        Debug.Log("ok, let's watch a new movie");
    }

}

A teraz przykład w którym stworzymy powiadomienia z parametrem, aby zobaczyć do której playlisty został dodany nowy film.
Po kliknięciu LMB wyślemy informację, że wpadł film o Unity, a po kliknięciu RMB film o Blenderze.

// Youtuber

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Youtuber : MonoBehaviour
{
    public static event Action<string> NewVideo;

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            NewVideo?.Invoke("Unity");
        }
        else if (Input.GetMouseButtonDown(1))
        {
            NewVideo?.Invoke("Blender");
        }
    }
}
//Subscriber

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Subscriber : MonoBehaviour
{
    private void OnEnable()
    {
        Youtuber.NewVideo += OpenYoutube;
    }

    private void OnDisable()
    {
        Youtuber.NewVideo -= OpenYoutube;   
    }

    void OpenYoutube(string playlista)
    {
        Debug.Log($"Let's watch a new movie to learn more about {playlista}");
    }
}
Ask ChatGPT
Set ChatGPT API key
Find your Secret API key in your ChatGPT User settings and paste it here to connect ChatGPT with your Tutor LMS website.
Scroll to Top