• Stars
    star
    270
  • Rank 152,189 (Top 3 %)
  • Language
    C#
  • License
    Other
  • Created almost 9 years ago
  • Updated 4 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

基于unity3d引擎与c#语言的游戏框架/架构(包括客户端与服务器)。使用ServerPlatform作为服务端通信基础设施。

CSharpGameFramework

一个极简的基于unity3d引擎与c#语言的游戏框架/架构(包括客户端与服务器)。本工程使用ServerPlatform作为服务端基础通信设施。

现代计算机硬件与系统软件采用分层虚拟机的方式很好的实现了松散耦合并保证功能完备。受此启发,我在想是否也能采用分层虚拟机的样式来实现游戏框架,框架部分就像操作系统内核,游戏具体逻辑就像操作系统的其他部分,在内核提供的机制上运作起来。然后内核是可以与其他部分完全隔离开来的。

想要实现完全隔离,计算机硬件与软件是一个实例,任何时候都可以把硬件上的软件部分完全抹去后重装。从这个角度看,除了逻辑上的松散耦合外,还需要一种部署上的区分来保证隔离,就像硬件一样,这部分提供的是运行环境,与在环境里运行的软件有明显的区分。

硬件提供给软件的是指令集,从这个角度理解虚拟机,我们可以看到支持脚本的软件系统,软件系统与脚本的关系就像硬件与软件的关系一样。系统提供了运行环境,而脚本在环境里运行,二者有明显的区分。我们也可以像重装系统一样,在不改变软件系统的情况下,抹去整个脚本后再重新安装。

就像现代软件系统并不会直接使用机器指令来编写一样,每一级分层虚拟机对下一层必须提供能支持更好的抽象或更贴近使用者习惯的工具语言。我们用C#来实现游戏框架,如果使用lua或类似的脚本语言来实现游戏逻辑,虽然也实现了松散耦合与完全隔离,由于通用脚本与编译类语言提供的是同样的抽象级别,这就像只能用硬件指令编写软件一样,显然不是比较好的方式(而且脚本语言通常较编译语言更难进行模块组织、错误检查与调试以及更低的运行性能)。所以我考虑用DSL作为这一层虚拟机提供给游戏逻辑的工具语言。

DSL是我个人从事软件开发以来逐渐演化出的一种通用元语言语法,也就是说只有基础语法是确定的,具体语法与语义由DSL作为元语言在具体应用时再定义,所以,这个游戏框架也是在尝试形成一种适合游戏逻辑开发的语言(语法稍稍受限于DSL的元语言语法,语义完全由游戏框架实现)。

另外一面,我在想尝试在策划层面提供尽可能少的机制来实现一个游戏,这可能只是一个不切实际的梦。不过当我反复看过我自己主导程序设计与开发的几个游戏项目后,我执着的认为这个方向或许是有希望的。因为我看到太多系统层面的不协调与冲突,以及大量的重复。即便我想像的尽可能少的游戏机制的集合最后证明是过于理想了,这个过程也应该会给程序与策划交叉的领域带来一些思考吧。

不管怎样,一个优秀的软件系统(程序层面)应该有一个优美的体系,一个优秀的游戏系统(策划层面)也应该是这样,就像数学与物理一样,简单、优雅并且广泛适用。

[windows平台用法]

1、buildall.bat是编译client与server端的批处理(调用2与3),但不包括slua与cs2lua

2、buildclient.bat编译client,不包括slua与cs2lua,编译完成会拷贝相关文件到unity3d工程相应目录

3、buildserver.bat编译server,编译完成会拷贝相关文件到server端运行环境目录(App/ServerModule/ServerEnv)

4、buildslua.bat,运行前需要关闭unity3d编辑器,这个批处理应该在buildclient.bat后执行,它会调用unity3d来生成lua api代码,然后编译SluaExport工程并拷贝相关文件到unity3d工程相应目录

5、RunServer.cmd是启动服务器的批处理

6、StopServer.cmd是关闭服务器的批处理,其实就是kill掉服务器各进程

7、copyroomdlls.bat是单独拷贝room server的exe/dll的批处理,一般用于room server开发时

8、copyserverdlls.bat是单独拷贝各server的exe/dll的批处理,包括lobby、user server、room server与data cache服务器,主要用在开发服务端功能时

9、cs2lua.bat翻译Cs2LuaScript.csproj到lua代码,并拷贝文件到unity3d工程相应目录,同时会将工程的文件调整为lua与动态dll加载的模式(仅mono下可以使用动态加载,目前仅用于windows下的测试)

10、cs2luanative.bat翻译Cs2LuaScript.csproj到lua代码,并拷贝文件到unity3d工程相应目录,同时会将工程的文件调整为使用csharp dll的状态(这个是il2cpp模式下的用法,默认不启用lua,后续计划是前端功能组织成组件式,组件间仅通过预定的接口通信,无其他直接依赖,这样就可以实现某个组件运行时可替换为lua实现,思路上就是类似微软com组件的这类二进制组件机制)

11、dslcopy.bat处理dsl与表格文件,并拷贝到server端与unity3d工程的相应目录,一般用于仅修改dsl或表格文件时

12、generate_file_list.bat用于生成unity3d工程的streamingassets目录下的文件的列表文件list.txt,这个文件用于安卓与iOS上记录打包的散文件列表,开发中一般用不着