C# 和 Unity 中可观察集合的强大功能

本文介绍了如何在Unity游戏中利用C#的ObservableList和ObservableDictionary实现数据的自动通知,展示了如何追踪和响应列表和字典的修改,以及如何根据需求扩展这些功能,提升游戏性能和用户体验。

C# 和 Unity 中可观察集合的强大功能

在这里插入图片描述

介绍:

是否曾经希望您的 Unity 游戏能够神奇地适应数据的变化?输入可观察集合。本文揭示了它们的强大功能,提供了快速指南来轻松跟踪和响应列表和字典中的修改。另外,您可以遵循相同的技术来使更多数据结构可观察。深入研究、增强您的工具包,并利用 Observable Collections 将您的 Unity 游戏提升到新的高度!

1. 可观察列表:

我们将首先关注可观察列表,看看当数据发生变化时它们如何通知我们。
using System;
using System.Collections.Generic;
using System.Linq;

public class ObservableList<T> : List<T>
{
    // Event to notify when the list changes
    public event Action OnListChanged;

    public event Action<T> OnItemChanged;

    public new void Add(T item)
    {
        base.Add(item);
        NotifyListChanged();
    }

    public new void Remove(T item)
    {
        base.Remove(item);
        NotifyListChanged();
    }

    // Add other list modification methods as needed

    private void NotifyListChanged()
    {
        OnListChanged?.Invoke();
    }


    public void AddRange(IEnumerable<T> collection)
    {
     base.AddRange(collection);
     NotifyListChanged();
    }


    public void RemoveRange(IEnumerable<T> collection)
    {   
     base.RemoveAll(item => collection.Contains(item));
     NotifyListChanged();
    }

    public new void Clear()
    {
     base.Clear();
     NotifyListChanged();
    }

    public void ModifyItemAt(int index, T newItem)
    {
     base[index] = newItem;
     NotifyListChanged();
    }



    protected virtual void NotifyItemChanged(T item)
    {
      OnItemChanged?.Invoke(item);
    }
}
在此示例中,ObservableList 类继承自 List 并包含 OnListChanged 事件。添加和删​​除等方法已被重写,以在修改列表后调用 NotifyListChanged。然后调用该事件来通知所有订阅的方法有关更改的信息。

这就是我们使用它的方式:

public class Example : MonoBehaviour{

ObservableList<int> myList = new ObservableList<int>();

private void OnEnable()
{
  myList.OnListChanged += HandleListChanged;
}
private void OnDisable()
{
  myList.OnListChanged -= HandleListChanged;
}

private void Start()
{
  ChangeList();
}

private void ChangeList()
{
    myList.Add(42); // This will trigger HandleListChanged
}



private void HandleListChanged()
{
    // Do something when the list changes
    Debug.Log("List changed!");
}
}
这是一个基本示例,您可以根据您的具体需求进一步自定义。

2.可观察字典:

我们首先关注 Observable Dictionary,看看当数据发生变化时它们如何通知我们。
using System;
using System.Collections.Generic;
using System.Linq;

public class DictionaryObservable<TKey, TValue> : Dictionary<TKey, TValue>
{
    // Event to notify when the dictionary changes
    public event Action OnDictionaryChanged;

    public new void Add(TKey key, TValue value)
    {
        base.Add(key, value);
        NotifyDictionaryChanged();
    }

    public new bool Remove(TKey key)
    {
        bool removed = base.Remove(key);
        if (removed)
            NotifyDictionaryChanged();
        return removed;
    }

    // Add other dictionary modification methods as needed

    private void NotifyDictionaryChanged()
    {
        OnDictionaryChanged?.Invoke();
    }
}

这是如何使用它:

public class Example : MonoBehaviour
{

  DictionaryObservable<string, int> myDictionary = new DictionaryObservable<string, int>();

  private void OnEnable()
  {
     myDictionary.OnDictionaryChanged += HandleDictionaryChanged;
  }
  private void OnDisable()
  {
     myDictionary.OnDictionaryChanged -= HandleDictionaryChanged;
  }


  private void Start()
  {
    ChangeDict();
  }

  private void ChangeDict()
  {
    myDictionary.Add("One", 1); // This will trigger HandleDictionaryChanged
  }


  private void HandleDictionaryChanged()
  {
     // Do something when the dictionary changes
     Debug.Log("Dictionary changed!");
  }
}

与 ObservableList 示例类似,您可以根据您的特定需求使用范围操作、清除字典、修改值等附加功能来扩展此类。只需调整类以匹配观察字典中的变化所需的行为即可。

“与我们使用可观察列表和字典的旅程类似,相同的动态技术可以应用于各种数据结构。无论您使用的是集合、堆栈还是自定义结构,您都可以实现可观察模式来轻松跟踪和响应更改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小云同志你好

谁能书阁下,白首太玄经

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值