把核心框架实现了,没有做界面

PS:让我想起来以前用XNA写了半个暑假的简陋版抢滩登陆,老辛苦还丑,现在的可视化引擎比以前的强大太多了

框架是以前写的老框架的延伸,直接看UML图吧

TotalManager,LevelManager,UIManager我前面的文章已经做过一次了,标准的MVC中负责VC的部分,M就是下面的Level_N了。

Unity已经帮我们实现了组件模式,所以我们只需要建一个空物体,然后把EnemyCreate,Shoot,UIController三个脚本挂上去,再制成Prefab,在LevelManager调用即可。

因为这些工具类我都希望他们只会生成出一个,所以都做成了单例模式(多打一行重复代码都是罪孽)。细节上就是继承了一个UnitySingleton泛型,实现如下:

UnitySingleton.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class UnitySingleton<T> : MonoBehaviour where T : Component //约束T需要继承Component
{//proteced保证了继承的子类可以访问//不过也导致同样继承了UnitySingleton的别的子类也可以访问,不过问题不大protected static T _instance;public static T Instance() {if (_instance == null) { //找到我们在场景里已经实例化的实例_instance = FindObjectOfType(typeof(T)) as T;//如果我们场景里没有实例化,就创建一个空物体增加脚本返回这个实例if (_instance == null) {GameObject obj = new GameObject();obj.name = typeof(T).ToString();_instance = obj.AddComponent<T>();}}return _instance;}
}

直接继承即可。注意我在泛型里并没有声明构造,需要在子类私有化防止被外部new实例化

public class UIController : UnitySingleton<UIController>{private UIController() { }
}

Shoot的逻辑处理没什么好说的,老样子一个raycast解决,当然其实这里还能玩很多东西的,例如不用射线检测,而是做成FreeFPS用子弹来打飞碟(直说了吧,还是抢滩登陆)

Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit; //存储碰撞到的物体的信息
bool isCollider = Physics.Raycast(ray,out hit); //被检测物体要有collider才能检测到
if (isCollider) {hit.transformhit.colliderhit.point
}

ray里储存了方向变量,我们可以很方便地得到子弹的射击角度。

不过子弹也好,飞碟也好,都是频繁创建的物体,如果不断的实例化+销毁,一是会让内存碎片化(当然UNITY会帮你处理好这一块的内容),二是对性能的损耗是极高的,因为创建实例的复杂度是O(n)的(算法课没开小差吧?)

这种时候,我们就可以使用一种叫做“对象池”的类解决这个问题(工厂模式的衍生)。我们提前实例好一定数量的对象,使用的时候就拿出来,用完了就塞回对象池,避开了实例化和释放的操作,这时复杂度是O(1)的

对象池存储对象的方法可以任意选择,List,Stack,Dictionary,数组都没有问题,根据自己的需要选择合适的存储方式

我下面给出一个使用Stack(栈)的例子

public class ObjectPool<T> where T : class, new()
{private Stack<T> m_objectStack = new Stack<T>();public T Get(){return (m_objectStack.Count == 0) ? new T() : m_objectStack.Pop();}public void Return(T t){m_objectStack.Push(t);}
}

很简单的代码,需要对象就调用Get方法,从Stack里拿一个实例去用,Stack里的对象如果已经用完了就当场实例化一个。

对象用完了就Return回来,压回Stack里等待下次使用

这段代码没有提前实例化,需要提前实例化的自己补一个Init方法,Return一定数量的对象实例即可

使用Stack的好处有两个,1.简单,用标准库,两分钟就能写好一个这样的对象池,2.对象池的大小是可拓展的,不会因为越界而报错。缺点也是因为可拓展,导致无法处理内存碎片化的问题(当然,使用UNITY就不用考虑这个了)

注意在多线程里使用对象池需要加上锁,不然无法保证线程安全(Unity依然不需要担心这个问题)

最后Unity有一个叫PoolManager的脚本插件,功能很强大,实际应用中用这个插件就可以满足九成九的需求了

github链接:https://github.com/keven2148/3D-Game-Programming-Design-Lesson-Work/tree/master/Lesson5

版本:Unity2017.3

3D Game Pr ramming Design(五):与游戏世界交互(对象池)相关推荐

  1. Unity3D游戏开发之类对象池优化秘籍残篇

    翻开秘籍第一页: 问: 什么是类对象池? 剑之初: 游戏中,我们常常会遇到频繁得创建和销毁大量相同对象的场景.如果我们不做任何的特殊处理,这种场景会出现两个性能问题--大量的内存碎片以及频繁的分配内存 ...

  2. ch05与游戏世界交互——鼠标打飞碟小游戏

    游戏内容要求: 游戏有 n 个 round,每个 round 都包括10 次 trial. 每个 trial 的飞碟的色彩.大小.发射位置.速度.角度.同时出现的个数都可能不同.它们由该 round ...

  3. 3D游戏编程学习笔记(五):与游戏世界交互

    一.前言 本次3D游戏编程我们将设计一个简单打飞碟(Hit UFO)有游戏. 二.游戏基本内容及规定 游戏基本内容 游戏有 n 个 round,每个 round 都包括10 次 trial: 每个 t ...

  4. 与游戏世界交互——Hit UFO

    目录 Hit UFO 一.游戏规则 二.gitee 三.程序实现 3.1 SSDirector.cs 3.2 SSAction.cs 3.3 SSActionManager.cs 3.4 Sequen ...

  5. python求5_python(五)——运算符,小整数对象池

    1.成员运算符,判断某个东西是否在某个东西里包含:in,not in name = "abcd" if "ac" inname:print("ok&q ...

  6. 第五人格服务器维护中怎么进游戏,第五人格游戏进不去黑屏怎么解决 第五人格游戏进不去黑屏解决攻略...

    <第五人格>是由网易推出的首款3D视角恐怖冒险解谜手游,采用了非对称对抗竞技玩法模式,不断探索,根据剧情任务来获得线索,剥开重重迷雾... 类型:动作冒险 大小:633.90M 语言:简体 ...

  7. 游戏开发入门(五)游戏动画系统

    视频链接:游戏开发入门(五)游戏动画系统(8节课 时常:约2小时30分钟) PPT比视频要块一些 第二节与PPT对不上 视频中杂音太大,如果带耳机还听不清的话,建议直接看内容即可 笔记与总结(请先学习 ...

  8. 3D建模师能做什么?游戏动漫电影统统不在话下,前景好薪资还高

    第一 :做3D游戏建模师,工资怎么样啊? 3D游戏建模师的工资是很高的,很多人的工资都一万到两万左右,当然这个不是说你刚入行就这么高的工资,这都是有一个过程的,你刚刚踏入职场,即便你有实力,非常懂,但 ...

  9. 3D建模行业工资待遇怎么样?游戏建模和影视建模哪个发展更好

    首先3D建模师主要根据建模软件的用途来分类,可分为为游戏建模.影视建模和工业建模三种.游戏建模主要是负责游戏里场景.角色.道具模型的制作.动漫影视建模主要是负责影视中角色.场景的模型搭建以及特效制作. ...

最新文章

  1. python b64 图片处理
  2. [刷题]Counting Bits
  3. 求两个数集的并集C++代码实现
  4. MaskRCNN:三大基础结构DeepMask、SharpMask、MultiPathNet
  5. 1分钟了解协同过滤,pm都懂了
  6. 快速幂算法(矩阵快速幂还不是很会。。日后会更新)
  7. 从 LinkedIn 的数据处理机制学习数据架构
  8. game design原理系列学习笔记(四)
  9. 黑苹果声卡驱动成功后声音出现卡顿的解决办法
  10. 2020年内蒙古自治区第十五届大学生程序设计竞赛榜单
  11. python实现两个word文档对比
  12. java重载和重写的区别_Java重载和重写的区别
  13. 【RT-Thread Master】at24cxx软件包使用笔记
  14. 同事通过接私活年入60W,他常用19个私活平台汇总!
  15. Swagger设置密码登录
  16. Python写的简单雷电小游戏
  17. 重庆市计算机专业高考试题,职业高中高考计算机专业试卷4
  18. Vue2.0开发之——webpack基础-打包发布项目(10)
  19. Matlab使用符号对象求二元函数积分并做图
  20. 拉格朗日启发式算法matlab,基于时间满意的最大覆盖选址问题

热门文章

  1. Excel2016设置目录页不包含页码
  2. 可下载全球历史卫星,无偏移、高精度-谷歌地球卫片
  3. Python实战——斗图网爬虫
  4. Windows Sockets Error Codes
  5. 琪露诺学习Vue.js的第二天
  6. 目标检测中的样本不平衡处理方法——OHEM, Focal Loss, GHM, PISA
  7. 使用docker搭建JIRA服务器,破解JIRA服务器、破解JIRA收费插件
  8. chrome android f12,chrome浏览器调试手机网站【原创】
  9. 高中计算机学考vb,浙江省高中信息技术选考加试题VB专项练习题一及答案
  10. 罗技无线键鼠套装更换鼠标的配对方法