任务1:斗地主前后端最终项目结构介绍与起始项目创建

只要c#有接近中级水平就行。网络开发不熟悉,跟着做下去,就会越来越理解和熟悉。另外有些c#的东西还不太熟的,用着用着,也可以变得理解。

如果面向对象还没有基本的理解,内存,变量,实例,运行与编译环境都搞不清楚,就不适合,还要多去打基础。

简单的全局介绍:

 

资源度盘:链接:https://pan.baidu.com/s/1cNFIZDqPSY2x2bHhre3NVw 提取码:25yv

 

这个课程适合希望把自己的游戏加入网络通信功能的游戏开发者,对提高C#语言应用开发能力也有明显的帮助。学习这个课程,需要你基本熟悉Unity引擎内的编辑操作,能自己使用C#语言实现一些功能,对面向对象有一些体会和理解。

你通过前面10章节的尝试,可能不是太理解但是能跟着课程把主线目标实现出来,那也是可以提高你的语言开发能力的,配合课程练习的尝试努力,过一段时间能慢慢明白对象与内存,编译与运行环境,组件开发,并把网络功能加入到自己的项目中去,就能上一个大的台阶。

课程前后端项目的准备:

项目所使用的ETCore是在ET框架5.0版本的基础上演变而来的,所以要求unity2018.3以上的版本,并在电脑上安装.netcore2.2.300以上的版本(建议2.2.300+,3.0以下,不可以跨大版本)。课程教学全程在win10环境下进行,如果你使用的是mac或者linux开发环境,你需要自己解决开发环境的差异带来的问题,建议其它开发环境下使用rider,vs code,搜索一些资料应该不难解决遇到的问题。

如果还没有准备好.netcore开发环境 window下的.netcore环境及Visaul Studio扩展安装

前端项目下的文件:

实际只有Assets,ProjectSettins是你项目本身的文件,其它全部删除,再次打开Unity和从Unity中启动Visaul Studio都能再次自动生成其它文件。所以如果你要分享你的项目,只需要把包含这两个目录的文件上传到Github上就可以了。

Assets目录下:

(关注)Bundles:制作的AssetBundles资源放在这个目录,后面的课程会讲打包输出后从web资源服务器加载bundle资源。

(不关注)Editor:是自定义的一些unity编辑器中使用的一些扩展工具,比如说游戏打包发布等,目前大家不需要关注,也不用动里面的代码。

(核心网络库)ET.Core:是ETCore框架的核心代码库,前后端相同并共用的,如果不学习分支课程内容:框架的核心实现解析,不用尝试修改里面的代码,你们的课程就是学习使用里面提供的常用组件和方法。

(当然关注)Model:是当前游戏项目本身的全部代码,有一些是ET框架仅在前端使用的少量组件,主要是我们自己项目的代码。

(不关注)Plugins:Unity生成的为游戏发布到各平台而准备的插件,暂时不需要关注。

(关注)Res:一些Config文本文件,FairyGUI导入的原始素材

(不关注)Resources:游戏预制体目录,本项目没怎么用到

(关注)Scenes:项目的场景文件

(不关注)ThirdParty:需要用到的第三方C#调用库,mongo,Litjson,Google.Protobuf,FairyGUI

后端项目下的文件:

(关注)App项目:ETCore网格框架的启动项目,里面只有一个Program.cs文件

(关注)HotFix项目:后端的System与Handler代码,是我们项目后端主要的开发阵地,主要是调用ET.Core项目中的组件和类,来使用全部逻辑与同步请求及返回(请求与返回是什么?一边学一边实现慢慢就明白了)

(关注)ET.Core项目:ETCore网络框架的核心组件与类,我们自己项目的功能组件与实体和其它类。

大家可以发现,Entity实体,Component组件都在ET.Core项目中,System系统在Hotfix项目中。这不就是ECS嘛,这就是面向数据,组件式开发的ECS模式,特别适合网络数据同步开发。(暂时不怎么太明白ECS没关系,一边学一边实现慢慢体会)

我们并不会用到热更新,但后端项目结构是这样没有问题,可以把Hotfix当成放System与Handler方法的子项目。

构建斗地主的前端项目:

下面我们就开始斗地主项目的创建与代码编写了,大家应该熟悉如何用unity创建项目,也可以直接下载我提供的起始项目,在这个基础上开始。

Landlords_Client01.zip (31.83MB)

Landlords_Server01.zip (12.73MB)

前端部分通过unity创建了ET.Core,Model两个程序集项目来管理代码,关于unity中创建程序集.asmdef,支线的课时有单独介绍,链接:https://www.taikr.com/course/1053/task/30931/show

Init.cs启动脚本在Model项目中,而Model项目引用了ET.Core项目。ET.Core跟服务端是一样的,其中都引用了第三方库ThirdParty,来方便mongo数据操作和序列化,反序列化操作。

用unity打开项目后,层级面板可以看到如下:

当然你也可以下载ETCore之后完全从0开始创建Landlords_Client01所提供的内容,对创建项目不熟悉的同学完全可以参考我提供的Landlords_Client01项目,一个个创建里面的东西当作小练习。

图中红色箭头所指,就是可以从ETCore直接复制到项目中的东西,而蓝色箭头所指,是我们自己需要创建的目录。

我们的原始素材会导入到Res目录下,要制作的AssetBundle会放在Bundles目录下,要编写的项目代码全部在Taikr.com目录下,项目启动脚本是Init.cs,场景文件在Scenes目录下。

可以看到场景中已经有一个 Camera,EventSystem物体,这是unity创建项目就带有的。创建Global空物体,然后把Camera改名为Stage Camera,把EventSystem物体和Stage Camera这两个拖到 Global物体下。

把Init.cs脚本挂在Global物体上

创建UI空物体,创建一个Canvas,然后把它放在UI物体下面(类似的操作不会多讲,你要自己熟悉)

把ETCore的ReferenceCollector脚本挂到UI物体上,给脚本添加一个Canvas属性,把场景中的Canvas物体拖进去赋值给它。

Resources目录下有一个KV的预制体,先不管它,以后做到资源加载时,就明白了。

到目前为止,就准备好了斗地主的前端项目,并且已经导入了ETCore框架前端需要的内容。

我们打开Init.cs项目起动脚本,编写以下内容,可以运行项目了。

E:\ETCoreLandlords\Landlords_Client02_05\Unity\Assets\Model\Init.cs

复制代码
using System;
using System.Threading;
using UnityEngine;

namespace ETModel
{
    public class Init : MonoBehaviour
    {
        private void Start()
        {
            this.StartAsync().Coroutine();
        }
        
        private async ETVoid StartAsync()
        {
            try
            {
                SynchronizationContext.SetSynchronizationContext(OneThreadSynchronizationContext.Instance);

                DontDestroyOnLoad(gameObject);
                ClientConfigHelper.SetConfigHelper();
                Game.EventSystem.Add(DLLType.Core, typeof(Core).Assembly);
                Game.EventSystem.Add(DLLType.Model, typeof(Init).Assembly);

                Game.Scene.AddComponent<GlobalConfigComponent>(); //web资源服务器设置组件
                Game.Scene.AddComponent<ResourcesComponent>(); //资源加载组件

                //测试输出正确加载了Config所带的信息
                ETModel.Game.Scene.GetComponent<ResourcesComponent>().LoadBundle("config.unity3d");
                Game.Scene.AddComponent<ConfigComponent>();
                ETModel.Game.Scene.GetComponent<ResourcesComponent>().UnloadBundle("config.unity3d");
                UnitConfig unitConfig = (UnitConfig)Game.Scene.GetComponent<ConfigComponent>().Get(typeof(UnitConfig), 1001);
                Log.Debug($"config {JsonHelper.ToJson(unitConfig)}");

            }
            catch (Exception e)
            {
                Log.Error(e);
            }
        }

        private void Update()
        {
            OneThreadSynchronizationContext.Instance.Update();
            Game.EventSystem.Update();
        }

        private void LateUpdate()
        {
            Game.EventSystem.LateUpdate();
        }

        private void OnApplicationQuit()
        {
            Game.Close();
        }
    }
}
复制代码

ET使用了Map,Hidden两个Layer,请在项目设置中加上,不然会有layer报错。

运行后我们可以看到输出面板已经输出了Config所带的配置信息。

构建斗地主的后端项目:

有不少前端开发的同学还不熟悉服务端,也不太熟悉Visaul studio的解决方案sln和同一个解决方案中多个项目csproj 的管理。我们可以先用起来,只要知道斗地主的项目服务端有一个解决方案Server.sln,用vs打开这个解决文案后,会加载里面9个csproj项目。

最主要就是App.csproj,Hotfix.csproj,Model.csproj,其中启动项目是App,而App与Hotfix项目都引用了Model项目。我们只需要在Hotfix,Model项目里相应的目录中写代码,然后编译运行起动项目就行了。大家可以下载我上面提供的 Landlords_Server01,在这个基础上开始编写。

用vs打开解决方案,等十几秒或者几分钟,项目完成包还原后,就可以先单独编译一下Hotfix项目(以后每次添加,修改这里的代码,都要单独重新编译一下Hotfix项目),然后直接点上面的启动运行,即可让服务端运行起来。我们开发都是在本地测试,所以直接vs打开这个项目,启动运行后,就可以在unity里测试访问服务器。

编译通过的话,运行后会有服务启动的提示:

### 在window下,需要安装.netframework,.netcore 。而mac,Linux下的安装需要自己去搜索一下了。window下的环境安装指南,链接:https://www.taikr.com/course/1053/task/30933/show

如果你安装了多个.netcore版本,会默认运行最高版本。出现SDK版本不兼容时,可以指定项目运行指定版本 https://www.taikr.com/course/1053/task/30937/show

到这里为止,我们就做好了斗地主项目前后端项目的准备了,我们通过一个方法的请求,来测试下前后端的简单通信。

我们在Init.cs 中增加下面代码,即可向服务端发送一条文本消息,并得到返回消息。

//添加指令与网络组件
Game.Scene.AddComponent<OpcodeTypeComponent>();
Game.Scene.AddComponent<NetOuterComponent>();

//测试发送给服务端一条文本消息
Session session = Game.Scene.GetComponent<NetOuterComponent>().Create(GlobalConfigComponent.Instance.GlobalProto.Address);
G2C_TestMessage g2CTestMessage = (G2C_TestMessage) await session.Call(new C2G_TestMessage() { Info = "==>>服务端的朋友,你好!收到请回答" });

确认服务端运行后,我们在Unity中Play执行后可以看到效果

当然不是写这几行就可以做到的,实际上我们需要分别在前后端定义好这个请求的:
消息指令,消息类型,消息体,还有服务端收到消息后的行为Handler

如果你的服务连接不上原因:

1、你的消息指令前后端不一致,生成消息文件后,要复制前端的到服务端(后面proto生成消息文件课会讲)

2、你前端请求的服务器地址与后端起动的服务地址与端口不一致

你要在前端Tools中设置et服务器地址

或者手动修改这个文件跟用Tools设置是一样的

而服务端的服务起动地址与端口这样设置:

上图只是方便你看,确认地址端口正确后,删除换行

{ "_t" : "StartConfig", "_id" : NumberLong("98547768819754"), "C" : [{ "_t" : "OuterConfig", "Address" : "127.0.0.1:10002", "Address2" : "127.0.0.1:10002" }, { "_t" : "InnerConfig", "Address" : "127.0.0.1:20002" }, { "_t" : "HttpConfig", "Url" : "http://*:8080/", "AppId" : 0, "AppKey" : "", "ManagerSystemUrl" : "" }, { "_t" : "DBConfig", "ConnectionString" : "mongodb://127.0.0.1:27017/", "DBName" : "Landlords01" }], "AppId" : 1, "AppType" : "AllServer", "ServerIP" : "*" }

下面的课时我们就讲讲怎么实现,接下来的课时有:

unity中创建程序集.asmdef管理项目代码

window下的.netcore环境安装

向服务端发送一条文本消息,并得到返回消的实现

 

posted @   Domefy  阅读(378)  评论(1编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示