泰课在线泰课在线()——国内首家Unity3D游戏开发免费实训基地12014.2.318.【新的属性】上次提到的属性栏,今天还是再完善一下,加上了几个属性:并且在PlayerControl中也都定义好了各自的变量,使用PropertyBinding将其与各自的Label绑定起来:publicstringm_sex=?;//性别publicstringm_profession=?;//职业publicintm_kindOrEvil=0;//善恶值publicintm_age=13;//年龄publicfloatm_bodyTall=0;//身高publicfloatm_bodyWight=33;//体重publicstringm_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);泰课在线泰课在线()——国内首家Unity3D游戏开发免费实训基地2然后再在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保存与读取时间voidSaveTime(){PlayerPrefs.SetInt(p_hour,m_hour);PlayerPrefs.SetInt(p_day,m_day);PlayerPrefs.SetInt(p_month,m_month);PlayerPrefs.SetInt(p_year,m_year);}voidLoadTime(){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”,然后输入以下代码:usingUnityEngine;usingSystem.Collections;泰课在线泰课在线()——国内首家Unity3D游戏开发免费实训基地3publicclassMouseCurser:MonoBehaviour{Cameram_guiCamera;publicTexturem_mouseImage;voidStart(){Screen.showCursor=false;}voidOnGUI(){Vector2mouseCurser=Input.mousePosition;GUI.DrawTexture(newRect(mouseCurser.x,Screen.height-mouseCurser.y,16,20),m_mouseImage);}}然后将其拖放到玩家身上,再把鼠标指针的图片设置好,就完了。这是一个篝火。泰课在线泰课在线()——国内首家Unity3D游戏开发免费实训基地4篝火由木材和一个粒子构成。不过,篝火应该是只有在晚上才会燃烧起来对吧?所以,新建一个脚本,用于判断当前时间是白天还是黑夜,如果是白天,就把篝火这个游戏物体禁用了,否则就开启。在这之前,为了方便判断白天和黑夜,所以就还在DayAndNight脚本中添加一个变量“m_isNight”:publicboolm_isNight=false;//是晚上吗?然后在Update函数中添加判断:if(m_hour19&&m_hour5){m_isNight=false;}elsem_isNight=true;这里就没什么事儿了。新建一个脚本,名字就叫作“CampFire”,代码只有几行:privateDayAndNightManagerm_dayAndNight;privateTransformm_Torch;voidStart(){m_dayAndNight=GameObject.FindGameObjectWithTag(DayAndNight).GetComponentDayAndNightManager();m_Torch=transform.FindChild(Torch).transform;}voidUpdate(){if(m_dayAndNight.m_isNight){m_Torch.gameObject.SetActive(true);}elsem_Torch.gameObject.SetActive(false);}脚本主要作用就是从DayAndNight脚本中获取当前是晚上还是白天,以选择启用或禁用“火”的燃烧。这个脚本是直接拖放到Tourch的父物体木材身上:泰课在线泰课在线()——国内首家Unity3D游戏开发免费实训基地5然后,再为角色增加一个属性:“饱食度”吧。打开PlayerControl的脚本,在最开始定义饱食度的变量:publicintm_hungryAndFull=100;//饱食度publicstringm_hungryAndFullText=;//这个设定是:当其大于100时为满足,大于150时为满腹,大于200时为腹胀,大于300就...撑死吧....//小于0时为饿了,小于-100时为饥饿,小于-200为饿惨了,小于-250为饿死中,小于-300就...饿死吧....//在饱食度变化的同时也会使属性发生变化泰课在线泰课在线()——国内首家Unity3D游戏开发免费实训基地6接下来,我在脚本最后添加了一个函数“HungryAndFull”,这个函数用于控制饱食度的改变所产生的各种变化:voidHungryAndFull(){if(m_hungryAndFull0){if(m_hungryAndFull100){m_hungryAndFullText=肚子没感觉勒....;}elseif(m_hungryAndFull100&&m_hungryAndFull150){m_hungryAndFullText=满足;}elseif(m_hungryAndFull150&&m_hungryAndFull200){m_hungryAndFullText=满腹;}elseif(m_hungryAndFull200&&m_hungryAndFull300){m_hungryAndFullText=腹胀;}else{m_dfTxet.Text+=p你被撑死了........img=\han\/p;m_animation[Death].wrapMode=WrapMode.ClampForever;m_animation.CrossFade(Death);m_isDead=true;}}else{if(m_hungryAndFull-100){m_hungryAndFullText=饿了;}elseif(m_hungryAndFull-100&&m_hungryAndFull-200){m_hungryAndFullText=饿惨了...;}elseif(m_hungryAndFull-200&&m_hungryAndFull-300){m_hungryAndFullText=饿死中...;}else{m_dfTxet.Text+=p你被饿死了........img=\han\/p;m_animation[Death].wrapMode=WrapMode.ClampForever;m_animation.CrossFade(Death);m_isDead=true;}}泰课在线泰课在线()——国内首家Unity3D游戏开发免费实训基地7}以上是几个饱食度时段的显示变化,后面还得加上饱食度对属性的影响。而改变饱食度的方式就是在DayAndNight脚本中的时间属性了。打开DayAndNight脚本,在最开始定义PlayerControl脚本的对象:privatePlayerControlm_player;然后再Start函数中获取对象:m_player=GameObject.FindGameObjectWithTag(Player).GetComponentPlayerControl();获取到对象之后,就可以根据时间的流逝改变而对饱食度造成影响了。在Update函数中,每一个小时都对饱食度做出一定改变,改变程度是随机在3~10点话之间:if(m_minute=60){m_player.m_hungryAndFull-=(Random.Ran