欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频、U3D教程、U3D常见问题、U3D项目源码,我们致力于打造业内unity3d培训、学习第一品牌。
昨天把GUI做了点出来,攻击之类差不多算是正常了。不过,现在无论是人物还是敌人,在生命为零的时候都不会再有其后的结果了。生命为零,理应死掉了才对。那么今天就先完成这一点吧,文章出处【狗刨学习网】。
打开编辑器,在_Script文件夹下双击打开PlayerControl脚本,首先来完善玩家角色的死亡。
在“判断”标签中,定义一个用于判断玩家是否死掉了的bool变量: private bool m_isDead=false;//是否死亡
然后在先前定义的GetStat函数最后加上一句判断玩家是否死掉了的语句:
if(m_currentLife==0)
{
m_animation["Death"].wrapMode=WrapMode.ClampForever;
m_animation.CrossFade("Death");
m_isDead=true;
}
在这里判断当前生命是否为零,如果为零,首先将死亡的动画状态设定为只播放一次,然后播放死亡的动画。并同时把m_isDead设定为True。最后还要在Update函数中加上这样一句:
if(!m_isDead)
{
Attack();
Move ();
}
这时用于判断人物死亡后,就不给玩家控制人物了。
现在回到编辑器中运行游戏,当玩家生命为零,就死掉了,再也无法做什么了…..
======================================================
玩家的死亡解决了,接下来是敌人的。
打开Enemy脚本,在Update函数中,加上一句判断敌人是否死亡的语句:
if(!m_changeState.m_isDead)
{
}
案后将Update函数中的所有函数啊、语句什么的全都移动到这个判断语句中,然后再后边的GetState函数中进行死亡动画的播放:
void GetState()
{
m_currentLife=m_changeState.m_life;
if(m_currentLife==0)
{
m_animation[m_animationDeath].wrapMode=WrapMode.ClampForever;
m_animation.CrossFade(m_animationDeath);
Destroy(m_transform.rigidbody);
m_transform.collider.isTrigger=true;
}
}
这里就是判断敌人生命是否为零。为零就播放一次死亡动画,并将碰撞器的isTrigger设置为True(这时为了以后计算敌人死亡后会留下什么宝物准备的),并将rigidbody毁掉,免得敌人“哗”地一下,就掉得不见了。
运行游戏,查看一下效果。不出所料的话,应该是没问题了。
不过,这里有那么点问题。前面我将在Update函数中调用的GetState函数放在了判断敌人是否在Idle状态的else语句里面了,也就是说,这样一来,如果敌人处于idle状态,就不会发生生命值同步了,那么敌人就不会减生命了…这里只需要把GetState函数移动到if(!m_isDead){}前面就行了。
如图:
接下来。我觉得应该先把下边那个提示栏弄出点东西来,不然老那么光秃秃的也不好看。现目前能有什么提示信息呢?大概是生命减少之类的了吧。这个我就使用富文本了,节约、美观。
界面的布局的最后效果就是这样的了:
首先,点击提示栏,新建一个富文本框,就像如图中那般大小即可,将Anchor全都勾选,然后随便打几个字以作实验。
同时在它的旁边再新建一个ScrollBar在Anchor中勾选Right、Top和Bottom,在这个ScrollBar中再新建两个 Sliced,分别命名为Thumb和Track,都是将Anchor中的勾选完了的。选择好两个Sliced的背景,将Track缩放至 ScrollBar一样大小,而Thumb的宽跟Track一样,高则取一个合适的值即可。最后将这两个Sliced分别拖放给ScrollBar的 Thumb和Track(要选择ScrollBar的形式为Verticle),再勾选富文本框里面的Allow Scroll,将前面做好的ScrollBar拖给他,就完成了。这里为了美观起见,我还新建了一个Sliced作为富文本框的背景,就是这样!
运行游戏,东西差不多都没问题,只是符文本框在拖动的时候,太过于缓慢了,想要快一点的话,就还要改一改ScrollBar中的Increment,改成20就比较快了:
如果光有这些的话,当然不行。他还必须得实时显示游戏中的数据才可以。所以下面,继续写脚本了! 又是折腾好久,以下内容,依然是实验过后的最终结果,其他就不详叙了。
功能以经达到,现在慢慢道来:接上面的内容,实现提示栏的内容显示额方法,原本我是想新建一个脚本,理应数据绑定来实现的,最后失败了,改成了直接修改原来的BattleChange脚本来实现。
首先吧,新建一个标签,我明名为“TipsBar”,然后将这个标签指定给了提示栏的那个富文本框。接下来打开BattleChange脚本,在最前面定义一个富文本的脚本对象:
private dfRichTextLabel m_dfTxet;//定义提示栏的脚本对象
在这里原本因为Start函数没有用到,我是把它删掉了的,所以现在还得定义回来,然后在Start函数中获取对象:
void Start()
{
m_dfTxet=GameObject.FindGameObjectWithTag("TipsBar").GetComponent<dfRichTextLabel>();//获取提示栏的脚本对象
}
最后,就可以在脚本里对提示框的富文本内容进行修改了:
public void Damage(int m_attack)
{
if(m_life>0)
{
m_realAttack=(int)Random.Range(m_attack-m_attack*0.25f,m_attack+m_attack*0.25f);//随机伤害值,范围在正负25%以内
//Debug.Log ("伤害:"+m_realAttack);
if(m_realAttack-m_defense>0)
{
m_life-=(m_realAttack-m_defense);
m_dfTxet.Text+=("<p color=red>"+m_name+"被狂殴了一顿,生命减少"+(m_realAttack-m_defense)+"点</p>");
if(Random.value>0.9f)
{
m_dfTxet.Text+=("<p color=white>看看上面那鲜红的字迹,就知道你造就了多少杀戮了!</p>");
}
}else
{
m_life-=1;
m_dfTxet.Text+=("<p color=red>"+m_name+"皮糙肉厚,生命只减少了"+(m_realAttack-m_defense)+"点</p>");
if(Random.value>0.9f)
{
m_dfTxet.Text+=("<p color=white>看看上面那鲜红的字迹,小心被咔嚓掉哦!</p>");
}
}
if(m_life<=0)
{
m_life=0;
m_isDead=true;
m_dfTxet.Text+=("<p color=red>"+m_name+"惨遭杀戮,抽搐了几下,死掉了........</p>");
}
}
}
这里我除了定义显示的正常攻击内容外,还添加了些许奇怪的文字,也算是增加点趣味罢。
现在运行游戏,就会看见如下结果了:
改名字这点好像不如先前想的那么麻烦,只要在PlayerControl和Enemy脚本的Start函数中加上一句话就可以咯额:m_changeState.m_name=m_name;
现在就ok了