• <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><div id="ogoia"></div></div>
    <xmp id="ogoia"><li id="ogoia"></li>
    <small id="ogoia"><li id="ogoia"></li></small>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <menu id="ogoia"></menu>
  • <s id="ogoia"><menu id="ogoia"></menu></s> <small id="ogoia"><div id="ogoia"></div></small><label id="ogoia"></label>
    <menu id="ogoia"><menu id="ogoia"></menu></menu>
    <button id="ogoia"></button>
  • <div id="ogoia"><small id="ogoia"></small></div><xmp id="ogoia"><div id="ogoia"></div>
  • <div id="ogoia"><div id="ogoia"></div></div>
  • <div id="ogoia"></div>
  • <menu id="ogoia"><div id="ogoia"></div></menu>
  • <div id="ogoia"><div id="ogoia"></div></div>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><div id="ogoia"></div></div>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><button id="ogoia"></button></div>
  • <div id="ogoia"><li id="ogoia"></li></div>
    <small id="ogoia"><li id="ogoia"></li></small>
    <small id="ogoia"></small>
  • <small id="ogoia"></small>
    <small id="ogoia"><div id="ogoia"></div></small>
  • <div id="ogoia"><button id="ogoia"></button></div>
  • <small id="ogoia"><li id="ogoia"></li></small><small id="ogoia"><li id="ogoia"></li></small>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><li id="ogoia"></li></div>
  • <div id="ogoia"><button id="ogoia"></button></div>

    观察者模式在游戏开发中的应用

    观察者模式


    其定义了对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会得到通知,并响应对应的行为。

    需求描述:场景中有一个小球做自由落体运动,场景中存在三个Cube,这三个Cube会监视这个小球的运动状态,并保持自身的运动状态和小球的运动状态一致;同时,小球的坐标位置也会实时的显示到UI界面中。

    演示例子:

    在这里插入图片描述

    定义被观察者的接口
    /// <summary>
    /// 角色接口
    /// </summary>
    /// <typeparam name="T">要发布的消息的数据类型</typeparam>
    public interface ISubject<T> {
    	Action<T> PublicAction { get; set; }
    }
    
    定义观察者接口
    /// <summary>
    /// 观察者接口
    /// </summary>
    /// <typeparam name="T">接受消息的数据类型</typeparam>
    public interface IObserver<T> {
    	ISubject<T> Publisher { get; set; }
    	void Subscriber (T data);
    }
    
    定义需要传递消息的数据结构
    public struct DataType {
    	public Vector3 pos;
    	public string name;
    }
    
    定义并实现小球类(被观察者)(Ball)

    小球做自由落体运动,在这个过程中,小球会不断的向外部发送自己当前的位置信息。

    public class Ball : MonoBehaviour, ISubject<DataType> {
    
    	private DataType _dataType=new DataType{pos=Vector3.one,name="ball"};
    
    	public Action<DataType> PublicAction { get; set; }
    	private void PublishData () {
    		if (PublicAction != null) PublicAction (_dataType);
    	}
    	void Start () {
    
    	}
    	void Update () {
    		_dataType.pos=transform.position;
    		PublishData ();
    	}
    }
    
    定义具体观察者对象(Cube)

    Cube会随时观察者小球的位置信息,并保持自己的位置和小球的位置同步。

    public class Ball : MonoBehaviour, ISubject<DataType> {
    
    	private DataType _dataType=new DataType{pos=Vector3.one,name="ball"};
    
    	public Action<DataType> PublicAction { get; set; }
    	private void PublishData () {
    		if (PublicAction != null) PublicAction (_dataType);
    	}
    	void Start () {
    
    	}
    	void Update () {
    		_dataType.pos=transform.position;
    		PublishData ();
    	}
    }
    
    定义具体观察者对象(UIController)

    UIController 接受来自Ball的数据,并将数据实时显示到界面上。

    
    public class UIController : MonoBehaviour, IObserver<DataType> {
    	public Text _text;
    
    	public ISubject<DataType> Publisher { get; set; }
    
    	public void Subscriber (DataType data) {
    		_text.text = string.Format ("{0} : {1}", data.name, data.pos);
    	}
    	void Start () {
    		Publisher = FindObjectOfType<Ball> ();
    		Publisher.PublicAction += Subscriber;
    	}
    }
    

    演示Demo:

    https://gitee.com/Sun_ME/ObserverPattern.git

    更多内容,欢迎关注:


    在这里插入图片描述

    展开阅读全文

    没有更多推荐了,返回首页

    加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】| 加拿大28预测计划【复制fh118.com打开】|