【Unity经验】委托与事件
来源:互联网 发布:大数据量化基金 编辑:程序博客网 时间:2024/05/22 13:18
SIKI的TaidouARPGProject的028-控制人物的状态和其他信息的更新同步
里面就使用了委托与事件,其他的参考资料在文章下面
PlayerInfo是事件,PlayerBar是委托
PlayerBar委托PlayerInfo办事情,由于PlayerBar要办理的业务很多很杂,因此PlayerInfo需要知道PB要办理什么样的业务,
才能解决对应的问题
委托的标识符就是delegate
事件通常要标记事件的
PlayerInfo.cs文件中枚举函数InfoType,由玩家的基础数据构成
(图1)
声明事件 玩家信息改变的事件 为(枚举类型 InfoType 名字为type)
使得这个玩家信息改变的事件 事件的名字为 OnPlayerInfoChanged
(图2)
在PlayerInfo.cs文件中的update函数,用来判断 体力和历练的增长,
如果 体力和历练,分别发生改变,则调用 事件OnPlayerInfoChanged(枚举类型InfoType的能量或历练)
(图3)
在委托 PlayerBar.cs文件中初始化函数 添加了 PlayerBar.cs文件中的函数 InfoChanged 到 PlayerInfo.cs的事件OnPlayerInfoChanged
OnDestroy函数【为Unity类的函数,具体方法请参考网络】当该物体销毁的时候,就注销这个PlayerBar.cs文件中的函数 InfoChanged事件
在InfoChanged函数(名字为type的InfoType类)【这个在PlayerBar.cs的InfoType类 并没有声明,在图2中就已经声明】
InfoChanged函数里面的IF语句用于判断 传递的数据 是否是PlayerInfo。cs的枚举类【用于存放用户的基础属性】
(图4)
UpdateShow函数,用于更新在PlayerInfo.cs中的数据
在UpdateShow函数中,创建了一个局部变量,变量类型为PlayerInfo的名字为info的变量
PlayerInfo info = PlayerInfo._instance;
PlayerInfo._instance//调用PlayerInfo的_instance函数,在PlayerInfo就已经声明了公开的静态的public static PlayerInfo _instance;
在PlayerInfo.cs中就已经初始化
void Awake() {
_instance = this;
}
(图5)
levelLabel.text = info.Level.ToString();
等号左边的levelLabel是Unity文本对象(图8显示)
等号右边的是 图5 中的 PlayerInfo类的info变量
PlayerInfo类的info变量里面有对应的变量,他们都已经在PlayerInfo定义好了(图7)
并且使用get和set方法,改变获得对应的变量(历练,能量)(图8)
PlayerInfo。cs的文件
(图6)
PlayerInfo。cs的文件
(图7)
PlayerBar。cs文件中的函数
(图8)
---------------------------------------------PlayerBar.cs----------------------------------------------
using UnityEngine;using System.Collections;public class PlayerBar : MonoBehaviour { private UISprite headSprite; private UILabel nameLabel; private UILabel levelLabel; private UISlider energySlider; private UILabel energyLabel; private UISlider toughenSlider; private UILabel toughenLabel; private UIButton energyPlusButton; private UIButton toughenPlusButton; private UIButton headButton; void Awake() { headSprite = transform.Find("HeadSprite").GetComponent<UISprite>(); nameLabel = transform.Find("NameLabel").GetComponent<UILabel>(); levelLabel = transform.Find("LevelLabel").GetComponent<UILabel>(); energySlider = transform.Find("EnergyProgressBar").GetComponent<UISlider>(); energyLabel = transform.Find("EnergyProgressBar/Label").GetComponent<UILabel>(); toughenSlider = transform.Find("ToughenProgressBar").GetComponent<UISlider>(); toughenLabel = transform.Find("ToughenProgressBar/Label").GetComponent<UILabel>(); energyPlusButton = transform.Find("EnergyPlusButton").GetComponent<UIButton>(); toughenPlusButton = transform.Find("ToughenPlusButton").GetComponent<UIButton>(); headButton = transform.Find("HeadButton").GetComponent<UIButton>(); PlayerInfo._instance.OnPlayerInfoChanged += this.InfoChanged; EventDelegate ed = new EventDelegate(this, "OnHeadButtonClick"); headButton.onClick.Add(ed); } void OnDestroy() { PlayerInfo._instance.OnPlayerInfoChanged -= this.InfoChanged; } //当我们的主角信息发生改变的时候 会触发这个方法 void InfoChanged(InfoType type) { if (type==InfoType.All|| type == InfoType.Name || type == InfoType.HeadPortrait || type == InfoType.Level || type == InfoType.Energy || type == InfoType.Toughen) { UpdateShow(); } } //更新显示 void UpdateShow() { PlayerInfo info = PlayerInfo._instance; headSprite.spriteName = info.HeadPortrait; levelLabel.text = info.Level.ToString(); nameLabel.text = info.Name.ToString(); energySlider.value = info.Energy / 100f; energyLabel.text = info.Energy + "/100"; toughenSlider.value = info.Toughen / 50f; toughenLabel.text = info.Toughen + "/50"; } public void OnHeadButtonClick() { PlayerStatus._instance.Show(); }}
---------------------------------------------PlayerInfo.cs----------------------------------------------
using UnityEngine;using System.Collections;public enum InfoType { Name, HeadPortrait, Level, Power, Exp, Diamond, Coin, Energy, Toughen, HP, Damage, Equip, All}public enum PlayerType { Warrior, FemaleAssassin}public class PlayerInfo : MonoBehaviour { public static PlayerInfo _instance; #region property private string _name; private string _headPortrait; private int _level = 1; private int _power = 1; private int _exp = 0; private int _diamond ; private int _coin; private int _energy; private int _toughen; private int _hp; private int _damage; private PlayerType _playerType; //private int _helmID =0 ; //private int _clothID =0 ; //private int _weaponID =0 ; //private int _shoesID=0; //private int _necklaceID=0; //private int _braceletID=0; //private int _ringID=0; //private int _wingID=0; public InventoryItem helmInventoryItem; public InventoryItem clothInventoryItem; public InventoryItem weaponInventoryItem; public InventoryItem shoesInventoryItem; public InventoryItem necklaceInventoryItem; public InventoryItem braceletInventoryItem; public InventoryItem ringInventoryItem; public InventoryItem wingInventoryItem; #endregion public float energyTimer = 0; public float toughenTimer = 0; public delegate void OnPlayerInfoChangedEvent( InfoType type ); public event OnPlayerInfoChangedEvent OnPlayerInfoChanged; #region get set methd public string Name { get { return _name; } set { _name = value; } } public string HeadPortrait { get { return _headPortrait; } set { _headPortrait = value; } } public int Level { get { return _level; } set { _level = value; } } public int Power { get { return _power; } set { _power = value; } } public int Exp { get { return _exp; } set { _exp = value; } } public int Diamond { get { return _diamond; } set { _diamond = value; } } public int Coin { get { return _coin; } set { _coin = value; } } public int Energy { get { return _energy; } set { _energy = value; } } public int Toughen { get { return _toughen; } set { _toughen = value; } } public int HP{ get{ return _hp; } set{ _hp = value; } } public int Damage{ get{return _damage;} set{_damage = value;} } public PlayerType PlayerType { get { return _playerType; } set { _playerType = value; } } //public int HelmID{ // get{return _helmID; } // set{_helmID=value;} //} //public int ClothID{ // get{return _clothID;} // set{_clothID=value;} //} //public int WeaponID{ // get{ // return _weaponID; // } // set{ // _weaponID = value; // } //} //public int ShoesID{ // get{ // return _shoesID; // } // set{ // _shoesID = value; // } //} //public int NecklaceID{ // get{return _necklaceID;} // set{ _necklaceID=value; } //} //public int BraceletID{ // get{return _braceletID;} // set{_braceletID=value;} //} //public int RingID{ // get{return _ringID;} // set{_ringID=value;} //} //public int WingID{ // get{ // return _wingID; // } // set{ // _wingID=value; // } //} #endregion #region unity event void Awake() { _instance = this; } void Start() { Init(); } void Update() { //实现体力和历练的自动增长 if (this.Energy < 100) { energyTimer += Time.deltaTime; if (energyTimer > 60) { Energy += 1; energyTimer -= 60; OnPlayerInfoChanged(InfoType.Energy); } } else { this.energyTimer = 0; } if (this.Toughen < 50) { toughenTimer += Time.deltaTime; if (toughenTimer > 60) { Toughen += 1; toughenTimer -= 60; OnPlayerInfoChanged(InfoType.Toughen); } } else { toughenTimer = 0; } } #endregion void Init() { this.Coin = 9870; this.Diamond = 1234; this.Energy = 78; this.Exp = 123; this.HeadPortrait = "头像底板女性"; this.Level = 12; this.Name="千颂伊"; this.Toughen = 34; //this.BraceletID = 1001; //this.WingID = 1002; //this.RingID = 1003; //this.ClothID = 1004; //this.HelmID = 1005; //this.WeaponID = 1006; //this.NecklaceID = 1007; //this.ShoesID = 1008; InitHPDamagePower(); OnPlayerInfoChanged( InfoType.All ); } public void ChangeName(string newName) { this.Name = newName; OnPlayerInfoChanged(InfoType.Name); } public void DressOn( InventoryItem it ) { it.IsDressed = true; //首先检测有没有穿上相同类型的装备 bool isDressed = false; InventoryItem inventoryItemDressed = null; switch (it.Inventory.EquipTYPE) { case EquipType.Bracelet: if (braceletInventoryItem != null) { isDressed = true; inventoryItemDressed = braceletInventoryItem; } braceletInventoryItem = it; break; case EquipType.Cloth: if (clothInventoryItem != null) { isDressed = true; inventoryItemDressed = clothInventoryItem; } clothInventoryItem = it; break; case EquipType.Helm: if (helmInventoryItem != null) { isDressed = true; inventoryItemDressed = helmInventoryItem; } helmInventoryItem = it; break; case EquipType.Necklace: if (necklaceInventoryItem != null) { isDressed = true; inventoryItemDressed = necklaceInventoryItem; } necklaceInventoryItem = it; break; case EquipType.Ring: if (ringInventoryItem != null) { isDressed = true; inventoryItemDressed = ringInventoryItem; } ringInventoryItem = it; break; case EquipType.Shoes: if (shoesInventoryItem != null) { isDressed = true; inventoryItemDressed = shoesInventoryItem; } shoesInventoryItem = it; break; case EquipType.Weapon: if (weaponInventoryItem != null) { isDressed = true; inventoryItemDressed = weaponInventoryItem; } weaponInventoryItem = it; break; case EquipType.Wing: if(wingInventoryItem != null) { isDressed = true; inventoryItemDressed = wingInventoryItem; } wingInventoryItem = it; break; } //有 if (isDressed) { inventoryItemDressed.IsDressed = false; InventoryUI._instance.AddInventoryItem( inventoryItemDressed ); } OnPlayerInfoChanged(InfoType.Equip); // 把已经存在的脱掉 放到背包 //没有 //直接穿上 } public void DressOff(InventoryItem it) { it.IsDressed = false; switch (it.Inventory.EquipTYPE) { case EquipType.Bracelet: if (braceletInventoryItem != null) { braceletInventoryItem = null; } break; case EquipType.Cloth: if (clothInventoryItem != null) { clothInventoryItem = null; } break; case EquipType.Helm: if (helmInventoryItem != null) { helmInventoryItem=null; } break; case EquipType.Necklace: if (necklaceInventoryItem != null) { necklaceInventoryItem = null; } break; case EquipType.Ring: if (ringInventoryItem != null) { ringInventoryItem = null; } break; case EquipType.Shoes: if (shoesInventoryItem != null) { shoesInventoryItem = null; } break; case EquipType.Weapon: if (weaponInventoryItem != null) { weaponInventoryItem = null; } break; case EquipType.Wing: if (wingInventoryItem != null) { wingInventoryItem = null; } break; } InventoryUI._instance.AddInventoryItem(it); OnPlayerInfoChanged(InfoType.Equip); } public void InventoryUse( InventoryItem it,int count ) { //使用效果 //TODO //处理物品使用后是否还存在 it.Count-=count; if (it.Count <= 0) { InventoryManager._instance.inventoryItemList.Remove(it); } } //取得需要个数的金币数 public bool GetCoin(int count) { if (Coin >= count) { Coin -= count; OnPlayerInfoChanged(InfoType.Coin); return true; } return false; } public void AddCoin(int count) { this.Coin += count; OnPlayerInfoChanged(InfoType.Coin); } public int GetOverallPower() { float power = this.Power; if (helmInventoryItem != null) { power += helmInventoryItem.Inventory.Power * (1 + (helmInventoryItem.Level - 1) / 10f); } if (clothInventoryItem != null) { power += clothInventoryItem.Inventory.Power * (1 + (clothInventoryItem.Level - 1) / 10f); } if (weaponInventoryItem != null) { power += weaponInventoryItem.Inventory.Power * (1 + (weaponInventoryItem.Level - 1) / 10f); } if (shoesInventoryItem != null) { power += shoesInventoryItem.Inventory.Power * (1 + (shoesInventoryItem.Level - 1) / 10f); } if (necklaceInventoryItem != null) { power += necklaceInventoryItem.Inventory.Power * (1 + (necklaceInventoryItem.Level - 1) / 10f); } if (braceletInventoryItem != null) { power += braceletInventoryItem.Inventory.Power * (1 + (braceletInventoryItem.Level - 1) / 10f); } if (ringInventoryItem != null) { power += ringInventoryItem.Inventory.Power * (1 + (ringInventoryItem.Level - 1) / 10f); } if (wingInventoryItem != null) { power += wingInventoryItem.Inventory.Power * (1 + (wingInventoryItem.Level - 1) / 10f); } return (int)power; } void InitHPDamagePower() { this.HP = this.Level * 100; this.Damage = this.Level * 50; this.Power = this.HP + this.Damage; } void PutonEquip(int id) { if (id == 0) return; Inventory inventory = null; bool isExit = InventoryManager._instance.inventoryDict.TryGetValue(id, out inventory); this.HP += inventory.HP; this.Damage += inventory.Damage; this.Power += inventory.Power; } void PutoffEquip(int id) { if (id == 0) return; Inventory inventory = null; InventoryManager._instance.inventoryDict.TryGetValue(id, out inventory); this.HP -= inventory.HP; this.Damage -= inventory.Damage; this.Power -= inventory.Power; }}
参考资料:
Unity3D研究院之利用C#实现代理模式(四十)
- 【Unity经验】委托与事件
- Unity 之C# 委托与事件机制
- 详解Unity中的委托与事件
- 详解Unity中的委托与事件
- 详解Unity中的委托与事件
- unity 事件(委托)
- unity 事件(委托)
- Unity委托事件
- unity delegate事件委托
- Unity 委托事件
- C#中的委托与事件在Unity中的应用
- unity学习之委托与事件的初步应用
- [Unity&C#&事件委托]对委托事件的学习与实践
- 【unity】【Code】【Event事件】通用代码库(三)——Unity事件与委托
- Unity中的委托和事件
- 委托事件模拟unity生命周期
- unity 委托事件简单应用
- 委托入门-事件与委托
- 服务器性能优化和Mysql性能优化
- cocos2d-x面试题(一)
- IplImage 和 QImage的转换 (转:http://blog.sina.com.cn/s/blog_5c70dfc80100qzif.html)
- Android学习之路--View--事件传递机制
- Leetcode 164 Maximum Gap 桶排序好题
- 【Unity经验】委托与事件
- 整理了以下四种在MySQL中修改root密码的方法,可能对大家有所帮助!
- 解决MFC项目使用多字节字符集后软件界面风格发生改变的问题
- 457_自动滚动的ViewPager
- 深入理解Spark 2.1 Core (六):资源调度的原理与源码分析
- C++面试题(六)
- ECMAScript 6(2)let和块级作用域
- opencv 手势识别杂乱知识点
- 458_无限滚动的ViewPager