Unity3D 委托和事件的优点(一)

本文作者分享了在Unity3D项目中使用委托和事件替代BroadcastMessage方法来提高怪物属性升级通知的效率。通过创建全局GameManager脚本,定义委托事件,并在每个怪物脚本中响应事件,实现所有怪物属性的批量增加,降低了资源消耗,提高了程序性能。

  上周接触到了委托,这周终于在自己的项目中用到了,现在准备用委托和事件的方案替换掉之前的一些使用不足的解决方案!

  在此感谢前辈们的优秀文章,我是根据在网上阅读的文章,通过自己的见解,并在自己的项目中进行实践,得出了一些结论与大家分享,我认为这样可以更好的提高我对委托的使用熟练的程度.

  因为刚刚接触到委托可能只是个人的小小的见解,希望可以给大家一些启示,起到抛砖引玉的作用!

(一) 先介绍一下之前项目中使用不足的解决方案.

  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;//*************************** 就把怪物升级属性增加添加到委托事件中 ***************************
		}
	}

这是升级属性增加的方法(可以忽略)

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地精战士等级提升模块 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	
	//-------------------------------------------------------------------------------------------- 地精战士不同等级的属性的变化的方法 --------------------------------------------------------------------------------------------
	void OrcWarriorMonster_Grade_Controller()
	{
		switch (OrcWarriorMonsterModel.OrcWarriorMonster_Grade_Model) {//@@@@@@@@@ 判断全局的怪物二的等级 @@@@@@@@@   
		case MonsterGrade.Zero://@@@@@@@@@ 如果是零级 @@@@@@@@@   
		{
			orcWarriorMonster_Model.Monster_STR_Model = 23.5f;//*************************** 地精战士的力量为二十 ***************************
			orcWarriorMonster_Model.Monster_HP_Model = 
				orcWarriorMonster_Model.Monster_STR_Model * 10f + orcWarriorMonster_Model.Monster_SPD_Model * 2f + orcWarriorMonster_Model.Monster_VIS_Model * 1f;//*************************** 地精战士的血量等于力量乘十加敏捷乘二加智力乘一 ***************************
			orcWarriorMonster_Model.Monster_CurrentHP_Model =orcWarriorMonster_Model.Monster_HP_Model;//*************************** 地精战士的当前血量 ***************************
			orcWarriorMonster_Model.Monster_ATK_Model = orcWarriorMonster_Model.Monster_STR_Model * 1.7f + orcWarriorMonster_Model.Monster_SPD_Model * 0.5f;//*************************** 地精战士的攻击力力量乘一点七加敏捷乘零点五 ***************************
			orcWarriorMonster_Model.Monster_DEF_Model = orcWarriorMonster_Model.Monster_STR_Model * 0.6f;//*************************** 地精战士的防御力等于力量乘二 ***************************
			orcWarriorMonster_Model.Monster_DEX_Model = 13f;//*************************** 地精战士的敏捷为十三 ***************************
			orcWarriorMonster_Model.Monster_SPD_Model = orcWarriorMonster_Model.Monster_DEX_Model * 0.1f - orcWarriorMonster_Model.Monster_STR_Model * 0.05f;//*************************** 地精战士的速度为敏捷乘零点一减去力量乘零点零三 ***************************
			orcWarriorMonster_Model.Monster_CRT_Model = (orcWarriorMonster_Model.Monster_DEX_Model + orcWarriorMonster_Model.Monster_STR_Model * 0.4f) * 0.01f;//*************************** 地精战士的暴击为敏捷加上力量乘零点四的和换算为百分比 ***************************
			orcWarriorMonster_Model.Monster_ASD_Model = orcWarriorMonster_Model.Monster_DEX_Model * 0.05f + orcWarriorMonster_Model.Monster_STR_Model * 0.02f;//*************************** 地精战士的攻速为敏捷乘零点五加上力量乘零点二的和 ***************************
			orcWarriorMonster_Model.Monster_VIS_Model = 5f;//*************************** 地精战士的智力为五 ***************************
			orcWarriorMonster_Model.Monster_MP_Model =orcWarriorMonster_Model.Monster_VIS_Model * 4f;//*************************** 地精战士的魔法值为智力乘四 ***************************
			orcWarriorMonster_Model.Monster_CurrentMP_Model = orcWarriorMonster_Model.Monster_MP_Model;//*************************** 地精战士的当前魔法值 ***************************
			orcWarriorMonster_Model.Monster_INT_Model = orcWarriorMonster_Model.Monster_VIS_Model * 0.6f;//*************************** 地精战士的魔法攻击力为智力乘以零点六 ***************************
			orcWarriorMonster_Model.Monster_FCR_Model = 1/orcWarriorMonster_Model.Monster_VIS_Model * 0.2f;//*************************** 地精战士的施法时间魔法值乘0.2取反 ******************
			orcWarriorMonster_Model.Monster_FCRTimer_Model = orcWarriorMonster_Model.Monster_FCR_Model;//*************************** 地精战士的当前施法时间的计时器 ******************
			orcWarriorMonster_Model.Monster_NeedAP_Model = 50f;//*************************** 强化地精战士所需的强化值为五十 ******************
			orcWarriorMonster_Model.Monster_APNeedTime_Model = 10f;//*************************** 强化地精战士所需的时间为十 ******************
			GetComponent<NavMeshAgent>().speed = orcWarriorMonster_Model.Monster_SPD_Model;//*************************** 设置寻路组件的速度为地精战士的速度值 ***************************
			MonsterPanelUIModel.isUpgradeComplete_2 = false;//*************************** 已经完成升级的开关控制 归零 ***************************
			break;
		}
		case MonsterGrade.Primary://@@@@@@@@@ 如果是初级 @@@@@@@@@   
		{
			orcWarriorMonster_Model.Monster_STR_Model = 32f;//*************************** 地精战士的力量为二十 ***************************
			orcWarriorMonster_Model.Monster_HP_Model = 
				orcWarriorMonster_Model.Monster_STR_Model * 10f + orcWarriorMonster_Model.Monster_SPD_Model * 2f + orcWarriorMonster_Model.Monster_VIS_Model * 1f;//*************************** 地精战士的血量等于力量乘十加敏捷乘二加智力乘一 ***************************
			orcWarriorMonster_Model.Monster_CurrentHP_Model =orcWarriorMonster_Model.Monster_HP_Model;//*************************** 地精战士的当前血量 ***************************
			orcWarriorMonster_Model.Monster_ATK_Model = orcWarriorMonster_Model.Monster_STR_Model * 1.7f + orcWarriorMonster_Model.Monster_SPD_Model * 0.5f;//*************************** 地精战士的攻击力力量乘一点七加敏捷乘零点五 ***************************
			orcWarriorMonster_Model.Monster_DEF_Model = orcWarriorMonster_Model.Monster_STR_Model * 0.7f;//*************************** 地精战士的防御力等于力量乘二 ***************************
			orcWarriorMonster_Model.Monster_DEX_Model = 20f;//*************************** 地精战士的敏捷为十三 ***************************
			orcWarriorMonster_Model.Monster_SPD_Model = orcWarriorMonster_Model.Monster_DEX_Model * 0.1f - orcWarriorMonster_Model.Monster_STR_Model * 0.05f;//*************************** 地精战士的速度为敏捷乘零点一减去力量乘零点零三 ***************************
			orcWarriorMonster_Model.Monster_CRT_Model = (orcWarriorMonster_Model.Monster_DEX_Model + orcWarriorMonster_Model.Monster_STR_Model * 0.4f) * 0.01f;//*************************** 地精战士的暴击为敏捷加上力量乘零点四的和换算为百分比 ***************************
			orcWarriorMonster_Model.Monster_ASD_Model = orcWarriorMonster_Model.Monster_DEX_Model * 0.05f + orcWarriorMonster_Model.Monster_STR_Model * 0.02f;//*************************** 地精战士的攻速为敏捷乘零点五加上力量乘零点二的和 ***************************
			orcWarriorMonster_Model.Monster_VIS_Model = 8f;//*************************** 地精战士的智力为五 ***************************
			orcWarriorMonster_Model.Monster_MP_Model =orcWarriorMonster_Model.Monster_VIS_Model * 4f;//*************************** 地精战士的魔法值为智力乘四 ***************************
			orcWarriorMonster_Model.Monster_CurrentMP_Model = orcWarriorMonster_Model.Monster_MP_Model;//*************************** 地精战士的当前魔法值 ***************************
			orcWarriorMonster_Model.Monster_INT_Model = orcWarriorMonster_Model.Monster_VIS_Model * 0.6f;//*************************** 地精战士的魔法攻击力为智力乘以零点六 ***************************
			orcWarriorMonster_Model.Monster_FCR_Model = 1/orcWarriorMonster_Model.Monster_VIS_Model * 0.2f;//*************************** 地精战士的施法时间魔法值乘0.2取反 ******************
			orcWarriorMonster_Model.Monster_FCRTimer_Model = orcWarriorMonster_Model.Monster_FCR_Model;//*************************** 地精战士的当前施法时间的计时器 ******************
			orcWarriorMonster_Model.Monster_NeedAP_Model = 60f;//*************************** 强化地精战士所需的强化值为六十 ******************
			orcWarriorMonster_Model.Monster_APNeedTime_Model = 12f;//*************************** 强化地精战士所需的时间为十二 ******************
			GetComponent<NavMeshAgent>().speed = orcWarriorMonster_Model.Monster_SPD_Model;//*************************** 设置寻路组件的速度为地精战士的速度值 ***************************
			MonsterPanelUIModel.isUpgradeComplete_2 = false;//*************************** 已经完成升级的开关控制 归零 ***************************
			break;
		}
		case MonsterGrade.Middle://@@@@@@@@@ 如果是中级 @@@@@@@@@   
		{
			orcWarriorMonster_Model.Monster_STR_Model = 45f;//*************************** 地精战士的力量为二十 ***************************
			orcWarriorMonster_Model.Monster_HP_Model = 
				orcWarriorMonster_Model.Monster_STR_Model * 10f + orcWarriorMonster_Model.Monster_SPD_Model * 2f + orcWarriorMonster_Model.Monster_VIS_Model * 1f;//*************************** 地精战士的血量等于力量乘十加敏捷乘二加智力乘一 ***************************
			orcWarriorMonster_Model.Monster_CurrentHP_Model =orcWarriorMonster_Model.Monster_HP_Model;//*************************** 地精战士的当前血量 ***************************
			orcWarriorMonster_Model.Monster_ATK_Model = orcWarriorMonster_Model.Monster_STR_Model * 1.7f + orcWarriorMonster_Model.Monster_SPD_Model * 0.5f;//*************************** 地精战士的攻击力力量乘一点七加敏捷乘零点五 ***************************
			orcWarriorMonster_Model.Monster_DEF_Model = orcWarriorMonster_Model.Monster_STR_Model * 0.8f;//*************************** 地精战士的防御力等于力量乘二 ***************************
			orcWarriorMonster_Model.Monster_DEX_Model = 26f;//*************************** 地精战士的敏捷为十三 ***************************
			orcWarriorMonster_Model.Monster_SPD_Model = orcWarriorMonster_Model.Monster_DEX_Model * 0.1f - orcWarriorMonster_Model.Monster_STR_Model * 0.05f;//*************************** 地精战士的速度为敏捷乘零点一减去力量乘零点零三 ***************************
			orcWarriorMonster_Model.Monster_CRT_Model = (orcWarriorMonster_Model.Monster_DEX_Model + orcWarriorMonster_Model.Monster_STR_Model * 0.4f) * 0.01f;//*************************** 地精战士的暴击为敏捷加上力量乘零点四的和换算为百分比 ***************************
			orcWarriorMonster_Model.Monster_ASD_Model = orcWarriorMonster_Model.Monster_DEX_Model * 0.05f + orcWarriorMonster_Model.Monster_STR_Model * 0.02f;//*************************** 地精战士的攻速为敏捷乘零点五加上力量乘零点二的和 ***************************
			orcWarriorMonster_Model.Monster_VIS_Model = 17f;//*************************** 地精战士的智力为五 ***************************
			orcWarriorMonster_Model.Monster_MP_Model =orcWarriorMonster_Model.Monster_VIS_Model * 4f;//*************************** 地精战士的魔法值为智力乘四 ***************************
			orcWarriorMonster_Model.Monster_CurrentMP_Model = orcWarriorMonster_Model.Monster_MP_Model;//*************************** 地精战士的当前魔法值 ***************************
			orcWarriorMonster_Model.Monster_INT_Model = orcWarriorMonster_Model.Monster_VIS_Model * 0.6f;//*************************** 地精战士的魔法攻击力为智力乘以零点六 ***************************
			orcWarriorMonster_Model.Monster_FCR_Model = 1/orcWarriorMonster_Model.Monster_VIS_Model * 0.2f;//*************************** 地精战士的施法时间魔法值乘0.2取反 ******************
			orcWarriorMonster_Model.Monster_FCRTimer_Model = orcWarriorMonster_Model.Monster_FCR_Model;//*************************** 地精战士的当前施法时间的计时器 ******************
			orcWarriorMonster_Model.Monster_NeedAP_Model = 70f;//*************************** 强化地精战士所需的强化值为七十 ******************
			orcWarriorMonster_Model.Monster_APNeedTime_Model = 15f;//*************************** 强化地精战士所需的时间为十五 ******************
			GetComponent<NavMeshAgent>().speed = orcWarriorMonster_Model.Monster_SPD_Model;//*************************** 设置寻路组件的速度为地精战士的速度值 ***************************
			MonsterPanelUIModel.isUpgradeComplete_2 = false;//*************************** 已经完成升级的开关控制 归零 ***************************
			break;
		}
		case MonsterGrade.advance://@@@@@@@@@ 如果是高级 @@@@@@@@@   
		{
			orcWarriorMonster_Model.Monster_STR_Model = 56f;//*************************** 地精战士的力量为二十 ***************************
			orcWarriorMonster_Model.Monster_HP_Model = 
				orcWarriorMonster_Model.Monster_STR_Model * 10f + orcWarriorMonster_Model.Monster_SPD_Model * 2f + orcWarriorMonster_Model.Monster_VIS_Model * 1f;//*************************** 地精战士的血量等于力量乘十加敏捷乘二加智力乘一 ***************************
			orcWarriorMonster_Model.Monster_CurrentHP_Model =orcWarriorMonster_Model.Monster_HP_Model;//*************************** 地精战士的当前血量 ***************************
			orcWarriorMonster_Model.Monster_ATK_Model = orcWarriorMonster_Model.Monster_STR_Model * 1.7f + orcWarriorMonster_Model.Monster_SPD_Model * 0.5f;//*************************** 地精战士的攻击力力量乘一点七加敏捷乘零点五 ***************************
			orcWarriorMonster_Model.Monster_DEF_Model = orcWarriorMonster_Model.Monster_STR_Model * 1f;//*************************** 地精战士的防御力等于力量乘二 ***************************
			orcWarriorMonster_Model.Monster_DEX_Model = 30f;//*************************** 地精战士的敏捷为十三 ***************************
			orcWarriorMonster_Model.Monster_SPD_Model = orcWarriorMonster_Model.Monster_DEX_Model * 0.1f - orcWarriorMonster_Model.Monster_STR_Model * 0.05f;//*************************** 地精战士的速度为敏捷乘零点一减去力量乘零点零三 ***************************
			orcWarriorMonster_Model.Monster_CRT_Model = (orcWarriorMonster_Model.Monster_DEX_Model + orcWarriorMonster_Model.Monster_STR_Model * 0.4f) * 0.01f;//*************************** 地精战士的暴击为敏捷加上力量乘零点四的和换算为百分比 ***************************
			orcWarriorMonster_Model.Monster_ASD_Model = orcWarriorMonster_Model.Monster_DEX_Model * 0.05f + orcWarriorMonster_Model.Monster_STR_Model * 0.02f;//*************************** 地精战士的攻速为敏捷乘零点五加上力量乘零点二的和 ***************************
			orcWarriorMonster_Model.Monster_VIS_Model = 20f;//*************************** 地精战士的智力为五 ***************************
			orcWarriorMonster_Model.Monster_MP_Model =orcWarriorMonster_Model.Monster_VIS_Model * 4f;//*************************** 地精战士的魔法值为智力乘四 ***************************
			orcWarriorMonster_Model.Monster_CurrentMP_Model = orcWarriorMonster_Model.Monster_MP_Model;//*************************** 地精战士的当前魔法值 ***************************
			orcWarriorMonster_Model.Monster_INT_Model = orcWarriorMonster_Model.Monster_VIS_Model * 0.6f;//*************************** 地精战士的魔法攻击力为智力乘以零点六 ***************************
			orcWarriorMonster_Model.Monster_FCR_Model = 1/orcWarriorMonster_Model.Monster_VIS_Model * 0.2f;//*************************** 地精战士的施法时间魔法值乘0.2取反 ******************
			orcWarriorMonster_Model.Monster_FCRTimer_Model = orcWarriorMonster_Model.Monster_FCR_Model;//*************************** 地精战士的当前施法时间的计时器 ******************
			orcWarriorMonster_Model.Monster_NeedAP_Model = 80f;//*************************** 强化地精战士所需的强化值为八十 ******************
			orcWarriorMonster_Model.Monster_APNeedTime_Model = 20f;//*************************** 强化地精战士所需的时间为二十 ******************
			GetComponent<NavMeshAgent>().speed = orcWarriorMonster_Model.Monster_SPD_Model;//*************************** 设置寻路组件的速度为地精战士的速度值 ***************************
			MonsterPanelUIModel.isUpgradeComplete_2 = false;//*************************** 已经完成升级的开关控制 归零 ***************************
			break;
		}
		}
	}

如果大家,还用什么不懂的,可以在评论中联系我哦,我经常在CSDN的,如果遇到什么问题需要用委托事件来解决的,也可以和我来讨论哦!

最后谢谢大家的支持,我会继续努力的!


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值