3D Game Pr ramming Design(五):与游戏世界交互(对象池)
把核心框架实现了,没有做界面
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(五):与游戏世界交互(对象池)相关推荐
- Unity3D游戏开发之类对象池优化秘籍残篇
翻开秘籍第一页: 问: 什么是类对象池? 剑之初: 游戏中,我们常常会遇到频繁得创建和销毁大量相同对象的场景.如果我们不做任何的特殊处理,这种场景会出现两个性能问题--大量的内存碎片以及频繁的分配内存 ...
- ch05与游戏世界交互——鼠标打飞碟小游戏
游戏内容要求: 游戏有 n 个 round,每个 round 都包括10 次 trial. 每个 trial 的飞碟的色彩.大小.发射位置.速度.角度.同时出现的个数都可能不同.它们由该 round ...
- 3D游戏编程学习笔记(五):与游戏世界交互
一.前言 本次3D游戏编程我们将设计一个简单打飞碟(Hit UFO)有游戏. 二.游戏基本内容及规定 游戏基本内容 游戏有 n 个 round,每个 round 都包括10 次 trial: 每个 t ...
- 与游戏世界交互——Hit UFO
目录 Hit UFO 一.游戏规则 二.gitee 三.程序实现 3.1 SSDirector.cs 3.2 SSAction.cs 3.3 SSActionManager.cs 3.4 Sequen ...
- python求5_python(五)——运算符,小整数对象池
1.成员运算符,判断某个东西是否在某个东西里包含:in,not in name = "abcd" if "ac" inname:print("ok&q ...
- 第五人格服务器维护中怎么进游戏,第五人格游戏进不去黑屏怎么解决 第五人格游戏进不去黑屏解决攻略...
<第五人格>是由网易推出的首款3D视角恐怖冒险解谜手游,采用了非对称对抗竞技玩法模式,不断探索,根据剧情任务来获得线索,剥开重重迷雾... 类型:动作冒险 大小:633.90M 语言:简体 ...
- 游戏开发入门(五)游戏动画系统
视频链接:游戏开发入门(五)游戏动画系统(8节课 时常:约2小时30分钟) PPT比视频要块一些 第二节与PPT对不上 视频中杂音太大,如果带耳机还听不清的话,建议直接看内容即可 笔记与总结(请先学习 ...
- 3D建模师能做什么?游戏动漫电影统统不在话下,前景好薪资还高
第一 :做3D游戏建模师,工资怎么样啊? 3D游戏建模师的工资是很高的,很多人的工资都一万到两万左右,当然这个不是说你刚入行就这么高的工资,这都是有一个过程的,你刚刚踏入职场,即便你有实力,非常懂,但 ...
- 3D建模行业工资待遇怎么样?游戏建模和影视建模哪个发展更好
首先3D建模师主要根据建模软件的用途来分类,可分为为游戏建模.影视建模和工业建模三种.游戏建模主要是负责游戏里场景.角色.道具模型的制作.动漫影视建模主要是负责影视中角色.场景的模型搭建以及特效制作. ...
最新文章
- python b64 图片处理
- [刷题]Counting Bits
- 求两个数集的并集C++代码实现
- MaskRCNN:三大基础结构DeepMask、SharpMask、MultiPathNet
- 1分钟了解协同过滤,pm都懂了
- 快速幂算法(矩阵快速幂还不是很会。。日后会更新)
- 从 LinkedIn 的数据处理机制学习数据架构
- game design原理系列学习笔记(四)
- 黑苹果声卡驱动成功后声音出现卡顿的解决办法
- 2020年内蒙古自治区第十五届大学生程序设计竞赛榜单
- python实现两个word文档对比
- java重载和重写的区别_Java重载和重写的区别
- 【RT-Thread Master】at24cxx软件包使用笔记
- 同事通过接私活年入60W,他常用19个私活平台汇总!
- Swagger设置密码登录
- Python写的简单雷电小游戏
- 重庆市计算机专业高考试题,职业高中高考计算机专业试卷4
- Vue2.0开发之——webpack基础-打包发布项目(10)
- Matlab使用符号对象求二元函数积分并做图
- 拉格朗日启发式算法matlab,基于时间满意的最大覆盖选址问题
热门文章
- Excel2016设置目录页不包含页码
- 可下载全球历史卫星,无偏移、高精度-谷歌地球卫片
- Python实战——斗图网爬虫
- Windows Sockets Error Codes
- 琪露诺学习Vue.js的第二天
- 目标检测中的样本不平衡处理方法——OHEM, Focal Loss, GHM, PISA
- 使用docker搭建JIRA服务器,破解JIRA服务器、破解JIRA收费插件
- chrome android f12,chrome浏览器调试手机网站【原创】
- 高中计算机学考vb,浙江省高中信息技术选考加试题VB专项练习题一及答案
- 罗技无线键鼠套装更换鼠标的配对方法