上周接触到了委托,这周终于在自己的项目中用到了,现在准备用委托和事件的方案替换掉之前的一些使用不足的解决方案!
在此感谢前辈们的优秀文章,我是根据在网上阅读的文章,通过自己的见解,并在自己的项目中进行实践,得出了一些结论与大家分享,我认为这样可以更好的提高我对委托的使用熟练的程度.
因为刚刚接触到委托可能只是个人的小小的见解,希望可以给大家一些启示,起到抛砖引玉的作用!
(一) 先介绍一下之前项目中使用不足的解决方案.
1) 需要解决的问题: 需要实现,在点击下升级怪物按钮时,通知所有的世界中的怪物,来进行属性的增加!
2) 解决方案: 创建一个空物体(Monster_Manager)用于保存世界中的怪物,再通过Unity3D引擎自带的回调方法BroadcastMessage("方法名") ->"作用是找到包括自己和自己子对象中是否有该方法,如果有该方法就执行". 写入一个脚本,在升级完成后,使用上面的回调方法,通知自己和子物体.
这是我在Monster_Manager上挂的脚本:
using UnityEngine;
using System.Collections;
/// <summary>
/// 功能:控制地精战士管理器下的子物体升级后的方法执行
/// 创建者: VioletTD
/// 修改时间: 2013年11月11日 21:38
/// 感谢: Me 加油!
/// </summary>
public class OrcWarriorMonsterManager : MonoBehaviour {
void Update () {
if (MonsterPanelUIModel.isUpgradeComplete_2) //@@@@@@@@@ 如果怪物二升级完成 @@@@@@@@@
{
BroadcastMessage("OrcWarriorMonster_Grade_Controller");//*************************** 发送消息通知本身和子物体全部执行该方法 ***************************
}
}
}
通过查找网络上的资料,关于Unity3D自己封装的Message方法(由一个物体通知其他(或子物体)(期间需要查找对象,在脚本中需找对应的方法......)来执行一个方法是相当耗费资源的),所以我说这是一个,不足不利于我们开发程序的解决方案!当然建议大家尽量不要使用该方法!
(二) 现在才是重点,其实很简单,大家注意看咯!
1) 需要解决的问题: 需要实现,在点击下升级怪物按钮时,通知所有的世界中的怪物,来进行属性的增加!
2) 解决方案: ①我设置了一个全局的游戏对象添加(GameManager脚本),在该脚本下写一个委托事件,用于控制怪物的升级的属性提升.②在每个怪物个更新方法中添加判断,如果升级成功,就把怪物的升级属性增加的方法作为事件,添加到全局的委托事件! 根据事件的特性,事件中的所用"方法事件"都会执行! 这样就完成了所有怪物的升级属性增加了!
这是GameManager脚本,记得一定要挂在全局的实例化游戏对象上啊
using UnityEngine;
using System.Collections;
/// <summary>
/// 功能:控制全局变量的游戏管理器
/// 创建者: VioletTD
/// 修改时间: 2013年11月10日 22:18
/// 感谢: Me 加油!
/// </summary>
public class GameManager : Singleton<GameManager> {
public delegate void Game_UpgradeMonster2_Manager();//*************************** 定义一个无参的管理怪物二的升级委托 ***************************
public event Game_UpgradeMonster2_Manager Game_ExecuteUpgradeMonster2_Manager;//*************************** 定义委托事件,用于条件判断并执行怪物的升级管理事件 ***************************
void Update()//*************************** Unity3D自带的回调更新方法 ***************************
{
if (MonsterPanelUIModel.isUpgradeComplete_2) //@@@@@@@@@ 如果怪物二升级完成 @@@@@@@@@
{
Game_ExecuteUpgradeMonster2_Manager();//*************************** 如果怪物二升级完成,就执行怪物升级的事件 ***************************
}
}
}
这是在怪物自己控制脚本 Update()中的判断
void Update ()
{
if(MonsterPanelUIModel.isUpgradeComplete_2)//@@@@@@@@@ 如果怪物二升级完成 @@@@@@@@@
{
GameManager.Instance.Game_ExecuteUpgradeMonster2_Manager += OrcWarriorMonster_Grade_Controller;//*************************** 就把怪物升级属性增加添加到委托事件中 ***************************
}
}
这是升级属性增加的方法(可以忽略)
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地精战士等级提升模块 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//-----------------------------------------------------------------