Unity3D游戏开发笔记3.doc

上传人:asd****56 文档编号:70328780 上传时间:2023-01-19 格式:DOC 页数:27 大小:4.18MB
返回 下载 相关 举报
Unity3D游戏开发笔记3.doc_第1页
第1页 / 共27页
Unity3D游戏开发笔记3.doc_第2页
第2页 / 共27页
点击查看更多>>
资源描述

《Unity3D游戏开发笔记3.doc》由会员分享,可在线阅读,更多相关《Unity3D游戏开发笔记3.doc(27页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、泰课在线2014.1.226.【动画的完善与.GUI的开始血条与魔法条】好了,今天就首先来修复一下攻击动画播放与攻击效果不协调的问题吧。攻击动画与攻击产生的粒子效果不协调,究其原因,便是时间上的不同步而已,解决方法就是令其同步,当然,做到让人看起来差不多没问题就行了。在这里,我选择使用开启一个协同函数来解决,这样实现这一点是比较简单的。因为敌人和角色都存在这样的问题,首先就先解决玩家角色的吧。双击打开PlayerControl脚本,在脚本最后,在定义上一个IEnumerator WaitForAttack()函数,然后把原本Atack函数中获取到m_nowAttackTarget对象脚本以下的

2、函数都移动进去,在这里顺便还可以改一下m_animation.Play(Attack3-1);,将原本的C肉身Fade改成Play,这样攻击动画会看起来更流畅些。然后在WaitForAttack函数中,定义可以传入以下几个参数:string name,float timer,Transform particle,AudioClip m_audio,int attack(这都是为了以后才如此定义的,这个协同函数以后可能还会用到,比如写技能等时候)。然后在函数体中就根据传入的参数进行一些修改了:IEnumerator WaitForAttack(string name,float timer,Tr

3、ansform particle,AudioClip m_audio,int attack)yield return new WaitForSeconds(timer);if(m_animation.IsPlaying(name) Instantiate(particle ,m_nowAttackTarget.transform.position+Vector3.up,Quaternion.identity);audio.PlayOneShot(m_audio);m_nowAttackTarget.Damage(attack);在上面我估摸着攻击动画播放0.6秒之后刚好处于向前攻击的状态,所以

4、设置了延时0.6秒之后判断玩家是否还处于攻击动画中(玩家有可能中途结束攻击)。修改之后,在Attack函数中调用:StartCoroutine(WaitForAttack(Attack3-1,0.65f,m_attackParticle,m_attackAudio,m_attack);回到游戏,再运行就没问题了,攻击动画的播放,以及声音等等都差不多在合适的位置了。现在继续修改敌人的攻击动画播放。双击打开Enemy主脚本,仿照PlayerControl脚本,也在脚本最下面定义一个协同函数:IEnumerator WaitForAttack(float timer,Transform partic

5、le,AudioClip m_audio,int attack)yield return new WaitForSeconds(timer);Instantiate(particle ,m_damageTarget.transform.position+Vector3.up,Quaternion.identity);audio.PlayOneShot(m_audio);/播放声音m_damageTarget.Damage(attack);/调用对象的伤害函数if(m_damageTarget.m_isDead)/如果攻击目标死掉了的话,就回到Idle状态吧m_isIdle=true;因为由电脑

6、控制的敌人一般不可能中途停止动画,所以在敌人这儿就不用判断是否中断了动画了。因此它只需要传入延时、攻击粒子效果、音效、攻击力四个参数就可以了。上面函数体中的内容同样是将Attack函数中的获取了对象m_damageTarget=m_hit.collider.gameObject.GetComponent();之后的脚本复制进去修改的。在Attack函数原本位置开启协同函数:StartCoroutine(WaitForAttack(0.6f,m_attackParticle,m_attackSound,m_attack);(敌人发动技能的那个分支里就把粒子效果改为技能的,让传入的attack*3

7、即可)。运行游戏,没问题了!=现在最低层的做了这么多了,那么下面就先吧GUI界面稍微搭建起来罢!首先在根目录新建一个Font文件夹 ,然后导入自己的一个中文字体放进去。然后选中字体,点击菜单栏的Tools菜单,选择DaikonGUI中的动态字体制作,就可以将导入的中文字体制作成为动态字体了。这是侯也就可以在DaikonGUI中使用了。那么现在点击菜单栏的GameObject,选择Daikon Forge,打开DaikonGUI的UIWizard,我点击新建了创建一个名为“MyGUI”的层,然后将GUI设定在这个MyGUI层,点击新建完成。在DaikonGUI控件创建面板中,我折腾了好些时候,才

8、把界面布局确定下来。嗯,刚才电脑内存不足,卡死了,刚做好的东西又都没了.所以说,许多血淋淋的事例都在教育我们:电脑太烂了就要多保存!=好了,继续写吧。界面布局确定下后,就可以开动了。我的布局暂时是这样,不清楚以后还会不会改:希望我的审美官没问题,虽然可能有更好的方法,但我实在对美术设计什么的没天赋啊.那么,先记一下怎么开始的。首先,右键点击面板创建一个Panel,这个Panel将用于存放所有的GUI、控件,因此将它设定为屏幕一样大小,并命名为GUI,将Anchor全部勾选。如图:右键点击这个名为GUI的Panel后,再次选择创建一个Panel,这个Panel将作为游戏中信息提示框,改一下透明度

9、,重命名为“TipsBar”将其拖放到右边,同样像上图一样勾选所有的Anchor:现在就是左边底部的技能栏了,这个就是点击右键,还是创建一个Panel,将其命名为SkillBar,Anchor设置为Left和Bottom。将背景选择好之后,在这个技能栏中右击选择创建一个Button,Anchor设置为Left和vertical(注意选择背景图片)。再在Button下再创建一个Label,Label内容为1,这时就可以直接复制五个出来,改一改Label的类容,依次为1、2、3、4、5、6。技能栏先不管,现在再在先前GUI Panel中创建一个Panel,名为StatBar,将其移动到技能栏上方,

10、勾选Anchor中的Left和Bottom。在这个StatBar中就可以创建生命条和魔法条了。首先创建一个Panel,命名为“LifeBar”,Anchor勾选Left。在其中创建一个Label,名为Life,Text内容为“生命”,可以改一下文字的Effects属性,使它好看些:然后继续新建一个Slider,Anchor设置为Left、Top、Bottom。在这个Slider中再新建一个Sider,可以命名为Progress,为这个Progress设置一个血条样的背景,然后将这个Progress拖放到Slider的Control中的Progress上,在下边的Padding中可以将Lift和

11、Right都设置为2 ,这时候,就可以根据Slider里Behavior中Value的值来调整血条的长度了。如图:最后再在Slider下新建一个Label,命名为LifeText,这个Label用于吧玩家当前的最大生命和最小生命显示在血条上。界面就差不多了,现在先不慌把魔法值条弄出来,等设置好血条再弄吧。现在就要得修改脚本了。进入_Script文件夹,双击打开PlayerControl,在“变量”标签中定义如下两个变量:public int m_LifeBar=100;/定义当前血条长度public int m_MagicBar=50;/定义当前魔法条的长度、然后在Update函数中加上两句计

12、算当前血条长度的语句:m_LifeBar=(int)(float)m_currentLife/m_maxLife)*100);m_MagicBar=(int)(float)m_currentMagic/m_maxMagic)*100);现在就可以点击Slider,为其绑定一个Property Binding了,DataSource选择玩家角色身上的m_LifeBar,而DataTarget就选择自己的Value。运行游戏,血条应该就已经可以根据角色受到的攻击而减少了。不过,现在血条上的数值是不会改变的,所以,还必须为LifeText进行数据绑定。在这里的话,我就在_Script文件夹下再创建一

13、个文件夹,名为GUI,再在GUI文件夹中创建一个叫“LifeAndMagicBar”的脚本,这个脚本的作用是为了通过角色当前的生命,以及最大生命,将对显示在血条上的生命值进行改变。内容很简单,:public string m_text=100/100;public int m_maxValue=100;public int m_currentValue=100;private dfLabel m_label;void Start()m_label=GetComponent();void Update()m_label.Text=m_maxValue+/+m_currentValue;这里就不多

14、解释了。回到编辑器中,将LifeAndMagicBar这个脚本赋给LifeText控件,然后就可以为其绑定两个Property Binding,DataSource和DataTarget分别设定为玩家中的m_maxLife、m_currentLife和LifeMagicBar中的m_maxValue、m_currentValue。好了,现在回到游戏,如果运行的话,基本上就没问题了,受到攻击后的生命也会正常减少了。那么就可以将LifeBar复制一份,然后将其中的Life换成Magic就可以了,绑定变量由于都是从同样的脚本中获取数据,修改起来也不过点点手指,就很简单了。下面是截图:时间这样搞过得可

15、真是快啊.不多久一天就没了.好吧,今天的话,就到此为止了。2014.1.237.【死亡的完善与.提示栏的工作】昨天把GUI做了点出来,攻击之类差不多算是正常了。不过,现在无论是人物还是敌人,在生命为零的时候都不会再有其后的结果了。生命为零,理应死掉了才对。那么今天就先完成这一点吧。打开编辑器,在_Script文件夹下双击打开PlayerControl脚本,首先来完善玩家角色的死亡。在“判断”标签中,定义一个用于判断玩家是否死掉了的bool变量:private bool m_isDead=false;/是否死亡然后在先前定义的GetStat函数最后加上一句判断玩家是否死掉了的语句:if(m_cu

16、rrentLife=0)m_animationDeath.wrapMode=WrapMode.ClampForever;m_animation.CrossFade(Death);m_isDead=true;在这里判断当前生命是否为零,如果为零,首先将死亡的动画状态设定为只播放一次,然后播放死亡的动画。并同时把m_isDead设定为True。最后还要在Update函数中加上这样一句:if(!m_isDead)Attack();Move ();这时用于判断人物死亡后,就不给玩家控制人物了。现在回到编辑器中运行游戏,当玩家生命为零,就死掉了,再也无法做什么了.=玩家的死亡解决了,接下来是敌人的。打开

17、Enemy脚本,在Update函数中,加上一句判断敌人是否死亡的语句:if(!m_changeState.m_isDead)案后将Update函数中的所有函数啊、语句什么的全都移动到这个判断语句中,然后再后边的GetState函数中进行死亡动画的播放:void GetState()m_currentLife=m_changeState.m_life;if(m_currentLife=0)m_animationm_animationDeath.wrapMode=WrapMode.ClampForever;m_animation.CrossFade(m_animationDeath);Destro

18、y(m_transform.rigidbody);m_transform.collider.isTrigger=true;这里就是判断敌人生命是否为零。为零就播放一次死亡动画,并将碰撞器的isTrigger设置为True(这时为了以后计算敌人死亡后会留下什么宝物准备的),并将rigidbody毁掉,免得敌人“哗”地一下,就掉得不见了。运行游戏,查看一下效果。不出所料的话,应该是没问题了。不过,这里有那么点问题。前面我将在Update函数中调用的GetState函数放在了判断敌人是否在Idle状态的else语句里面了,也就是说,这样一来,如果敌人处于idle状态,就不会发生生命值同步了,那么敌人

19、就不会减生命了.这里只需要把GetState函数移动到if(!m_isDead)前面就行了。如图:接下来。我觉得应该先把下边那个提示栏弄出点东西来,不然老那么光秃秃的也不好看。现目前能有什么提示信息呢?大概是生命减少之类的了吧。这个我就使用富文本了,节约、美观。界面的布局的最后效果就是这样的了:首先,点击提示栏,新建一个富文本框,就像如图中那般大小即可,将Anchor全都勾选,然后随便打几个字以作实验。同时在它的旁边再新建一个ScrollBar在Anchor中勾选Right、Top和Bottom,在这个ScrollBar中再新建两个Sliced,分别命名为Thumb和Track,都是将Anch

20、or中的勾选完了的。选择好两个Sliced的背景,将Track缩放至ScrollBar一样大小,而Thumb的宽跟Track一样,高则取一个合适的值即可。最后将这两个Sliced分别拖放给ScrollBar的Thumb和Track(要选择ScrollBar的形式为Verticle),再勾选富文本框里面的Allow Scroll,将前面做好的ScrollBar拖给他,就完成了。这里为了美观起见,我还新建了一个Sliced作为富文本框的背景,就是这样!运行游戏,东西差不多都没问题,只是符文本框在拖动的时候,太过于缓慢了,想要快一点的话,就还要改一改ScrollBar中的Increment,改成20

21、就比较快了:如果光有这些的话,当然不行。他还必须得实时显示游戏中的数据才可以。所以下面,继续写脚本了!又是折腾好久,以下内容,依然是实验过后的最终结果,其他就不详叙了。功能以经达到,现在慢慢道来:接上面的内容,实现提示栏的内容显示额方法,原本我是想新建一个脚本,理应数据绑定来实现的,最后失败了,改成了直接修改原来的BattleChange脚本来实现。首先吧,新建一个标签,我明名为“TipsBar”,然后将这个标签指定给了提示栏的那个富文本框。接下来打开BattleChange脚本,在最前面定义一个富文本的脚本对象:private dfRichTextLabel m_dfTxet;/定义提示栏的

22、脚本对象在这里原本因为Start函数没有用到,我是把它删掉了的,所以现在还得定义回来,然后在Start函数中获取对象:void Start()m_dfTxet=GameObject.FindGameObjectWithTag(TipsBar).GetComponent();/获取提示栏的脚本对象最后,就可以在脚本里对提示框的富文本内容进行修改了:public void Damage(int m_attack)if(m_life0)m_realAttack=(int)Random.Range(m_attack-m_attack*0.25f,m_attack+m_attack*0.25f);/随机

23、伤害值,范围在正负25%以内/Debug.Log (伤害:+m_realAttack);if(m_realAttack-m_defense0)m_life-=(m_realAttack-m_defense);m_dfTxet.Text+=(+m_name+被狂殴了一顿,生命减少+(m_realAttack-m_defense)+点);if(Random.value0.9f)m_dfTxet.Text+=(看看上面那鲜红的字迹,就知道你造就了多少杀戮了!);elsem_life-=1;m_dfTxet.Text+=(+m_name+皮糙肉厚,生命只减少了+(m_realAttack-m_defe

24、nse)+点);if(Random.value0.9f)m_dfTxet.Text+=(看看上面那鲜红的字迹,小心被咔嚓掉哦!);if(m_life=0)m_life=0;m_isDead=true;m_dfTxet.Text+=(+m_name+惨遭杀戮,抽搐了几下,死掉了.);这里我除了定义显示的正常攻击内容外,还添加了些许奇怪的文字,也算是增加点趣味罢。现在运行游戏,就会看见如下结果了:差不多吧,只是因为其中的名字默认是“无名”,而且我还没给它进行名字的同步赋值,所以才会这样,下面,继续修改吧。改名字这点好像不如先前想的那么麻烦,只要在PlayerControl和Enemy脚本的Star

25、t函数中加上一句话就可以咯额:m_changeState.m_name=m_name;现在就ok了:又是一天过去.明天继续.2014.1.248.【强化敌人AI,折腾的GUI.】今天的话,首先再升级一下敌人的Ai吧。毕竟在玩家在敌人身后使劲攻击的话,这敌人也都不会有反应的,太不合理了。打开Enemy脚本,在最前面“变量”标签中,先定义一个计数器,因为必须考虑到被同类“误伤”的情况:private int m_attackMeCount=0;/被一个同类对象攻击的次数然后再在最下面的WaitForAttack函数中将自己的对象传入自己的攻击对象,以作判断:m_damageTarget.m_cha

26、ngeMeTarget=m_transform;/将自己的对象传给攻击的目标现在就可以在GetState函数中对攻击自己的目标进行判断了:if(m_changeState.m_changeMeTarget!=null)if(m_changeState.m_changeMeTarget.tag=Enemy)m_attackMeCount+;if(m_attackMeCount3)/敌人被同样是怪物的敌人攻击三次以上,就会也攻击攻击自己的敌人怪物了m_isIdle=false;m_attackTarget=m_changeState.m_changeMeTarget;else/如果被非同类的攻击,

27、就直接打起来了m_isIdle=false;m_attackTarget=m_changeState.m_changeMeTarget;这里我判断的计数器为三,也就是说,如果敌人被同样是怪物的敌人攻击了三次以上,就把自己的攻击目标设为攻击自己的,否则就直接攻击攻击自己的对象。最后在PlayerControl脚本中,也还要加上一句将自己的对象传入攻击对象的语句:m_nowAttackTarget.m_changeMeTarget=m_transform;一样放在WaitForAttack中。因为前面用到了“Enemy”标签来判断攻击自己的是否是敌人这一类,所以还要在编辑器中新建一个名为“Enem

28、y”的Tag,然后再Enemy脚本的Start函数中加上这么一句话:m_transform.tag=Enemy;现在运行,一切Ok了。那么现在继续下一步,把敌人的血条也加上罢!这个如果使用DaikonGui就比较简单了,亏我第一做这游戏时,还用世界坐标转屏幕坐标,各种麻烦地花了好久才搞定.算了,这个的麻烦成度同样超乎想象了.东西做是做好了,但是头顶的描述信息是所有人都会用到的,所以我想把它做成一个预制体放进去,待事例化一个什么用的着的东西时,直接将血条啊什么的实例化出来,直接传数据就是了,可是失败了.事例化出来的UI必须要在UI相机之下作为其子物体才有用!搞了一大晚上了,都没找着解决之道,本来

29、找着一个可以将物体设置为另一个物体子物体的函数,但是却对DaikonGUI无效.明天再研究不出来,我就还是用笨办法来解决了。2014.1.259.【头顶Panel的实现与修复,制造“敌人制造者”与.以往Bug的修复】经过不懈努力,再次折腾良久,终于把敌人头上显示的东西的方法搞定了!鼓掌鼓掌!Daikon虽说有时候方便,但同样有时候很恼火。因为相比NGUI,daikonGUI在网上基本上找不着什么资料,百度一搜,不是什么“太空泥”就是些稀奇古怪的东西,基本上别想找着点有用的东西,让我都怀疑在中国究竟有多少人在用DaikonGUI了?NGUI虽说大多都是”过期资料“,好歹有些参考不是?Daikon

30、GUI就只有自个儿看官方的例子,看看源码了.遇到问题,也同样只有自个儿折腾了.。(特别是在我大农村,连官方文档都木有的情况下,会折腾死人的.)不过,用还挺好用的。继续吧!这次我采用的解决办法是,让DaikonGUI中的一个Panel负责接收一个GameObject和一个是否实例化的Bool变量,接收之后实例化一个先前做好的预制体,同时把GameObject对象传给这个新生成的预制体,当这个预制体得到所有信息后(比如生命、名字等),就附加上一个DaikonGUI的跟踪脚本,并把这个脚本的跟踪对象设置为跟踪物体。以上。现在再详细记一下经过罢。首先,在_Script中的GUI文件下,新建一个脚本,我

31、命名为” MakeTopHeadContent “,这个脚本负责接收需要实例化的各种参数,首先是对各个变量的定义:public dfPanel m_panel;/自己public GameObject m_TopHead;/头顶面板预制体private TopHeadContent m_topHeadContent;/头顶面板public GameObject m_3DGameObject;/放置面板的对象public bool m_ifAddTopContent=false;/是否已经创建了面板然后再在Start函数中获取自身的Panel对象(因为GUI的控件实例化同样必须使用GUI控件来进

32、行,否则,无效):Void Start()m_panel=GetComponent();现在在Update函数中就可以判断是否进行实例化操作了:void Update () if(m_ifAddTopContent) m_topHeadContent=m_panel.AddPrefab(m_TopHead).GetComponent();m_topHeadContent.m_showTarget=m_3DGameObject;m_ifAddTopContent=false;在Update中,首先判断是否进行实例化操作,如果可以,就使用DaikonGUI的一个函数AddPrefab添加预制体,完

33、成后取得这个预制体对象,并将需要跟踪的物体对向传给它,最后就是将可以实例化的操作置为false了。完成了这个,那么就看看预制体吧。预制体也需要一些指定的操作,所以也需要一个脚本,在GUI文件夹下建立一个脚步,命名为TopHeadContent,代表这个预制体的脚本。然后双击打开,首先定义了四个变量,分别用于存放需要跟踪的目标,目标的状态,以及目标当前血条的长度和名字:public GameObject m_showTarget;public BattleChange m_targetState;public float m_lifeBarLengh=1;public string m_name

34、= ;然后再Start函数中设置好各个属性:void Start () dfFollowObject follow=transform.gameObject.AddComponent(dfFollowObject).GetComponent();follow.attach=m_showTarget;/设置跟踪目标follow.offset.y=1;m_targetState=m_showTarget.GetComponent();/这是设置目标显示的内容while(m_name=)m_name=m_targetState.m_name;m_lifeBarLengh=m_targetState.

35、m_lifeBarLengh;这个脚本挺短小的,所以在这里我把需要添加的跟踪脚本直接定义在了Start中,然后添加并取得了这个跟踪脚本的对象,并把跟踪对象设置为需要跟踪的目标。其中follow.offset.y=1;是设置高度,我设置为高一米。然后获取目标的BattleState脚本对象,并在这个脚本中获取”名字“、”血条长度“的信息。使用while来定义名字的原因是,名字的获取大概有些先后顺序,当对象还没赋给它时,获取到的名字就是空的,不可用。所以才在这儿进行循环判断,是否获取到了名字。最后是Update函数,在Update函数中,只有一句话,那就是用于更新当前血条的长度(因为血条长度一般都

36、是会动态变化的):void Update () m_lifeBarLengh=m_targetState.m_lifeBarLengh;现在在ChangeBattle脚本中,就要添加一些语句了。首先定义两个变量:public float m_lifeBarLengh=1;/血条长度public float m_maxLife; /最大生命然后在Start函数中同样添加两句:m_maxLife=m_life;m_lifeBarLengh=m_life/m_maxLife最后在Update函数中实时计算当前血条的长度:void Update()m_lifeBarLengh=m_life/m_max

37、Life;以上就差不多Ok了,接下来是建立的预制体。预制体我采用的方式是建立一个Panel,并命名为TopOfTheHead。然后将血条及姓名都放在这个Panel下面,如图:其中那个血条就是个Progress而已,设置好背景及Progress就行了。然后,就是把先前的那个TopHeadContent脚本拖放到这个Panel之上,并设置两个数据绑定,分别将数据源设置为TopHeadContent的m_name和m_lifeBarLengh,数据目标则是这个Panel下的Label额Text和Progress的Value:绑定完毕之后,差不多就没了。将这一整个Panel拖放到根目录新建的_MyPr

38、efab文件夹中。然后把先前的MakeTopHeadContent脚本拖放到DaikonGUI面板中以前建立的最大的那个名为GUI的Panel上,新建一个名为”GUI“的标签,将这个标签指定给GUI这个Panel:最后把做好的预制体拖放到TopHead对象上。结束了。最后运行下游戏,终于搞定了:到了现在,下一步就先把”敌人制造者”弄出来吧!这个”敌人制造者“,根据字面意思就可知道,就是敌人刷新点的意思,而现在就来写敌人刷新点的脚本罢。首先还是在_Script中的Enemy文件夹中新建一个脚本,名为“EnemySpawn“=我会说刚才内存不足,又蹦窥掉了一次么?!太坑了.此前做好的预制体又没了.

39、好吧,EnemySpawn脚本内容如下:public class EnemySpawn : MonoBehaviour public Transform m_enemy;/敌人public Transform m_enemyBoss;/bossprivate Transform m_madeEnemy;/已经制造出来的敌人private BattleChange m_madeEnemyState;/已经制造出来的敌人的状态private bool m_madeEnemyIsDead=true;/已经制造出来的敌人是否已经死掉private Transform m_player;private

40、Transform m_transform;private DayAndNightManager m_dayAndNight;/日夜系统private float m_makeTimer=0;private float m_randomValue;/随机值void Start () m_transform=this.transform;m_player=GameObject.FindGameObjectWithTag(Player).transform;/获取角色对象m_dayAndNight=GameObject.FindGameObjectWithTag(DayAndNight).GetC

41、omponent();/获取日夜系统void Update () m_makeTimer-=Time.deltaTime;if(Vector3.Distance(m_transform.position,m_player.position)90)/如果与玩家距离小于90,就可以制造敌人了if(m_madeEnemyState!=null)m_madeEnemyIsDead=m_madeEnemyState.m_isDead;if(m_makeTimer19|m_dayAndNight.m_hour6)/如果是晚上,则boss刷新率翻倍m_randomValue+=0.05f;if(Random

42、.value0.95f)/这是用于判断制造出Boss的概率m_madeEnemy=(Transform)Instantiate(m_enemy,m_transform.position,Quaternion.identity);m_madeEnemyState=m_madeEnemy.GetComponent();m_makeTimer=40;/四十秒一次elsem_madeEnemy=(Transform)Instantiate(m_enemyBoss,m_transform.position,Quaternion.identity);m_madeEnemyState=m_madeEnemy.GetComponent();m_makeTimer=40;/四十秒一次以上便是这次的全部代码了。现在慢慢解释罢.首先在上面定义的变量就不用多说了,在Start函数中,我获取了自身、玩家角色以及昼夜系统的对象,以方便后来的使用。然后在Update函数中,首先将刷新敌人的计时器减一点之后,判断玩家与自己的距离(这是为性能考虑才这样做的),如果距离小于玩家所能看到的视线距离,就判断一下是否可以刷新敌人了。这个判断依据就是计时器是否时间以到,并且实例化出来的敌人是否已经死掉了?如果两个条件都满足,就进入制造敌

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 休闲娱乐

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com