
Unity利用观察者模式更新金币数据
观察者设计模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。这种模式非常适合用于处理事件驱动的系统,比如游戏中的UI更新。在游戏中,玩家的金币和钻石数量可能会因为各种事件(如完成任务、购买道具等)而发生变化。通过使用观察者模式,我们可以将金币和钻石的UI元素注册为观察者,当这些资源数量发生变化时,UI元素会自动更新,
·
观察者设计模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。这种模式非常适合用于处理事件驱动的系统,比如游戏中的UI更新。在游戏中,玩家的金币和钻石数量可能会因为各种事件(如完成任务、购买道具等)而发生变化。通过使用观察者模式,我们可以将金币和钻石的UI元素注册为观察者,当这些资源数量发生变化时,UI元素会自动更新,而不需要手动去触发更新逻辑。这不仅简化了代码结构,还提高了系统的可维护性和扩展性。观察者模式还能用在游戏中群里群体出动的怪物等,当一群怪物中的其中一只被攻击了,就通知其他怪物群体攻击玩家等。
草图:
第一步创建2个文本
第二步创建一个脚本InterfaceManager用来管理接口
//定义观察者接口
public interface IObserver
{
//接收信息
void Receiving();
}
//定义被观察者接口
public interface ISubject
{
//注册观察者
void RegisterObserver(IObserver observer);
//注销观察者
void RemoveObserver(IObserver observer);
//通知观察者
void NotifyObservers();
}
第三步创建一个被观察者脚本ConcreteSubject。被观察者继承ISubject接口并实现里面的三个方法(当用户按下空格的时候通知其他观察者)
using System;
using System.Collections.Generic;
using UnityEngine;
public class ConcreteSubject : MonoBehaviour,ISubject
{
// 定义一个观察者列表
private List<IObserver> _observers = new List<IObserver>();
// 实现注册观察者的方法
public void RegisterObserver(IObserver observer)
{
_observers.Add(observer);
}
// 实现移除观察者的方法
public void RemoveObserver(IObserver observer)
{
_observers.Remove(observer);
}
// 实现通知观察者的方法
public void NotifyObservers()
{
foreach (var observer in _observers)
{
observer.Receiving();
}
}
void Start()
{
//注册观察者
RegisterObserver(FindObjectOfType<GoldObserver>());//注册金币观察者
RegisterObserver(FindObjectOfType<MasonryObserver>());//注册钻石观察者
}
void Update()
{
//按下空格键通知所有的观察者
if (Input.GetKeyDown(KeyCode.Space))
{
NotifyObservers();
}
}
}
第四步创建金币观察者(GoldObserver)和钻石观察者 (MasonryObserver)脚本
金币观察者脚本:
using UnityEngine;
using UnityEngine.UI;
public class GoldObserver : MonoBehaviour, IObserver
{
private int goldnum = 0;
private Text goldnum_text;
void Awake()
{
goldnum_text = gameObject.GetComponent<Text>();
goldnum_text.text = "金币:" + goldnum.ToString();
}
public void Receiving()
{
goldnum += 10;
goldnum_text.text = "金币:" + goldnum.ToString();
//Debug.Log("我是金币观察者,收到消息" + goldnum.ToString());
}
}
钻石观察者脚本:
using UnityEngine;
using UnityEngine.UI;
public class MasonryObserver : MonoBehaviour, IObserver
{
private int masonrynum = 0;
private Text masonry_text;
void Awake()
{
masonry_text = gameObject.GetComponent<Text>();
masonry_text.text = "钻石:" + masonrynum.ToString();
}
public void Receiving()
{
masonrynum += 50;
masonry_text.text = "钻石:" + masonrynum.ToString();
//Debug.Log("我是钻石观察者,收到消息");
}
}
第五步创建一个空对象,并把被观察者脚本拖到这个空对象上,并且把金币和钻石观察者拖到对应的文本上。
第六步运行游戏按下空格就会发现金币和钻石的数量更新了(这里为了区分这里按下空格金币一次加10,钻石加50)
更多推荐
所有评论(0)