Unity3D游戏开发之子弹追踪和协程

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Unity3D游戏开发之子弹追踪和协程应用

今天我们就这几天根据飞机大战个人重做的小项目进行了面试,面试中我遇到了好多技术上的问题和理解上的问题,在这总结一下,以便以后的参考。

场景如图:

1、项目包含的模块:

登陆模块、我方模块、敌方模块、游戏地形模块、子弹模块

2、各个模块的功能和功能所用的技术(功能之能做什么,不是游戏过程):

功能:登陆模块:可以跳转到游戏界面

我方模块:可以前后左右移动,发射子弹,得分,销毁,减少生命值

敌方模块:可以移动,发射子弹,销毁,克隆,子弹追踪

技术:GUI(文字显示,按钮点击,暂停开始);

位移(我方和敌方的移动);

克隆(子弹、敌方的克隆);

销毁(子弹、我方、敌方的销毁);

协程(敌方一波一波的自动出现);

循环判断(得分、减少生命值、游戏的暂停和继续、敌方和我方的销毁);

音频(设置子弹发出的声音,敌方和我方爆炸的声音,背景音乐);

键盘判断(我方的位移和发射子弹和游戏的暂停(esc暂停));

鼠标判断(我方的发射子弹,跳转界面和游戏继续);

触发器检测(双方子弹互相打中和敌我双方相撞)

3、具体知识点:子弹追踪和协程技术

子弹追踪:

1.void Update()

2. {

3. transform.Translate(0, 0, speed * Time.deltaTime);

4. timer -= Time.deltaTime;

5. if (timer <= 0)

6. {

7. timer = 1;

8. if (myTank != null)

9. {

10. Vector3 pos = enemyTank.position - myTank.position; 完成子弹的追踪,

所用方法为transform . Translate

11. GameObject.Instantiate(enemyRocket, enemyTank.position+new

Vector3(0,20,0), Quaternion.LookRotation(pos));

12. }

13. }

14. }

协程技术:

定义:

协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程。

协同程序的开启:

在Unity3D中,使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序,也就

是说该方法必须在MonoBehaviour或继承于MonoBehaviour的类中调用。

在Unity3D中,使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以开启一个线程。区别在于使用字符串作为参数可以开启线程并在线程结束前

终止线程,相反使用IEnumerator 作为参数只能等待线程的结束而不能随时终止(除非使用StopAllCoroutines()方法);另外使用字符串作为参数时,[狗刨学习网]开启线程时最多只能

传递一个参数,并且性能消耗会更大一点,而使用IEnumerator作为参数则没有这个限制。

协同程序的返回类型为Coroutine类型。在Unity3D中,Coroutine类继承于YieldInstruction,所以,协同程序的返回类型只能为null、等待的帧数(frame)以及等待的时间。

一个协同程序在执行过程中,可以在任意位置使用yield语句。yield的返回值控制何时

恢复协同程序向下执行。协同程序在对象自有帧执行过程中堪称优秀。协同程序在性能上

没有更多的开销。StartCoroutine函数是立刻返回的,但是yield可以延迟果。直到协同程序

执行完毕。

在C#下,你必须调用StartCoroutine。

应用:

1.public GameObject[] Enemytank;//声明对象数组

2. int number = 5;

3.void Start()

4. {

5. StartCoroutine("Spawn");

6. }

7.IEnumerator Spawn()

8. {

9. yield return new WaitForSeconds(5f);//开始等待5秒

10. while (true)

11. {

12. while (number > 0)

13. {

14. GameObject go = Enemytank[Random.Range(0, Enemytank.Length)];

15. Vector3 pos = new Vector3(Random.Range(916, 1163), 136f, 1225f);

16. GameObject.Instantiate(go, pos, transform.rotation);

17.

18. yield return new WaitForSeconds(10f);//每隔两秒克隆1个

19. number--;

20. }

21. number = 5;

22. yield return new WaitForSeconds(4f);//每隔4秒开始下一波

23. }

24. }

这样就完成了敌方的一波一波的克隆和出现。

相关文档
最新文档