原文:http://tech.ddvip.com/2013-02/1359996528190113.html

Unity3D 游戏引擎之游戏架构脚本该如何来写

 

2013-02-05 00:48:48     发表评论

 

这篇文章MOMO主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难。这篇文章的目的是让哪些已经上手Unity3D游戏引擎的朋友学会如何更好的写游戏脚本,当然本文这紧紧是我这么多年对游戏开发的认知,你也可以有你自己的看法。首先我们看看游戏主要是由哪几部分组成的,如下图所示,任何平台下的任何游戏核心都是由:数据、逻辑、渲染三大部分组成。

当你写过》=2个平台下的游戏时你会发现其实游戏开发很“容易”,为什么“容易”呢?因为此时你会发现所有平台下开发游戏的模式,如下图中的“数据”与“逻辑”两部分真的是完全一样的,这两部分是与游戏开发平台无关的。然而真正与游戏平台有关的紧紧是“渲染”这部分,因为各个游戏平台下的渲染接口是不同的。这也就印证了一点,能把J2ME游戏写好的程序员就必然能把IOS或Android游戏同样的写好。读到这里请结合一下你的公司情况,你可能会发现在你的技术总监两三天就能上手Unity3D游戏开发 Cocos2d游戏开发,这并不是他对游戏平台研究的透彻,而是他对游戏数据的掌控能力非常强,所以能很快玩转各个平台下的开发。

如下图所示,Unity3D这套游戏引擎在游戏开发中的权重如图中所示。其中包含100%的渲染部分 +50%左右的逻辑部分。(因为Unity3D封装了很多与逻辑相关的API供开发者使用)

下面我们回到Unity3D脚本架构的编写上,我们知道Unity3D在是可以创建游戏场景的,在每个游戏场景中又可以创建游戏对象,把每个场景的游戏对象融合在一起就是一款3D游戏。游戏场景之间属于同等级的关系,为了让游戏场景之前交互我们需要有一个凌驾所有场景之上的脚本,我称之为“全局脚本”。如下图所示,所有场景都能与这个唯一的全局脚本进行交互。举个例子,当场景切换时可将临时逻辑数据写入全局脚本中,切换完毕后再去全局脚本中取之前保存的数据,从而实现交互。(当然还有别的办法也能实现这个效果,但是我觉得这样做会更好一些,数据会更安全一些)

接着我们就进入场景中,游戏场景是由若干游戏对象组成,下面我好好说一说游戏对象。游戏对象是需要绑定游戏脚本才能完成它的生命周期。那么脚本的使命就会尤其的重要。因为游戏对象比较多那么脚本必然会出现交互的情况,如下图所示,很多初期Unity3D的项目中的脚本会编写成这个样子。错综复杂相互交互,这样编写的脚本有可能你的游戏能做出来,可是你在维护的时候团队开发的时候你会发现你的脚本非常的混乱,别的同事想改都不知道怎么改。(显然这样的作法时完全错误的)

我们想想为什么脚本之间要交互,原因很简单。是因为脚本中需要使用/调用另一条脚本或者另一条脚本对应的游戏对象某一项数据/方法,为了解决这个问题而导致最终的脚本非常混乱。为了避免这个问题,我在开发中会这么做,如下图所示,脚本之间切记不要做直接的相互交互,脚本之间只做间接的交互。每一个游戏场景都有一个凌驾所有游戏对象之上的单例脚本,在这条脚本中保存场景中所有脚本的公共数据。包括该场景的整体逻辑更新都是在这条单例脚本中完成。每条脚本都只与这个单例脚本做交互,和别的脚本一概不交互。(间接交互)

编写脚本时请注意,脚本只干属于自己最重要的事情,就跟代码中的函数一样,只干最重要的事情。切记和该条脚本无关的事情不要去管,不要在脚本中做过多的相互连带工作,让所有连带工作的话都放在全局单例脚本中来做。

这里我们举一个例子,主角砍怪或技能攻击怪,怪物受伤只到怪死亡以后屏幕播放一段胜利动画。

1.主角对象发动攻击,全局单例脚本接受按键事件后通知主角脚本播放攻击动画。

2.敌人对象接受到主角发送攻击消息时开始播放受伤动画,敌人脚本接收到主角的碰撞时询问单例脚本 主角是“普通攻击、还是技能攻击”,接着敌人播放对应的受伤动画,根据攻击类型敌人对象开始减血。

3.重复上面的操作,当敌人的血量《=0的时。敌人销毁自身对象,并且敌人脚本告诉单例脚本自己已经死亡。此时,单例脚本在调用“胜利动画”对象播放胜利动画效果。

上述逻辑我是完全按照刚刚图片中所说明的方式来写,这样做就可以很好的避免交互交互混乱的情况,其实开发中的所有类似这种交互的情况都能很好的用这个全局单例脚本来解决。希望广大Unity3D开发爱好者可以和我讨论,因为我知道架构设计没有最好只有更好。嚯嚯!!

 
来源: 雨松MOMO   作者:xuanyusong  

【转载】U3D 游戏引擎之游戏架构脚本该如何来写的更多相关文章

  1. U3D 游戏引擎之游戏架构脚本该如何来写

    这篇文章MOMO主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难.这篇文章的目的是让哪些已经上手Unity3D游戏引 ...

  2. Unity3D之游戏架构脚本该如何来写

    这篇文章主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难.这篇文章的目的是让哪些已经上手Unity3D游戏引擎的朋友 ...

  3. Unity3D之游戏架构脚本该如何来写(转)

    这篇文章主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难.这篇文章的目的是让哪些已经上手Unity3D游戏引擎的朋友 ...

  4. (转)Unity3D研究院之游戏架构脚本该如何来写(三十九)

     这篇文章MOMO主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难.这篇文章的目的是让哪些已经上手Unity3D游戏 ...

  5. 游戏引擎架构 (Jason Gregory 著)

    第一部分 基础 第1章 导论 (已看) 第2章 专业工具 (已看) 第3章 游戏软件工程基础 (已看) 第4章 游戏所需的三维数学 (已看) 第二部分 低阶引擎系统 第5章 游戏支持系统 (已看) 第 ...

  6. Genesis-3D开源游戏引擎简介!

    Genesis-3D由搜狐畅游公司超百人引擎研发团队历时数年耗费巨资自主研发,是国内外首款商业开源的3D游戏引擎平台.它包括跨平台渲染引擎.2D引擎.物理引擎.音效系统.粒子系统.动画系统.服务器引擎 ...

  7. [Unity2D]游戏引擎介绍

    由于手机游戏的流行,目前2D游戏开发的需求量也越来越大了,因此Unity3D游戏引擎也增加了2D游戏开发的支持,之前是可以通过第三方的2D游戏组件可以支持2D游戏开发,现在是官方的版本就支持了.Uni ...

  8. 第1部分: 游戏引擎介绍, 渲染和构造3D世界

    原文作者:Jake Simpson译者: 向海Email:GameWorldChina@myway.com ---------------------------------------------- ...

  9. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程08:虚拟键盘实现》--本系列完结

    8.虚拟键盘实现 概述: 硬键盘就是物理键盘,平时敲的那种.软键盘是虚拟的键盘,不是在键盘上,而是在"屏幕"上.虚拟按键就是虚拟键盘的一部分,根据功能需求,提供部分按键效果的UI可 ...

随机推荐

  1. T1191 数轴染色 codevs

    http://codevs.cn/problem/1191/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descr ...

  2. [Code Plus#4] 最短路

    题目背景 在北纬 91° ,有一个神奇的国度,叫做企鹅国.这里的企鹅也有自己发达的文明,称为企鹅文明.因为企鹅只有黑白两种颜色,所以他们的数学也是以二进制为基础发展的. 比如早在 1110100111 ...

  3. mongDB的常用操作总结

    目录 常用查询: 查询一条数据 查询子元素集合:image.id gte: 大于等于,lte小于等于... 查询字段不存在的数据not 查询数量: 常用更新 更新第一条数据的一个字段: 更新一条数据的 ...

  4. 网络安全(超级详细)零基础带你一步一步走进缓冲区溢出漏洞和shellcode编写!

    零基础带你走进缓冲区溢出,编写shellcode. 写在前面的话:本人是以一个零基础者角度来带着大家去理解缓冲区溢出漏洞,当然如果你是开发者更好. 注:如果有转载请注明出处!创作不易.谢谢合作. 0. ...

  5. IO流(1)-键盘录入学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低存入文本文件

    1.先写一个Student类 public class Student { private String name; private int chinese; private int math; pr ...

  6. [Javascript] Use a custom sort function on an Array in Javascript

    Sorting in Javascript with sort uses lexical sorting by default, which means it will sort in alphabe ...

  7. linux nc,nmap,telnet ,natstat命令

    说明 在服务器运维中 通常需要知道 机器端口状态 是否开启 是否被防火墙拦截等.今天我们介绍这三个命令 用来检测端口. nc 命令 / TCP # 安装 yum install -y nc nc 命令 ...

  8. C# - CLR

     The Common Language Runtime (CLR), the virtual-machine component of Microsoft's .NET framework, m ...

  9. C#json数据的序列化和反序列化(将数据转换为对象或对象集合)

    引用 System.Runtime.Serialization.Json

  10. HDU 1248 寒冰王座 (水题的N种做法!)(含完全背包)

    寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...