找回密码
 立即注册
楼主: Unity联盟

unity开发工作流程?

[复制链接]
发表于 2020-11-23 19:22 | 显示全部楼层
    IDE:如果你可以用 Visual Studio,那就一定不要用 Mono Develop 了。虽然作为开源 IDE,MD 已经算是很不错了,但是相比 VS 实在无法企及(尤其是有 Visual Assist、Code Maiden、Unity VS 等插件的情况下)。我印象中,即便是最基本的自动完成功能,代码规模稍大,在 Mono Develop 里就卡得很。另外,如果你的项目代码里还有 UnityScript,那……赶紧转 C# 吧!
    版本控制:策划可以用 SVN 或者其他版本控制工具。程序这边用 git(不会可以学嘛~又不要精通)。我由于一开始就接触 git,没有机会大量使用 svn,所以不好评价 git 和 svn 的优劣。但是 git 本身,即使只用命令行(如果你在 Windows 上开发可以用 git bash),也相当好用了。服务器:服务器端我们现在用 Scut。主要优点是和前端一样使用 C#,很多时候工程师可以同时写前端和后端的代码。主要缺点是,Scut 的设计貌似同时兼顾了长连接和短连接,结果对于长连接的支持不是很好。个人对后端懂得少,希望有牛人出来评价。另外还有一个听说不错的 Python 服务器框架,叫做 Firefly Game Server Framework,也可以试试。网络通信:我个人经历过的项目,使用长连接则对 C# 自带的 Socket 库做简单封装,使用短连接则直接使用 WWW 类(虽然这个类接口感觉设计得不好,但还是能用的)。
另外,楼上答主周华 (@ 不对不好意思) 说得在理。插件完全看项目类型,不妨多在 Unity Asset Store 里和论坛上看一看,挑选一下。
发表于 2020-11-23 19:23 | 显示全部楼层
Unity开发游戏过程中处理框架是一个非常复杂的过程,下面主要讲下unity游戏开发过程中本人对框架的处理方法。
管理器
      在任何游戏里,管理器(单例)都占了很大一部分。我怀疑能否在制作游戏时候一个都不用或者只用一个管理器。的确,Unity很明显有更加清晰的方式来使用单例。这样来看就简单多了,但是我喜欢在写一些场景中不存在的管理器,虽然在其他东西的外面但是仍然会接收重要的诸如更新等功能的事件。
   我最终就是要为单例写一个模版基类。它会追踪静态实例,调用DontDestroyOnLoad等。在获得实例的时候,它实际在后面做了如下的很多事情。
1.   尽量只返回实例
2.   尽量用FindObjectOfType来找到场景中的单例。
3.   使用对应类型名字的Resources.load来找到预制品。我是在AudioContoller上使用这种方式,因为我需要一个提前配置值的预制品。
4.   最后如果失败,就创建一个新的游戏对象,然后添加组件。
网络
最大的优点在于它有一个统一的网络结构。网络是紧密结合到脚本引擎中的,那样程序员就可以像编写单播放器脚本一样编写多播放器脚本,而不需要额外工作。
Unity的网络API工作起来不怎么如人意。虽然增加或者删除一个网络视图不会对游戏脚本产生影响,但是当存在单播放器和多播放器时,RPC和对象实例化就很难应付了。
我的解决方案就是写一个网络管理器来实现很多有用的功能:
·         通过名字或者索引加载等级。当网络工作时,会自动咱提网络队列的处理,当等级加载完毕后就可以通过固定一个回调函数
·         实例化对象。如果断开,就使用通常先前的GameObject.Instantiate函数,否则就用NetWork.Instantiate来实例化对象。
·         消除对象。如果断开,就使用GameObject.Destroy,否则使用Network.Destroy。
另外还需要为所有组件创建一个基类-GameBehavior。此类有封装了一个关于networkView.RPC的封装器,用来在没连上服务器时控制RPC。另外内置支持组件缓存和多态支持。
     关于网络最后一点:另外需要写几个类来封装网络特性。它们是:NetFloatProperty,NetVector2Property,NetVector3Property,NetVector4Property。每个类都可以从OnSerializeView读取位流和调用netFloatWrapper.Add,然后在更新中可以调用netFloatWrapper.GetValue()来自动篡改进入的数据包。
音频
     Unity在音频上还是比较弱的,因此别被主页上的广告忽悠了。可以说Unity的音频脚本系统知识个骨架。基本上99.999%的游戏都需要音频通道或者音频组系统。包括音乐,声音,音效以及气氛乐等给定声音。但是Unity却没有此概念。根据以前有限的使用XNA的XACT工具我可以说在提示跟摘录的声音之间添加一个抽象层是很有必要的。当枪响时就可以播放枪响的提示。提示本身可以能有多种不同设置,例如音量,是否循环,是否随机截取或者按照固定顺序步进。它包括大量音效截取,每个部分都包括音效和相关设置。
知道上面的知识后,我准备使用类似概念来编写自己的音频系统。我的AudioController有大量AudioCategory。每个AudioCatego都有大量AudioItem。而每个AudioItem又有大量SubItem。因此如果我想播放SFX目录里一个名为“Gunshot”的AudioItem,我可以如下调用:
AudioController.PlaySound( "SFX.Gunshot" ); //播放音效,自动回到起始处。
AudioController.PlaySound( "SFX.Gunshot", transform ); //从给定的转换通道播放音效,会根据通道运行。
AudioController.PlaySound( "SFX.Gunshot", transform.position ); //从特定位置播放音效,而不是从特定位置移动。
另外如果我想播放一首Music目录下的歌曲,我可以调用PlayMusic(“”)。歌曲也可能会有多个不同通道。如果音乐已经在播放,PlayMusic会自动继续播放。
对于结果我感觉很满意,当然需要设计更加友好并且高效。
输入
不要误解哦,我是喜欢Unity的输入系统的。但是还是有很多需要改进的地方。对新手来说不可能用默认系统来配置游戏的输入。另一个问题就是很多设备没法充分利用输入系统。例如在移动设备上,需要自己编写基于触屏的输入系统,因为Unity对于触屏API的支持还不是很多。
而我要做的就是写一个Gamepad类来提供标准的GetAxis/GetButton等映射Unity输入的功能。同时也提供了一个输入接口来便于编写嵌入的输入层。现在可以写一个用于测试的Unity输入层,主要面向移动游戏的输入层。当然如果面向OUYA,也可以为OUYA开发者写一个输入层工具。可以写一个用于插口的输入出来方便配置输入,我的代码都是调用,没必要知道所有东西。直接通过Gamepad.GetAxis(“MoveX”)调用即可。
此外又添加了一个简单但是很有帮助的功能:Gamepad.LockInput。平时基本都设置LockInput为true,这样所有输入都被锁定。例如,如果有一个多播放器游戏,播放器弹出菜单,此时无需暂停游戏,也无需让玩家在菜单弹出时还继续玩游戏。因此可以见到将LockInput设为true这样播放器自动回在特定位置固定。
游戏保存

我以前没接触过有游戏保存功能的游戏。但我觉得我需要一个,并且Untiy也没有此功能,因此可以为游戏本身写一个简单的游戏保存功能。
主要想法:如果设置这样的限制:所有需要保存的东西都保存在一个资源文件夹内,那就可以在加载游戏的时候简单的保存原来的内容路径,然后初始化尼尔并还原到原来的状态。
此时需要创建一个ISaveable接口,此接口有两个功能:保存和加载。当保存游戏时,会遍历所有实现ISaveable的类来查看所有游戏对象。这些内容都保存在一个独立的列表中。对象序列化如下:
加载等级ID
序列化游戏对象数量
[每个游戏对象]
内容路径
位置
循环
大小
ISerializable组件数量
[每个ISerializable]
GetType().Name
ISerializable.Save(Stream)
这样在加载保存的游戏时,通过Resource.Load加载等级和每个物体的实例化,设置位置、循环、大小,然后用GetCompone(保存名字)获得每个ISerializable数据,强制转为ISerializable,最后调用ISerializable的Load函数即可。
将上述都封装在SaveManager类的多个功能函数里,每个函数功能如下:
GetSaveSlots() //获取当前保存的游戏文件,可以直接传给LoadGame,并保存在PlayerPrefs里。
SaveGame(SaveID) //将游戏保存到特定槽内。如果文件已经存在,将会重写,否则会新建一个。
LoadGame(SaveID) //从特定保存槽加载游戏。
DeleteGame(SaveID) //删除给定的保存槽,文件和入口都会从PlayerRefs清除。
但是需要注意在Web播放器上是不会工作的,因为Web上需要大量使用诸如文件流等IO函数,但目前为止,在其他平台还是可以的。
发表于 2020-11-23 19:23 | 显示全部楼层
ide:vs  推荐2015     功能全,各种好用反正就是    10、13都用过,还是15好用一点,mono也可以,不是很难用,毕竟自带的编辑器
版本控制:svn+version Contrl       asset store中有,后面这个主要是用来控制多人编辑场景的
后台:tmd   老子是跟后台干架的,目前JAVA,原来PHP,不非主流即可
插件:你爱用啥就用啥,多得很呢,啥也有,英文好的话可以翻墙去弄,不好的话,就乖乖的看中文的,主流的估计就是NGUI 、ITween这种了,现在unity支持的也很多,NGUI不如UGUI好用,嗯  就这样
发表于 2020-11-23 19:24 | 显示全部楼层
PS:你的描述完全忽略了美术和策划环节。。。

版本管理,如果和美术策划共用,可以使用svn,git虽然程序用很爽,但是不适合美术们。也可以使用perforce。

IDE无疑是vs,如果要开发网游,多半会用到lua,vs有插件babelua。

server端看服务器童鞋的喜好,如果是没有基础的人做,那就尴尬了。

Ai推荐插件 behaviac

如果之前没什么积累,可以试试这个框架ksframework。
KSFramework:Unity3D开发框架快速入门

uwa 和wetest也是不错的网站,可以学到不少优化内容。
发表于 2020-11-23 19:25 | 显示全部楼层
IDE:大部分情况下使用的是Visual Studio,在Windows平台下开发优势还是很明显的
版本控制:公司目前采用的是SVN,不过作为程序员Git还是要学的
服务器:目前公司采用的是网易开源的分布式服务器框架 Pomelo
插件:DOTween(动画插件),T4M(地形制作),TexturePacker(纹理合并),Spine(2D骨骼动画插件),Vision Timer(定时器插件),NGUI
第三方库: Protobuf(Google开源的数据序列化库,前端使用的是protobuf-net),SimpleJson
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-17 12:30 , Processed in 0.070616 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表