Unity3D 游戏开发之提示栏的工作实现详解

来源:互联网 发布:nicelabel 数据库密码 编辑:程序博客网 时间:2024/06/08 06:47

欢迎来到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全都勾选,然后随便打几个字以作实验。 

 

同时在它的旁边再新建一个ScrollBarAnchor中勾选RightTopBottom,在这个ScrollBar中再新建两个 Sliced,分别命名为ThumbTrack,都是将Anchor中的勾选完了的。选择好两个Sliced的背景,将Track缩放至 ScrollBar一样大小,而Thumb的宽跟Track一样,高则取一个合适的值即可。最后将这两个Sliced分别拖放给ScrollBar的 ThumbTrack(要选择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>");
}
}

 

这里我除了定义显示的正常攻击内容外,还添加了些许奇怪的文字,也算是增加点趣味罢。 

现在运行游戏,就会看见如下结果了: 

 

改名字这点好像不如先前想的那么麻烦,只要在PlayerControlEnemy脚本的Start函数中加上一句话就可以咯额:m_changeState.m_name=m_name; 

现在就ok了 

 

0 0
原创粉丝点击