日期:2014-05-17 浏览次数:20831 次
本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。
http://blog.csdn.net/lzhq1982/article/details/12999381
对C#还不是很熟,在学习的过程中了解到C#有种代理和事件的机制很方便,之前用cocos2d的时候也用过代理,虽然此代理非彼代理,但他们的作用有相似之处,都是触发者只是告知事件,并不调用相关类和方法实现,而是由代理方法实现,可能有些难懂,下面我用之前的demo中英雄施放技能这里做个试验。
本篇涉及三个知识点,一个是最重要的代理,一个是NGUI的按钮,一个是施放技能特效。
1、NGUI制作技能按钮
关于NGUI我前面的文章说了好多,重复的部分我就不介绍了。我打算把技能按钮放在NGUI界面布局的右下角锚点处,先在右下角锚点处加个Panel,我起名SkillPanel,在该Panel下我建立一个按钮,选NGUI->Open the Widget Wizard,Atlas选你将图片打包的那个文件,没有的话先建立一个,不知道怎么建的看前面的文章。Template里选Button,然后会出现Background,是按钮图片,从Atlas中选一个,我的设置如下:
选择Add To后SkillPanel下新增一个按钮,我起名ZhongJiButton,布局如下:
调整位置,我的按钮截屏如下(右下角那个):
2、利用C#的代理和事件施放技能。
要施放技能,肯定要点击按钮,NGUI为按钮提供了OnClick接口。我们先创建一个脚本,我命名CastSkill,然后拖到ZhongJiButton上,CastSkill里只要实现OnClick接口就好了。一般我们会怎么实现点击施放呢,最传统的做法就是获得英雄的对象,然后利用该对象向她传递施放技能的消息,比如代码如下:
void OnClick() { GameObject hero = GameObject.Find("Blade_Girl_Prefab"); if (hero) hero.SendMessage("CastSkill", 1); }像上面我通知hero的CastSkill接口,传递的参数1是SkillID,很简单,这就实现了,但你有没有想过,这又陷入了脚本之间耦合性的增加,看过我前面单例脚本和单例类这篇文章应该明白脚本之间大量的互相访问不是件好事。那我们就看看代理能不能帮我们解决办法。
想了解什么是代理和怎么用代理的可以看这篇文章,写的挺全的:C#中的代理与事件,重点看里面的一和三,我就偷个懒,只说明我这里是怎么实现的。现在我用代理重新改一下上面的脚本:
public class CastSkill : MonoBehaviour { public delegate void EventHandler(int nSkillId); public event EventHandler OnCastSkill; void OnClick() { if (OnCastSkill != null) OnCastSkill(1); } }
CastSkill onCastSkill = skillBtn.GetComponent<CastSkill>(); onCastSkill.OnCastSkill += CastSkill;
void CastSkill(int nSkillId) { if (curState == en_state.en_state_idel || curState == en_state.en_state_attack) { if (nSkillId == 1) { lastState = curState; curState = en_state.en_state_skill; } } }
3、施放技能
如上面代码,我给英雄置了当前状态为技能状态,她会在Update的状态机里处理,调用playEffect函数。
void playEffect() { if (!animation.IsPlaying("ComboAttack")) gameObject.animation.CrossFade("ComboAttack"); AnimationState state = animation["ComboAttack"]; if (state.time >= state.length-0.5f && !isCastSkill) { Vector3 pos = transform.position + transform.TransformDirection(Vector3.forward*3); Instantiate(effect, pos, transform.rotation); isCastSkill = true; } if (isCastSkill && state.time >= state.length-0.1f) { isCastSkill = false; curState = lastState; } }
在这里谢谢各位的支持,使得本系列文章被csdn在博客首页和个人页侧边栏推荐为最新精华博文,本人不胜感激,受宠若惊,今后当更加努力,希望能多多的帮助他人,哈哈,也希望大家多提宝贵意见,小弟在这里拜谢了。