Unity3D游戏开发笔记4.doc_第1页
Unity3D游戏开发笔记4.doc_第2页
Unity3D游戏开发笔记4.doc_第3页
Unity3D游戏开发笔记4.doc_第4页
Unity3D游戏开发笔记4.doc_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

泰课在线2014.1.2610.【边界与优化昼夜系统.崩溃的Unity!】(1) 今天该做什么了呢?先把地图几个边界吧。虽然这不是必须的,不过为了玩家的生命财产安全,我觉得加上应该是必要的。新建一个立方体,把它放大到合适的位置,然后放在地图边界上,比例差不多了,就可以把它拖放到以前建立的_MyPrefab中。然后复制三个,分别放在)四个边界上,就可以了。如图:最后只要把方块的渲染选项的勾去掉,让它看不见即可。(2)然后吧,就把昼夜系统再完善下。在当初写昼夜系统的时候,如果到了晚上,是直接把平行光的角度往上转,虽然这样达到了将场景弄到夜晚的目的,但是因为这样的原因是由地形挡住造成的,所以地面会有一些高光,导致晚上的场景看起来不但假,也不好看,还极度浪费资源。这里就得改一下。方式也不难,就是在DayAndNightManager脚本中,在改动平行光角度的switch语句里,将“黎明”至”晚上“的判断语句的break前,加上这么一句:m_tramsform.light.type=LightType.Directional;而在”晚上”至 “黎明“之前,都加上一句改变灯光类型为点光源的:m_tramsform.light.type=LightType.Point;虽然在这儿其实在各个关键点换一下灯光就可以了,不过考虑到往后肯定会有直接改变时间的时候,未免出现bug,这里就麻烦点,不去省资源了(也省不了多少)。到了晚上,阴影一去,draw call这下子降了近一半。资源省惨了。(3)这儿,本来应该是写今天刚做的物品栏之类的,可惜,电脑在休眠中断了一次电,什么都没了.除了脚本,地图全变成了空的!我能说什么了?而且还什么预设都没存,这下.被坑得好惨啊!欲哭无泪啊555.。恐怕只有重做了.幸好代码还在!555.2014.1.2711.【新的开端与角色暴击.GUI浮动提示栏。】又再次搞了一天,弄出了这么个模样:不多说了,说多了就是泪.在这儿写是因为想提点一下:绝对不能把整个daikonGUI的UI做成预制体,否则Unity直接崩溃没话说.刚又折腾了个小时才找出这么个原因!以前丢失的都是些地图,幸好与大局无碍。而且刚才测试的时候又发现了一个Bug,就是如果敌人直接被Destroy掉的话,刷新点就会因为判断没有重置而一直不再刷新(就像是上面那个平台,敌人掉下去就被Destroy了,刷新点却一直不刷敌人了。)修复的方法很简单,就是在EnemySpawn脚本中,if(m_madeEnemyState!=null)m_madeEnemyIsDead=m_madeEnemyState.m_isDead;后面加上一句重置敌人没有刷出的判断:if(m_madeEnemyState!=null)m_madeEnemyIsDead=m_madeEnemyState.m_isDead;else m_madeEnemyIsDead=true;这下就可以了!现在的话,还是先给玩家角色增加一个属性:“暴击率”吧。不然,光是敌人有暴击攻击,就不大公平了。打开PlayerControl脚本,在最开始的属性标签中新定义一个属性:public float m_bigAttack=0.02f;/暴击几率同时,在对象标签中分别定义一个暴击的粒子效果和音效:/粒子效果public Transform m_attackParticle;/普通攻击粒子public Transform m_bigAttackParticle;/暴击粒子/声音public AudioClip m_attackAudio;/普通攻击音效public AudioClip m_bigAttackAudio;/暴击音效最后就是在下面的攻击过程中进行暴击的判断,将Attack函数中关于攻击的判定改成这样:if(Input.GetMouseButtonDown(0)if(m_attackDelaym_bigAttack)m_animation.Play(Attack3-1);m_forward=m_transform.TransformDirection(Vector3.forward);/Debug.DrawLine(m_transform.position+Vector3.up,new Vector3(10,0,0),Color.cyan);if(Physics.Raycast(m_transform.position+Vector3.up,m_forward,out hit,2,m_layerMask)m_nowAttackTarget=hit.collider.gameObject.GetComponent();StartCoroutine(WaitForAttack(Attack3-1,0.65f,m_attackParticle,m_attackAudio,m_attack);elsem_animation.Play(Attack4);m_forward=m_transform.TransformDirection(Vector3.forward);if(Physics.Raycast(m_transform.position+Vector3.up,m_forward,out hit,2,m_layerMask)m_nowAttackTarget=hit.collider.gameObject.GetComponent();StartCoroutine(WaitForAttack(Attack4,1.8f,m_bigAttackParticle,m_bigAttackAudio,m_attack*2);m_attackDelay=1;我默认的暴击攻击力是普通攻击力的2倍。然后将暴击音效和暴击粒子效果赋给角色,就可以了。就是这样。接下来,我将最下边的那条技能栏取消了,改成了显示几个属性:这个是比较简单的。首先在原来技能栏的地方建立一个Panel,用于装玩家的几个属性,里面先新建一个Label,用来显示攻击力,所以我将字体颜色改为了蓝色,并将其命名为attack。Anckor设置为Left和Vertical。然后添加一个数据Binding,数据源为玩家角色的PlayerControl中的m_attack,目标为自身的Text:依样复制四个,放在合适的位置,数据绑定只需要改为相应的值即可。分别是:防御、速度和暴击。这些做完了,然后呢,就给它们加上一些ToolTips吧。效果就是当鼠标放在上面的时候,可以浮现一小行说明性的文字。这就是传说中的ToolTps!看起来可是挺牛的!研究研究了半天,我发现这里DaikonGUI官方的例子已经自带了,而且貌似还可以直接用。打开DaikonGUI的ToolTip例子,将GUI中的那个ToolTip直接拖到先前创建的_MyPrefab文件夹中,做成一个预制体,然后回到先前自己的地图,将这个“ToolTip”拖拉到DaikonGUI的UI root下,如图:然后再在先前创建的几个属性Label中,找到appearance下的ToolTip将各自需要显示的内容直接写上去,如图:现在运行游戏的话,将鼠标放在下面的属性栏中,一会儿就会浮现出属性的说明。如果嫌他慢的话,还可以更改下时间以及动画速度。效果如图:现在,尽情地写上提示吧!认为不错的地方,都可以加上了。今天就到此为止吧。2014.1.2812.【GUI之.物品窗口】现在的话,终于该继续前天被残忍打断的物品栏之类的GUI界面了!首先还是把“属性”、“物品”、“技能”、“系统设置”几个按钮放上去罢。我是这样设计的:美工方面确实不是俺的长处,资源也都是用的DaikonGUI自带的。新建一个Panel,用于盛放这几个按钮,Anchor设置为Right和Bottom即可。然后再将这个Panel命名为“MyBottomBar”,在这个Panel中新建四个按钮,放上相应的图标即可。如果为了好看点,还可以设置Havor状态的显示,我就设置了一下Havor状态的颜色。它们的Anchor都设置为Right和Verticle。名字根据相应的作用,分别命名位为:Bag、AttibuteWindow、Skill和System。在这里,还可以在相应的ToolTip中输入相应的提示语句:然后吧,就先来做物品栏吧。再屏幕中选择一个合适的空白处,点击新建一个Panel,背景设为Fantasy Atlas中最像窗口的图片,然后再在这个Panel中添加一个Drag Handle,在Drag Handle中新建一个Label,内容就是“物品”。因为这是个窗口,所以也可以再为其添加一个Resize Handle,使其可以拖动改变大小。如图:然后再为其中间添加一个ScrollPanel,作为显示物品的主窗体,最下面添加一个Buttom,选择合适的图片,并写上“关闭”两个大字:接下来,在中间的物品窗口右边,添加一个ScrollBar,Anchor为Left和Verticle即可。在这个ScrollBar之中,分别建立两个Sliced图片,并命名为Track和Thumb,最后将这两个图片拖到ScrollBar上,即可完成ScrollBar的建立。最后再把这个ScrollBar拖给中间的ScrollPanel的Verticle滚动条,即可。其中我还设置了一些窗口的Layout:窗口大体创建出来了,下一步,就是为打开和关闭这个窗口添加功能以及一些动画了。动画事件之类的都是添加在主窗口之上。首先为其添加一个Tween中的Vector2,这个用于改变其大小,只需要在EndValue点击“Assign current value”即可。然后是改变位置的动画。添加一个Tween中的Vector3,选择“RelativePosition”,先点击一下EndValue中的“Assign current value”,然后把窗口移动到右上角,再点击StartValue中的 “Assign .”,这样就记录这个动画了。如图:最后的话,因为包裹按钮只有一个,为了方便,在这里还可以添加一个“Tween Group”。为Group添加两个Item。将先前添加的两个Tween动画都拖进这个组,如图:然后,就是包裹按钮方面的了。点击先前做好的包裹按钮,添加一个EventBinding(事件绑定),数据源为自身被点击,而目标事件就是先前的TweenGroup脚本中的Play:这下子运行游戏的话,点击包裹图标,就会看见物品窗口从屏幕外飞进来。然后是飞出的动画,这个弄一个位置变化的动画就行了吧。再次为主窗口添加一个Tween动画中的Vector3动画,命名为FlyOut,然后在StartValue记录屏幕中的当前位置,然后把窗口远远拖动到左边看不见的位置,记录EndValue。然后为窗口中的关闭按钮添加一个EventBinding,事件为点击按钮,目标则是窗口播放TweenVector3中的FlyOut的动画。运行游戏,点击包裹,窗口将会从右上方飞进来,点击关闭按钮,窗口则会从左边飞出去。这个窗口的界面因素就差不多了。然后,下面就又到了脚本时间了!包裹GUI终于把数据同步的问题解决了!不过现在不是一丁半点地晚了,具体情况还是明天记载罢。唉。2014.1.2913.【GUI.完成物品窗口】希望我没把昨天的具体步骤记错.!0-0!那么就开始吧。从哪儿开始写起呢?先从Item这个脚本开始吧。Item脚本建立在_Script/GUI文件夹中,打开脚本,最开始定义了几个变量:#region 定义的对象public GameObject m_itemButton; /物品的GUI按钮private BattleChange m_playerState; /玩家的BattleChange脚本private dfScrollPanel m_itemPanel; /物品窗口private dfButton m_button; /物品按钮的脚本#endregion#region 治疗类物品#region 小血瓶public string m_littleLifePotion=小血瓶;public int m_littleLifePotionNumber=0;/数量public int m_littleLifePotionPrice=10;/价格private bool m_littleLifePotionAdd=false;/是否已经在面板中创建了物品public string m_littleMagicPotion=小蓝瓶;public int m_littleMagicPotionPrice=13;/价格public int m_littleMagicPotionNumber=0;/数量#endregion#endregion因为没有打算再把道具之类的弄个图片显示,所以就没再定义Texture了。毕竟再定义一张图片不但麻烦,而且也不一定有人“赏识”的,所以这儿我就用纯文字了。以上定义了两个物品,分别是小血瓶和小蓝瓶,现阶段也只有这两个物品了。都有具体的注释,这里就不多解释了。然后是Start函数中,我分别获取了玩家状态和物品窗口的具体对象(在这之前要新建一个名为“ItemPanel”的tag,然后将其指定给物品窗口):m_itemPanel=GameObject.FindGameObjectWithTag(ItemPanel).GetComponent();m_playerState=GameObject.FindGameObjectWithTag(Player).GetComponent();然后接下来是一个自定义函数AddButton,这个函数将负责物品按钮在物品窗口中的创建,以及判断是否应该显示物品按钮(如果物品数量小于零,也就是没有时,就不需要显示在窗口中了。):void AddButton(string name,int count,string describe,ref bool ifAdd)if(!ifAdd)/如果物品没有被添加到按钮m_button=m_itemPanel.AddPrefab(m_itemButton).GetComponent();/添加并取得按钮对象m_button.Text=name;m_button.Tooltip=describe+(+count+个);ifAdd=true;else if(count0)m_button.Tooltip=describe+(+count+个);m_button.IsVisible=true;elsem_button.IsVisible=false;为了减少以后的劳动力,使代码的复用性最高是必要滴。代码主要作用就是接受物品的名字、数量、描述信息以及是否在物品栏添加了按钮的几个参数,如果没有在物品窗口添加按钮,则添加物品按钮,并设置好物品按钮的名字、描述信息。如果物品按钮已经被添加在了物品窗口,那么就判断物品数量是否大于零,大于则显示出来,否则就隐藏掉按钮。(按钮预制体会在以后创建,其实我是先创建的预制体.)。接下来还是一个自定义函数UseItem,这个函数是给玩家按下按钮后,进行使用物品而建立的,由于现在只有两个物品,代码不多:public void UseItem(string name)switch(name)case 小血瓶:if(m_littleLifePotionNumber0)m_playerState.RecoverLife(100);m_littleLifePotionNumber-;break;case 小蓝瓶:if(m_littleMagicPotionNumber0)m_playerState.RecoverMagic(50);m_littleMagicPotionNumber-;break;这个函数其中调用了两个玩家BattleChange脚本中的两个函数,所以现在还必须为BattleChange添加这两个函数。打开BattleChange脚本,因为恢复函数中还用到了最大魔法值,所以先在最开始添加一个变量:public int m_maxMagic;/最大法力然后在PlayerControl脚本的Start函数中将m_maxMagic赋值过来,就可以在最后边添加两个恢复函数了(这里用恢复函数若不是直接去增加生命值,是考虑到恢复的提示,以及判定等原因的):public void RecoverLife(int life)m_life+=life;if(m_lifem_maxLife)m_life=(int)m_maxLife;m_dfTxet.Text+=(恭喜+m_name+生命恢复了+life+点!);public void RecoverMagic(int magic)m_magic+=magic;if(m_magicm_maxMagic)m_magic=m_maxMagic;m_dfTxet.Text+=(恭喜+m_name+法力恢复了+magic+点!);函数首先添加指定的生命或法力值,然后判断了添加后的生命或法力是否超出了最大值,如果超过了最大值,则将将其重置为最大值。并给出恢复的提示。然后吧,事情要一步步来,那么现在先把预制弄体好。在物品窗口中点击新建一个Button,命名为ItemButton,将Button的Anchor全都去掉,(不去掉的话,可能会产生一些奇奇怪怪的格式.),其它的话,再在文字设置那儿将Word Wrap勾选了即可。而上一层的物品窗口,也要设置勾选了AutoLayout等才行。如图:将做好的按钮拖到_MyPrefab文件夹中,做成一个预制体,然后再_Script/GUI问价夹中继续新建一个脚本,这个脚本用于处理点击了物品按钮之后对物品的使用函数的调用。命名为ItemButton。代码如下:using UnityEngine;using System.Collections;public class ItemButton : MonoBehaviour private Item m_item;private dfButton m_button;private string m_itemName;void Start () m_item=GameObject.FindGameObjectWithTag(ItemPanel).GetComponent();m_button=GetComponent();m_itemName=m_button.Text;public void Use()m_item.UseItem(m_itemName);这个脚本首先获得该按钮的名字,以便调用Item脚本中的UseItem函数,在Start函数中获取了组件后,然后自定义一个函数Use,Use函数就只有一行代码,就是使用按钮的名字去调用Item脚本中的UseItem函数。现在,将Item函数拖动到ItemPanel,也就是物品窗口上,ItemButton脚本拖放到ItemButton按钮上(物品按钮),然后点击ItemButton,添加一个EventBinding,数据事件为按钮Click,目标的是ItemButton脚本中的Use函数。然后点击物品按钮上的Apply,将改动同步到预制体上。这时就可以把ItemButton的预制体拖给ItemPanel上的Item脚本了。运行有游戏,差不多就是那么回事儿了。实测。问题还是有的.这样做的话,除非只有一个物品,否则会出现按钮数据显示根本不准确的问题,甚至点击按钮作用都反了!简直不敢相信这样东西多了该怎么办?所以,又改吧。初步分析,出现上述情况原因是当Item脚本中的AddButton函数在Update中调用时,第一次调用肯定是对的,但架不住Update不停的调用啊!.好吧,我说重点。因为每帧都在对AddButton函数进行调用,但先前使用的每一个物品按钮的对象都来自一个对象:那就是定义在最开始的private dfButton m_button;/物品按钮的脚本,我原本准备让这个按钮对象充当所有物品的按钮对象的.临时变量,.直接结果就是,他果然变成了临时变量,以至于当第一个物品赋值完毕后,它所应当存储的变量就没了,那么首先第一次建立的按钮还能对其进行正确的赋值吗?答案当然是否定的,所以就出错了.改造方法就是每个按钮都使用单独的对象来存放.果然还是不能偷懒是吧.?首先将最开始那个m_button对象注释掉,然后再在小血瓶和小蓝瓶中,分别定义两个Button对象,这儿我想到使用一个判定按钮对像是否为空的方法来判断按钮是否被创建了,所以在这儿的判断按钮是否被创建出来的bool变量也可注释掉了:#region 治疗类物品#region 小血瓶public string m_littleLifePotion=小血瓶;public int m_littleLifePotionNumber=0;/数量public int m_littleLifePotionPrice=10;/价格private dfButton m_littleLifePotionButton;/物品按钮public string m_littleMagicPotion=小蓝瓶;public int m_littleMagicPotionPrice=15;/价格public int m_littleMagicPotionNumber=0;/数量private dfButton m_littleMagicPotionButton;#endregion#endregion然后将AddButton函数的参数改为这样:void AddButton(string name,int count,string describe,ref dfButton m_button)最后,在Update函数对其的调用也要改一改:AddButton(m_littleLifePotion,m_littleLifePotionNumber,立即恢复100点生命。,ref m_littleLifePotionButton);AddButton(m_littleMagicPotion,m_littleMagicPotionNumber,立即恢复50点魔法。,ref m_littleMagicPotionButton);这下子没问题了吧?运行游戏,使用物品总算正常了!2014.1.3014.【完成的技能功能,GUI技能窗口】现在既然补充魔法值的物品都有了,如果没有个消耗魔法的技能的话,也不妥吧。那么今天就先来创建一个技能窗口,把技能好歹做出来一个吧。点击新建一个ScrollPanel,命名为SkillWindow,然后为这个Panel设置一个合适的背景,点击新建一个DragHandle,Anchor设置为Left、Right、Top,在DragHandle中再建立一个Label,Anchor为Horizntal与Verticle,内容就是“技能”两个字了。为了技能窗口可以拖动,还可以为其添加一个ResizeHandle。另外除了外边的大窗口以外,像物品窗口一样,也是需要一个专门的技能Panel来真正装技能的。所以还需要建立一个ScrollPanel放在中间,同时在旁边新建一个ScrollBar,在ScrollBar中新建两个Sliced图片作为ScrollBar的Track和Thumb。最后将这个ScrollBar拖动到,里边的SkillPanel的VerticleScroll上(注意前边设置时也都得选择verticleScrll类型):最后的话,当然不能忘了在最底下加上一个“关闭”按钮。基本布局就与下图差不多了:然后,先把窗口的出现与关闭的动画搞定吧。首先为窗口添加一个Tween Vector3绑定,选择RelativePosition,在当前位置记录EndValue,然后将其移动到GUI的下方相机看不见的地方,记录下SartValue。如图:然后还要添加一个Tween中的Vector2,这个只需要在EndValue记录一下就可以了。最后再添加一个Tween Group,把上面两个脚本都加进去:这时候就可以点击屏幕上的像一本书的技能Button,为其添加一个EventBinding,数据源为按钮Click,目标就是技能窗口中的那个Group的Play了。运行的话,点击技能图标,技能窗口就会飞进来了。接下来是“关闭”。点击窗口,再次为其添加一个Tween Vector3动画,StartValue就是窗口在屏幕中的位置,EndValue就把窗口拖动到上方相机看不见的地方,记录下来。为关闭按钮绑定一个EventBinding,源为按钮被Click,Target就是窗口的Vector3飞出动画。好了,现在这个窗口的界面放main算是差不多了,然后是脚本。而且目前还一个技能都没有,所以还得先创造一个技能才行。折腾了一下午,实验了无数次,似乎终于把技能搞定了?或许吧,希望我对好不容易折腾出来的步骤没记错。首先在PlayerControl脚本中添加变量(其实我是想定义在BattleChange中的,好让敌人之类的也可以直接能够调用这些技能,不过后来发现不是一丁半点的麻烦,现在似乎时间也并不如想像中的那般充足,所以还是决定采取简单一点的方法,以后的.就以后再说吧。):#region 对技能的定义/火球术public bool m_skillFireBall=true;/是否学会了该技能public int m_skillFireBallRank=1;/技能等级public float m_skillFireBallSkilled=0;/技能熟练度public Transform m_skillFireBallParticle;/技能粒子效果public Transform m_skillFireBallParticle2;/火球术爆炸效果public AudioClip m_skillFireBallAudio;/技能声音效果#endregion这是一组新的标签,往后的技能各种属性也将会定义在此。注释详尽,不多解释。因为还用到了对提示栏的修改,所以最前面还有一个提示栏的对象:private dfRichTextLabel m_dfTxet;/定义提示栏的脚本对象然后就是依然是照老样子,在最后添加一个函数,这个函数:#region 技能public void SkillFireBall()if(!m_animation.IsPlaying (Run)/跑动的时候不允许施法int tempMagic=m_currentMagic-10*m_skillFireBallRank;/计算消耗的法力if(tempMagic=0)/如果法力足够,就可以发动魔法m_currentMagic=tempMagic;m_animation.Play(Fire);/这里法术的动画就用这个动作了Instantiate(m_skillFireBallParticle,m_transform.position+new Vector3(0,1,1),Quaternion.identity);audio.clip=m_skillFireBallAudio;audio.PlayOneShot(m_skillFireBallAudio);m_skillFireBallSkilled+=(1f/m_skillFireBallRank);/增加技能熟练度if(m_skillFireBallSkilled=100)/如果技能熟练度达到100,则升级技能等级m_skillFireBallRank+;m_skillFireBallSkilled=0;m_forward=m_transform.TransformDirection(Vector3.forward);if(Physics.Raycast(m_transform.position+Vector3.up,m_forward,out hit,10,m_layerMask)/计算前方是否打中了别人,火球术最多可以打中十米远的敌人m_nowAttackTarget=hit.collider.gameObject.GetComponent();StartCoroutine(WaitForAttack(Fire,0.5f,m_skillFireBallParticle2,m_attackAudio,(int)(m_skillFireBallRank*m_attack*1f);/一级火球术只有人物一半的攻击,攻击随技能等级递增elsem_dfTxet.Text+=(你感觉身体一阵空虚,法力不足了.);#endregion这个函数看名字就知道,是专门为火球术这个第一个技能专门写的,具体作用的话,就是在玩家没有乱跑的时候允许发动技能,如果法力不足,也无法发动技能,在发动技能后,计算技能熟练度,等级等等。取消了技能冷却时间。然后将火球术的相应粒子效果,声音等拖动到玩家角色身上(最好点击Apply将其与预制体同步一下,不然出问题就完蛋了.)然后是技能按钮。技能按钮我没准备放在技能窗口中,我的想法是做出浮动的技能按钮效果。就是点击鼠标右键按钮慢慢浮现在鼠标点击的地方,再次点击鼠标右键又慢慢地隐去。为了这玩意儿费了好大的劲.毕竟连DaikonGUI官方的API文档都没有,做什么完全只有靠自己那点经验慢慢折腾了。首先,在GUI中创建一个新的Panel,这个Panel没有背景,只是作为一个盛放使用技能按钮的一个容器而已,将其命名为“SkillBar”(技能条)。然后再在这个Panel中新建一个按钮。技能我预计不会有很多,因为做起来挺麻烦的,所以就直接将这个Button命名为FireBall,设置一下按钮背景,将按钮上的文字改为“火球术”。愿意的话,还可以加上一个ToolTip。仅仅是这样当然不够,所以然后还得为其添加一个EventBinding(事件绑定)。其源设定为自身Click,目标为PlayerControl中的SkillFireBall函数。为了给这个按钮,或者说是“这些”技能按钮添加上面提到的效果,还必须为其绑定两个Tween float动画,分别作出淡出效果(只需要记录StartValue的值)、淡入效果(只需要记录EndValue的值)。然后还要建立一个脚本。在_Script/GUI文件夹中新建一个脚本,名为“ShowSkillBar”,内容如下:using UnityEngine;using System.Collections;public class ShowSkillBar : MonoBehaviour private Transform m_transform;private dfPanel m_panel;public dfTweenFloat m_fadeIn;public dfTweenFloat m_fadeOut;private Camera m_guiCamera;void Start()m_transform=this.transform;m_panel=GetComponent();m_guiCamera=GameObject.FindGameObjectWithTag(GUICamera).GetComponent();void Update()FadeInOrOut();void FadeInOrOut()if(Input.GetKeyDown(KeyCode.Mouse1)m_transform.position=m_guiCamera.ScreenToWorldPoint(Input.mousePosition);if(m_panel.Opacity=1)m_fadeOut.Play();else if(m_panel.Opacity1)m_fadeIn.Play();这个脚本首先定义了SkillBar的这个Panel,自身对象,以及淡入淡出效果的Tween动画对象、DaikonGUI的摄像机(所以还得新建一个名为“m_guiCamera”的Tag,并将其指定给GUI相机)。然后在Update函数中调用处理这些动作的FadeInOrOut函数。在FadeInOrOut函数中,对玩家是否按下了鼠标右键做了一个判断,如果玩家按下了鼠标右键,则把SkillBar的位置移动到鼠标点击的位置,并判断SkillBar是否可见。如果当前可见,那么点击鼠标右键就会将之隐藏,如果不可见,就将其淡入。以上.差不多了吧。运行游戏,点击鼠标右键,效果就出现了。而点击“火球术”的按钮,则会发出火球术的技能,如果法力不足,就还会在提示栏进行提示。一切似乎正常了,不过这时候这儿又发现一个Bug。就是点击“小蓝瓶”后,提示栏有正确的提示信息,但玩家的魔法却并没有恢复。起原因是以前定义时,在GetState函数中没有对魔法值进行同步。不过这儿练技能都没有放在BattleChange脚本中了,去同步魔法值的话,反而麻烦。所以这儿干脆直接删除之。在BattleChange脚本中,首先将最前面定义的魔法值注释掉,定义一个PlayerControl的脚本对象,然后在Start函数中获取PlayerControl对象:if(transform.tag=Player)m_player=GetComponent();这里判断了一下当前脚本是否是附着在Palyer的身上,以节约资源。家下来修改恢复法力的脚本:public void RecoverMagic(int magic)m_player.m_currentMagic+=magic;if(m_player.m_currentMagicm_player.m_maxMagic)m_player.m_currentMagic=m_player.m_maxMagic;m_dfTxet.Text+=(恭喜+m_name+法力恢复了+magic+点!);而PlayerControl脚本Start函数中的几个给BattleChange中的魔法值进行赋值的语句也可注释掉了。然后,就没了。写得好累啊.许多东西都不能想做哪儿就做哪儿,还得在做的同时思考该怎么写出来.恐怕是多花了一半的时间哦.嘛.接下来还有个SkillWindow啊.点击SkillWindow,在里面新建一个Panel,命名为“FireBall”,将Anchor全都勾选,然后再在这个Panel中添加六个Label,用于显示技能信息,还是看图吧:基本布局就是这样了。这是命名情况:除了RandNumber(具体等级)、RankSkillNumber(具体熟练度)以外,其它的都要都只是固定的字而已。然后再为RandNumber添加一个PropertyBinding,数据源为玩家PlayerControl中的m_skillFireBallRank,目标为自身的Text。RankSkillNumber添加一个PropertyBinding,同样数据源为玩家PlayerControl中的m_skillFireBallSkilled,目标为自身的Text。运行游戏,点击技能图标,将会看见最终效果:今晚就是传说中的大年三十了.2014.1.3115.【游戏保存功能与.系统设置窗口、属性窗口】昨天写的时候,好像忘了把火球术的粒子效果上的脚本记下来了.因为粒子效果包中的粒子自带的脚本会让角色发出的火球乱串,因此在这儿还得把那些自带的脚本去掉,自己来写一个,以判断火球术发出后的方向、速度等。这是火球术粒子所在文件夹:在_Script文件夹中新建一个名为Skill的文件夹,然后新建一个名为“rotation”的脚本。打开脚本,这个脚本中的代码并不多,主要功能只需要控制火球术的前进方向、速度等即可:using UnityEngine;using System.Collections;/Author:CWH/email:/date:2014.1.30public class rotation : MonoBehaviour private GameObject m_playerRotation;private Transform m_transform;void Start () m_transform=this.transform;m_playerRotation=GameObject.FindGameObjectWithTag(Player);m_transform.rotation=Quaternion.Euler(m_playerRotation.transform.eulerAngles);void Update()m_transform.Translate(Vector3.forward*5*Time.deltaTime);在脚本中,首先计算了角色的旋转方向,以使火球发出的方向与玩家的方向一致,不至于乱飞。而在Update函数中,则对火球的前进速度进行了控制。好了,现在技能、物品都差不多了。是该考虑存档的问题了!一个ARPG游戏,能够存档是一个最基本的要求罢。前些阵子看过一些数据库存储、xml保存游戏的方法,可惜大概是我理解力差了,对着那些脚本看了半天,越看越麻烦.后来就觉得自己这个本来就是个小游戏,干脆就用系统自带的PlayerPref算了.那么这个就要慢慢写了,免得到时候一下子写的话,数据量很多。先建立系统设置的窗口,建立方式与技能窗口、物品窗口基本上是一模一样的,这里就不多赘述。在这儿系统窗口只需要放一个按钮即可,便是“保存游戏”。GUI窗口放好了,那么便要开始考虑,作为一个ARPG游戏,哪些数据是需要保存的?玩家属性肯定是必然的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论