




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
泰课在线2014.2.318.【新的属性】上次提到的属性栏,今天还是再完善一下,加上了几个属性:并且在PlayerControl中也都定义好了各自的变量,使用PropertyBinding将其与各自的Label绑定起来:public string m_sex=?;/性别public string m_profession=?;/职业public int m_kindOrEvil=0;/善恶值public int m_age=13;/年龄public float m_bodyTall=0;/身高public float m_bodyWight=33;/体重public string m_belief=你现在是无神论者。;/信仰除此之外,这些新加的属性以及昨天做出来的时间等也都是需要存档的,所以还必须在SaveGame脚本中对其进行添加保存的东西。打开SaveGame脚本,然后再Save函数中的玩家脚本标签中添加如下代码作为保存:PlayerPrefs.SetString(p_sex,m_player.m_sex);PlayerPrefs.SetString(p_profession,m_player.m_profession);PlayerPrefs.SetInt(p_kindOrEvil,m_player.m_kindOrEvil);PlayerPrefs.SetInt(p_age,m_player.m_age);PlayerPrefs.SetFloat(p_bodyTall,m_player.m_bodyTall);PlayerPrefs.SetFloat(p_bodyWeight,m_player.m_bodyWight);PlayerPrefs.SetString(p_belief,m_player.m_belief);然后再在Load函数中进行读取:m_player.m_sex=PlayerPrefs.GetString(p_sex);m_player.m_profession=PlayerPrefs.GetString(p_profession);m_player.m_kindOrEvil=PlayerPrefs.GetInt(p_kindOrEvil);m_player.m_age=PlayerPrefs.GetInt(p_age);m_player.m_bodyTall=PlayerPrefs.GetFloat(p_bodyTall);m_player.m_bodyWight=PlayerPrefs.GetFloat(p_bodyWeight);m_player.m_belief=PlayerPrefs.GetString(p_belief);暂时就是这样了。接下来是时间的保存。这个功能还是放在DayAndNight自身的脚本中吧。在最后添加两个函数,分别为SaveTime和LoadTime,负责保存和读取时间:#region 保存与读取时间void SaveTime()PlayerPrefs.SetInt(p_hour,m_hour);PlayerPrefs.SetInt(p_day,m_day);PlayerPrefs.SetInt(p_month,m_month);PlayerPrefs.SetInt(p_year,m_year);void LoadTime()m_hour=PlayerPrefs.GetInt(p_hour);m_day=PlayerPrefs.GetInt(p_day);m_month=PlayerPrefs.GetInt(p_month);m_year=PlayerPrefs.GetInt(p_year);m_minute=60;#endregion再读取时间的时候,会将分钟数直接置为60,这样一读取游戏,马上进行每个小时应有的场景更新,这里是为了避免出现阴影之类的东西与保存再读取游戏时的不协调。因为不清楚什么时间会退出游戏,所以这儿为了是天空盒不至于乱套,我还将switch语句每个时辰中的Case都加上了一句更换当前天空合材质的代码RenderSettings.skybox=(Material)Resources.Load(。);这句话以前只写在了几个关键点上,现在不得不改变下了,PC平台应该是不会在意这么点负荷的吧?本来想优化一下DayAndNight中的Switch语句的,因为觉得case里面的代码每帧都执行一次,似乎太过于浪费了?不过刚才测试了下,怎么switch中每个case只执行了一次?记得上次的游戏,写在switch中的代码都是每帧重复执行啊?不过这样的话也好,就没什么优化的必要了.现在再把鼠标样式换了下,这个换鼠标样式的方法使用的是原生GUI完成的因为使用DaiKonGUI完成性能貌似很低.新建一个脚本,名为“MouseCuerser”,然后输入以下代码:using UnityEngine;using System.Collections;public class MouseCurser : MonoBehaviour Camera m_guiCamera;public Texture m_mouseImage;void Start () Screen.showCursor=false;void OnGUI () Vector2 mouseCurser=Input.mousePosition;GUI.DrawTexture(new Rect(mouseCurser.x,Screen.height-mouseCurser.y,16,20),m_mouseImage);然后将其拖放到玩家身上,再把鼠标指针的图片设置好,就完了。这是一个篝火。篝火由木材和一个粒子构成。不过,篝火应该是只有在晚上才会燃烧起来对吧?所以,新建一个脚本,用于判断当前时间是白天还是黑夜,如果是白天,就把篝火这个游戏物体禁用了,否则就开启。在这之前,为了方便判断白天和黑夜,所以就还在DayAndNight脚本中添加一个变量“m_isNight”:public bool m_isNight=false;/是晚上吗?然后在Update函数中添加判断:if(m_hour5)m_isNight=false;else m_isNight=true;这里就没什么事儿了。新建一个脚本,名字就叫作“CampFire”,代码只有几行:private DayAndNightManager m_dayAndNight;private Transform m_Torch;void Start ()m_dayAndNight=GameObject.FindGameObjectWithTag(DayAndNight).GetComponent();m_Torch=transform.FindChild(Torch).transform;void Update () if(m_dayAndNight.m_isNight)m_Torch.gameObject.SetActive(true);else m_Torch.gameObject.SetActive(false);脚本主要作用就是从DayAndNight脚本中获取当前是晚上还是白天,以选择启用或禁用“火”的燃烧。这个脚本是直接拖放到Tourch的父物体木材身上:然后,再为角色增加一个属性:“饱食度”吧。打开PlayerControl的脚本,在最开始定义饱食度的变量:public int m_hungryAndFull=100;/饱食度public string m_hungryAndFullText=;/这个设定是:当其大于100时为满足,大于150时为满腹,大于200时为腹胀,大于300就.撑死吧./小于0时为饿了,小于-100时为饥饿,小于-200为饿惨了,小于-250为饿死中,小于-300就.饿死吧./在饱食度变化的同时也会使属性发生变化接下来,我在脚本最后添加了一个函数“HungryAndFull”,这个函数用于控制饱食度的改变所产生的各种变化:void HungryAndFull()if(m_hungryAndFull0)if(m_hungryAndFull100&m_hungryAndFull150&m_hungryAndFull200&m_hungryAndFull300)m_hungryAndFullText=腹胀;elsem_dfTxet.Text+=你被撑死了.;m_animationDeath.wrapMode=WrapMode.ClampForever;m_animation.CrossFade(Death);m_isDead=true;elseif(m_hungryAndFull-100)m_hungryAndFullText=饿了;else if(m_hungryAndFull-200)m_hungryAndFullText=饿惨了.;else if(m_hungryAndFull-300)m_hungryAndFullText=饿死中.;elsem_dfTxet.Text+=你被饿死了.;m_animationDeath.wrapMode=WrapMode.ClampForever;m_animation.CrossFade(Death);m_isDead=true;以上是几个饱食度时段的显示变化,后面还得加上饱食度对属性的影响。而改变饱食度的方式就是在DayAndNight脚本中的时间属性了。打开DayAndNight脚本,在最开始定义PlayerControl脚本的对象: private PlayerControl m_player;然后再Start函数中获取对象:m_player=GameObject.FindGameObjectWithTag(Player).GetComponent();获取到对象之后,就可以根据时间的流逝改变而对饱食度造成影响了。在Update函数中,每一个小时都对饱食度做出一定改变,改变程度是随机在310点话之间:if(m_minute=60)m_player.m_hungryAndFull-=(Random.Range(3,10);现在表面上的已经差不多了,那么先就把显示在屏幕上的形象做出来吧。这里我选择在底部添加一个Label,然后与PlayerControl的m_hungryAndFullText进行绑定。最后在PlayerControl的Update函数中对新添加的那个饱食度进行控制的函数进行调用,现在就差不多了。2014.2.419.【一切皆是敌人NPC脚本的开始与.相机脚本改造】一切皆是敌人。这句话曾经在哪儿听说过呢?不过,在这儿确实是实在的。因为游戏中的所有生物,都将从一个脚本Enemy派生而来!所有的生物,都将可以成为玩家的敌人。现在先来添加一个小功能:使用鼠标的滚轮改变视角的距离。打开MyCamera脚本,在最开始新增一个变量:private float m_tempDistance=0;然后再最后边新建一个函数MouseChangeView,然后为其新加几行代码:void MouseChangeView()if(m_tempDistance=Input.GetAxis(Mouse ScrollWheel)!=0)m_distanceAway-=(m_tempDistance*5);m_distanceUp-=(m_tempDistance*2);最后再在Update函数中调用一下。接下来,就又是一个比较重要的脚本了。也就是NPC的主脚本。之所以叫主脚本,是因为它会像Enemy脚本一般,所有的NPC都会从此继承出来。不过,思索良久,因为考虑到所有的NPC也都会进行攻击行为,也可以被攻击,所以我决定将NPC的主脚本也从Enemy脚本中继承下来!在这之前,为了方便继承时对脚本的修改,所以还得先来改一改Enemy脚本,将一些混在一块儿的代码拆开,然后分装成一个个函数。首先将Enemy中的Update函数中用于判断敌人使用射线“看见”对象进行攻击的函数进行封装到IdleIfAttack(在最后面新建,复制原本在idle状态下射线碰撞到物体的判断代码)函数中。protected virtual void IdleIfAttack()if(m_attackTarget.tag=Enemy)if(Random.value0.999f)m_isIdle=false;elsem_isIdle=false;然后在原本的位置对这个函数进行调用即可。现在新建一个NPC脚本,在这个脚本中首先就对这个攻击判定代码进行一次修改吧。将自带的两个函数都删掉,然后添加上新的攻击判定函数:protected override void IdleIfAttack ()if(m_attackTarget.tag=Enemy)m_isIdle=false;为了配合这个函数的作用,还必须在场景中新建一个Tag,名为“NPC“,然后将Enemy脚本中Start函数里指定Tag的代码移动到InIt()函数之前:void Start () m_transform=this.transform;/获取自己对象m_transform.tag=Enemy;Init();接着继续在NPC脚本中添加一个函数代码:protected override void Init ()m_transform.tag=NPC;这样的话,从理论上来说,NPC已经可以分辨玩家和怪物了。那么接下里就实验一下。新建一个脚本,名字,就叫做“NPC_NoName“吧,它将继承自上面刚写的NPC脚本。using UnityEngine;using System.Collections;public class NPC_NoName : NPC protected override void Init()base.Init();SetAttribute(无名,3,100,20,25,1,80,8);/print(ok);看罢,这个脚本够简单吧?就将这个脚本拖给NPC,同时改一下NPC的动画名字(挑三个Idle动画,两个攻击动画,一个行走动画,一个死亡动画,改成Enemy脚本中默认的名字。这儿是为了方便才这样定义的,不然挨个赋值动画名称太过於麻烦了)。再为NPC添加一个碰撞体,随便拖一个AudioSource给他,另外脚本中定义的攻击粒子、声音之类的也随便拖几个上去(毕竟现在只是实验而已)。运行游戏,不出所料,NPC已经可以自由活动了:并且,无论玩家在其面前怎么晃,他都不会理人。不过一旦被玩家攻击了,那就是使劲反击咯.那么,吸引一只小狼在他面前呢?小狼跟NPC都是属于见着就直接开打的,还不死不休息呢.我对这破电脑以及这系统忍无可忍了.今天刚打开这个Word就觉得昨天的类容好像不完整,不过想不起来了,以为是错觉。刚才又除了次问题,在我眼皮底下尽然都消失了一截内容!明天换个系统试试罢.唉.补上刚才写的还算勉强记得着的类容,昨天的,就不清楚究竟有没有丢哪儿了?玩家攻击NPC,必须要考虑到“误伤”的情况。所以,这儿在Enemy脚本中的“变量”标签中再添加一个变量:protected string m_enemyTag=Enemy;这个变量是用与判断攻击攻击自己对象的。在后边又找到GetState函数,把里面的“Enemy”的Tag判断改为如下:if(m_changeState.m_changeMeTarget!=null)if(m_changeState.m_changeMeTarget.tag=m_enemyTag)m_attackMeCount+;if(m_attackMeCount=3)/敌人被同样是怪物的敌人攻击三次以上,就会也攻击攻击自己的敌人怪物了m_isIdle=false;if(m_transform.tag=NPC)m_speed=5;m_attackTarget=m_changeState.m_changeMeTarget;m_changeState.m_changeMeTarget=null;else/如果被非同类的攻击,就直接打起来了m_isIdle=false;m_attackTarget=m_changeState.m_changeMeTarget;上面还多了一句判断自身是否是NPC,如果是NPC的话,为了避免玩家恶意攻击后逃跑,所以在这儿将其速度置为5。一般情况下,是能追上玩家的了。而其后的m_changeState.m_changeMeTarget=null一句,是用于将每次主动攻击自己的对象置空,曾经的疏忽吧。以前忘了加上这句,所以觉得敌人相互之间的攻击概率都0.0001%了,怎么还那么大概率相互攻击?大概是这儿的毛病。改了就好。(这里也可以将敌人相互攻击的概率改大一点了)。在NPC脚本中的Init函数里,也需要对m_enemyTag重新进行赋值:protected override void Init ()m_transform.tag=NPC;m_enemyTag=Player;以上.好像差不多了,NPC对话之类的,下次解决吧。现在时间没那么整天的了.2014.2.620.对话窗口现在系统换了,不过Mono编辑器大概出了点问题,输入不了中文了。注释大概会少些,所以大多内容就在此解释罢。(一)首先,把上次的使用鼠标滚轮改变相机视角远近的代码再来小小地修改一下。上次的代码已经实现了相机的视角拉远拉近,不过却没有任何限制。所以一旦相机拉得过近的话,直接就跑到角色的脚底下去了,画面一下子就乱套了。所以这儿得改一改。打开MyCamera脚本,在下面的MouseChangeView函数的判断distanceAway和distanceUp的if语句后边都加上一个else if.判断:void MouseChangeView()if(m_tempDistance=Input.GetAxis(Mouse ScrollWheel)!=0)if(m_distanceAway4f)m_distanceAway-=(m_tempDistance*5);else if(m_tempDistance1f)m_distanceUp-=(m_tempDistance*2);else if(m_tempDistance0)m_distanceUp-=(m_tempDistance*2);这个判断是用于确定相机是否过近,如果太近的话,就不再允许玩家拉近视角,而只能拉远视角了。这样,好歹用起来不赖了!(二)接下来就是继续上次的NPC对话的问题了。原本的对话的功能我是准备放在NPC的脚步中进行的,使用碰撞检测的方式去探测是否进行对话。结果当然是.没搞定。无论怎么弄,碰撞的准确度都太低了,所以退而求次,选择了使用玩家“看见”NPC后进行触发是否对话的选项。这是首先在屏幕正中间建立的一个Label,用于提醒玩家可以按“E”键进行对话,考虑到不少人都不会去看以后的“帮助”,这儿还是明写出来为好。然后为其添加一个Tween 中德float改变动画,名字就叫作“FadeIn”罢。然后勾选自动播放动画,并将动画类型设置为PingPong。回到脚本,新的方式就直接在玩家PlayerControl脚本中进行添加代码即可。首先再次“对象”标签中添加一个dfLabel的对象:private dfLabel m_talkTips;/提示对话的那个Label脚本对象然后在“判断标签中添加一个bool变量,用于判断玩家是否在对话中(如果是在对话中的话,那么提示对话的Label就不用出现了):public bool m_isTalking=false;/是否在对话在Start函数获取这个Label脚本对象:m_talkTips=GameObject.FindGameObjectWithTag(TalkTips).GetComponent();由于这儿还用到了标签,因此为了脚本能顺利找到Label,还要建立一个名为“TalkTips”的标签,并将其指定给dfLabel对象。最后新建一个函数,名字就叫作“SeeOther”罢:#region SeeOthervoid SeeOther()if(!m_isTalking)m_forward=m_transform.TransformDirection(Vector3.forward);if(Physics.Raycast(m_transform.position+Vector3.up,m_forward,out hit,5,m_layerMask)if(hit.collider.gameObject.tag=NPC)m_talkTips.enabled=true;if(Input.GetKeyDown(KeyCode.E)m_talkTips.enabled=false;m_isTalking=true;else m_talkTips.enabled=false;#endregion这个函数的主要作用是判断玩家当前如果不在对话中的话,就向玩家前方发射一条射线,碰上了NPC对象的话,就激活显示提示对话的Labe。如果玩家按下了“E”键,就将Label隐去,或者玩家不再面对NPC,也将这个Label提示隐去。在Update函数中进行调用,运行游戏。刚开始默认是没有任何显示的,走到以前放在旁边的NPC前,屏幕上就出现了提示对话:并且这个提示还会不停地出现、消失,出现、消失.点击“E”键,这个提示就直接消失了。接下来是真正的对话窗口:基本布局就是这样了。详细情况这儿就不再赘述,毕竟前边都写了好大篇幅了。然后为这个窗口添加一个Tween float动画,就是FadeOut(隐去)。然后在“关闭”按钮上绑定一个EventBinding,当关闭按钮被点击之时,就播放窗口的FadeOUt动画。这时候窗口已经可以被关闭了。接下来还要解决才下玩家PlayerControl中的一个bool变量。刚才上面在里面定义了一个“m_isTalking”bool变量,用于判断玩家是否处于对话之中,这里关闭窗口,就要将这个变量置为false。所以这儿就又要写个小小的脚本了。在_Script/GUI文件夹中新建一个脚本,名字就叫“CloseTalkWindow”吧:public class CloseTalkWindow : MonoBehaviour private PlayerControl m_player;void Start () m_player=GameObject.FindGameObjectWithTag(Player).GetComponent();public void ClosedWindow()m_player.m_isTalking=false;这个脚本的作用就是在对话框的关闭按钮牛被点击时,将PlayerControl的m_isTalking置为fasle。回到编辑器,把这个脚本拖给关闭按钮,然后添加一个数据绑定。使按钮被点击使,就调用脚步的ClosedWindow函数。现在对话窗口关闭问题已经完成,接下来是解决对话窗口的显示问题。首先的话,还是新建一个Tag “TalkWindow”,然后指定给对话窗口。接下来,新建一个Talk脚本。这个脚本将用来装对话的。首先将里边自动生成的Start和Update函数先删掉了,毕竟目前来说,是使用不到这两个函数的了。在Talk脚本中,首先定义两个对象:protected dfPanel m_talkWindow; protected dfRichTextLabel m_talkContent;这时对话窗口的对象和用来显示对话内容的富文本脚本对象。然后是一个函数ShowDialog:public void ShowDialog()m_talkWindow=GameObject.FindGameObjectWithTag(TalkWindow).GetComponent();m_talkWindow.Opacity=1;m_talkContent=m_talkWindow.GetComponentInChildren();Talking(transform.gameO);这个函数的作用就是通过Tag获取对话窗口的对象,然后将其透明度设置为1,也就是把窗口显示出来。然后调用了一个Talking函数。这个Talking是马上要写的:void Talking(string name)switch(name)case NoName:m_talkContent.Text=无名: 我便是无名,无名,便是我!;break;default:m_talkContent.Text=啊?你.你是谁?你是谁啊?咦?我又是谁呢?是谁呢?.;break;它的作用不言而喻,就是使用的Switch语句来更改对话的内容。他的判断依据就是当前NPC的名字。从理论上来说,这个脚本在往后将拥有所有NPC的对话内容,这样每个NPC只需要附加这个脚本就可以了。然后是PlayerControl中。在原先的SeeOther函数中,当玩家按下”E”键后,便可以直接调用当前面对的NPC上的Talk脚本里的ShowDialog函数;if(Input.GetKeyDown(KeyCode.E)m_talkTips.enabled=false;hit.collider.gameObject.GetComponent().ShowDialog();m_isTalking=true;将这个Talk脚本拖给那个”无名”NPC。运行游戏,跑到NPC面前,按下“E”键:就是这样。然后呢,解决下玩家在对话时按按钮就开始攻击的问题吧。想想NPC给玩家一个选择,一点鼠标就把人打了,再点两下就不死不休了.这个可不大妥当。于是乎,改造一下,也便是理所当然的了。这个只需要在Update函数中改造下即可:if(!m_isTalking)if(!m_isDead)Attack();Move ();SeeOther();现在的话,一旦进入对话状态,玩家就不可进行移动之类的了。差不多了,下一步的话,就因该是“剧情”了罢。ARPG游戏,剧情是一大要素。什么剧情呢?2014.2.721.修复窗口问题在游戏中,如果关闭了窗口后(属性、物品等窗口),都会出现按下空格,也就是“跳“的功能后,重新在屏幕显示又消失的情况。虽然可能是默认将其绑定的,但这样很不好。不过我却也没找着取消的方法,不得已只好用数据绑定来解决了。在那些窗口中,首先为“关闭“的按钮添加一个数据绑定:当按钮Click时,就禁用按钮。然后在打开窗口的按钮撒上添加一个数据绑定:当按钮被点击时,启用窗口的、关闭按钮。如图:这样在运行游戏,点击关闭窗口后,就不会出现那种烦人的情况了。然后,是画地图。突然发现这是难点啊.2014.2.822.NPC引导者与.第一个任务、对话窗口Bug修复地图现在终于画出来个小村了。今天就来放NPC吧。第一个NPC我准备放“引导者”,作为玩家在游戏中的第一个提示。所以,在_Script/NPC文件夹中新建一个脚本,名字就叫作“NPC_Guide”。然后打开脚本:public class NPC_Guide : NPC protected override void Init ()base.Init ();SetAttribute(引导者,5,1000,50,25,0.1f,80,8);由于前边所做的努力,现在这儿还是比较简单的,几句话搞定。然后在NPC文件夹中选择一个合适的人物模型,将这个脚本赋给他,并且还要将BattleChange以及Talk(对话脚本)也拖给他。并为其添加上一个碰撞体,这时候运行游戏,这个“引导者”已经工作正常了。不过,如果对话的话,他就会说出像是失忆一般的话来,所以现在还必须在Talk脚本中添加这个NPC该说的话。把这个NPC命名为“Guide”。然后打开Talk脚本,在对话的swtch语句中添加一个case语句case Guide:m_talkContent.Text=引导者: 你好!我将会是你的引导者!如果你是第一次玩这个游戏,将特为你解答诸多疑惑!;break;这时候运行游戏,NPC按照Talk脚本中的内容发言了:为了完善这个NPC,还得为其添加技能粒子效果,声音效果等。但是,作为一个NPC,是绝不可能只会说一句话的!所以这儿,这个Talk对话的功能还得继续完善。所以回到脚本,在“Guide”那个case下改造下:case Guide:switch(m_talkCount)case 0:m_talkContent.Text=引导者: 你好!我将会是你的引导者!如果你是第一次玩这个游戏,将特为你解答诸多疑惑!;break;case 1:m_talkContent.Text=很好,那么现在我就告诉你怎么攻击:点击鼠标右键可以显示你学会的技能,点一下,就能使用了。;break;break;在switch中再次定义一个switch语句,这个里边的switch语句就用于判断NPC说到哪句话上了。由此用到的m_talkCount变量也得在最前面定义下:public int m_talkCount=0;m_talkCount变量怎么去改变呢?我的想法是,在玩家按下“E”键,也就是开始对话后,将当前对话的NPC对象赋给在玩家PlayerControl脚本中定义的一个对象变量,然后新建一个脚本,绑定于对话窗口上的“继续”那个按钮上,用于处理当按钮被点击时这个m_talkCount的自加。想法说了,那么现在就来实施下:首先是在PlayerControl脚本中,“对象”变标签中定义的一个对象:public Talk m_talkNPC;/对话的NPC然后是在SeeOther函数中,修改当玩家按下“E”键后,就把这个对象NPC的Talk脚本赋给先前定义的m_talkNPC:if(Input.GetKeyDown(KeyCode.E)m_talkTips.enabled=false;m_talkNPC=hit.collider.gameObject.GetComponent();m_talkNPC.ShowDialog();m_isTalking=true;现在就可在新建的脚本“ContinueTalk”进行施为了:public Talk m_talkNPC;public void OnClick( dfControl control, dfMouseEventArgs mouseEvent )m_talkNPC=GameObject.FindGameObjectWithTag(Player).GetComponent().m_talkNPC;m_talkNPC.m_talkCount+;m_talkNPC.ShowDialog();其中当先定义了一个变量,就是玩家当前对话的对象上的Talk脚本,然后使用了OnClick这个DaiKonGUI的函数。(曾经不知道daikon有这等方便的函数可用,都是写函数,然后用EventBinding来调用的,倒是麻烦了好多.这功能也是最近发现的.)在OnClick,也就是待变按钮被点击后的事件下,我获得了当前玩家的对话NPC对象中的Talk脚本,然后更改了Talk脚本中的m_talkCount,也就是对话的计量。这样可以使得对话继续进行。不过,在此我也并非完全笃定。于是便又新建了一个NPC“传说中的兽人”以作试验:public class NPC_StoryOrc : NPC protected override void Init()base.Init();SetAttribute(传说中的兽人,3,200,20,25,1,80,2.5f);为其动画改一下名,放置好声音以及粒子效果,并在Talk脚本中再添加一个case:case StoryOrc:switch(m_talkCount)case 0:m_talkContent.Text=传说中的兽人:你好,我就是传说红的兽人!;break;case 1:m_talkContent.Text=传说中的兽人:知道我为什么出现在此吗?;break;case 2:m_talkContent.Text=传说中的兽人:唉.一切都是为了试验啊.;break;case 3:m_talkContent.Text=传说中的兽人:如果你能看见这句话,那就说明对话窗口试验成功了。;break;break;这个兽人自身的名字也要改成StoryOrc:现在运行游戏,与NPC引导者对话,与兽人对话,都没有问题了。不过在对完话以后当玩家跳跃时,这个对话窗口就又会烦人地出现了.这个问题还是解决一下为好。新建一个脚本,名字就叫作“ClickCloseButton“罢:public float m_opacity;private dfButton m_button;void Start () m_button=GetComponent();void Update () if(m_opacity0.5f)m_button.enabled=true;else m_button.enabled=false;这个脚本就是单纯地用于判断当前窗口的透明度是否小于零或大于零,如果小于零,也就是 不可见时,便禁用这个关闭按钮,否则就启用关闭变扭。把它拖到对话窗口的关闭按钮上,并添加一个数据绑定,把对话窗口的Opacity透明度与这个脚本中的m_opacity变量进行绑定。现在运行游戏,对话完成后,无论这么跳,窗口也不会再度出现了。在这之后,这个对话窗口还有一个Bug:有时候当玩家按下“E“键,大概是在对话窗口刚刚消失,却又还没有完全消失完成时,这时候对话窗口不会再度出现,玩家也.动不了了!这时因为以前为了防止在对话时,玩家将NPC误伤,所作出的一个小对策,在PlayerControl脚本中有一个属性m_isTalking用于判断玩家是否处于对话中,而如果在窗口播放FadeOut的Tween动画时按下“E“键,就会造成窗口不出现,而玩家又被判定在”对话中“而无法动弹的的问题。为了解决这个问题,就将原本位于CloseTalkWindow脚本中的内容添加到上面的ClickCloseButton脚本中:/Author:CWH/email:/用于对兑换窗口关闭后,使其不再“不正常“出现,也用于判定玩家是否处于”对话中“public class ClickClo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 创作手抄报课件
- 三糖酶促修饰-洞察及研究
- 火山形成原因解读
- 文化与旅游结合的年轻化营销-洞察及研究
- 肝脏肿瘤超声引导下射频消融术
- 大学医学生物学
- 护理机器人在popped中的未来趋势-洞察及研究
- 大学活动游戏策划方案
- 对比分析方法与实战应用解析
- 神经外科二季度临床用血审核制度试题及答案
- TB 10012-2019 铁路工程地质勘察规范
- 弱电维护方案
- 砼回弹强度自动计算表
- 国开2023春《言语交际》形考任务1-6参考答案
- 抽油机井示功图分析判断1
- 机电一体化说专业比赛
- GB/T 39141.3-2022无机和蓝宝石手表玻璃第3部分:定性标准和试验方法
- GB/T 1142-2004套式扩孔钻
- 2022年天津市河东区生态环境系统事业单位招聘笔试试题及答案
- 研究生学术道德与学术规范课件
- 浦发银行个人信用报告异议申请表
评论
0/150
提交评论