通过LandlordsCore 学习ET框架

ET框架学习笔记

请大家关注一下我的微博 @NormanLin_BadPixel坏像素

LandlordsCore

LandlordsCore是ET交流群里的一位大佬用ET框架写的一个联机斗地主的小demo。
这里通过详读源码来学习ET框架。因为是从零开始学习,所以会很繁琐。如果看到已经知道的知识点,请跳过。

准备

去百度一下游戏服务端,了解一下基础的知识。

ET框架Git地址

LandlordsCore例子Git地址

MongoDB下载地址(顺便了解一下MongoDB)

不多说了,直接看代码。

希望大家在看此系列学习笔记的时候,身边能够有源码,因为如果所有的代码我都帖上来的话,文章会太长太乱。

一行一行来

从工程资源窗口来看,整个工程的入口是Init脚本。让我们进去瞅瞅。

Init

这是继承MonoBehaviour的一个组件。

public static Init Instance;

第一个变量是静态的Init Instance。有经验的人都知道,这是单例的写法。不过这个写法不是很安全,如果你不小心在两个地方挂了这个脚本,那就会有两个实例了。不过,这是操作可以避免的,不管了。

public ILRuntime.Runtime.Enviorment.AppDomain AppDomain;

这啥? 看不懂。百度一下ILRuntime是什么东西。发现是跟热更新有关的东西。大概跟Lua类似吧。我们暂且把它理解为一个运行ILRuntime代码的域吧。

private IStaticMethod start;

后面的update,lateUpdate,onApplicationQuit都是IstaticMethod变量。从字面意思来看,应该是一个继承了静态函数接口的类(一般I开头的都是接口)。我们进去看看。

IStaticMethod

很短,我就全部贴出来了。

public abstract class IStaticMethod
    {
        public abstract void Run();
        public abstract void Run(object a);
        public abstract void Run(object a, object b);
        public abstract void Run(object a, object b, object c);
    }

原来不是我想的那样,只是一个有着0-3个参数的Run方法的抽象类。我们知道抽象类是不能直接实例化的,所以这些变量在后面肯定是通过其子类实例化的。不急,我们回到Init继续看下去。

Init

直接就是Start方法了。我们知道Start是在Awake方法之后的,我们先去确认一下有没有后Awake方法。没有,那在这里第一运行的就是Start方法了。

判断unity版本的,不讲。 在切换场景时不自动销毁这个物体,不讲。单例的赋值,不讲。

ObjectEvents.Instance.Add(“Model”, typeof(Init).Assembly);

哼,又是啥。我们去看看ObjectEvents这个类到底是干什么的。从这个调用方法来看,应该是又是一个单例。字面上的意思貌似是跟事件相关的。

ObjectEvents

哦,贼鸡儿长,我们分个P。
ObjectEvents学习笔记

Init

看到这里默认大家学完ObjectEvents了。所以上面那句代码

ObjectEvents.Instance.Add("Model", typeof(Init).Assembly);

就是把整个“Model”程序集里面标识了ObjectEvent的类里面需要监听的事件全部都注册到ObjectEvents里面去统一管理。这里只是注册,并没有触发任何的事件。

后面是一些热更新的代码,此教程不讲热更新,跳过。

Game.Scene.AddComponent<OpcodeTypeComponent>();

看起来跟GameObject.AddComponent很像,但是仔细一看,全都是作者自己写的新东西。好,这一段从头开始看。

Game

private static Scene scene;

不用说了,直接去Scene看一下。

Scene :Entity

public string Name { get; set; }

一条名字的变量

什么都不说,去看基类

Entity

呵呵,又这么长,咋们再分个P吧。Entity学习笔记


好的,我们从Entity哪里学习回来了。
继续回来看Game

Game

很好,这些都很容易看懂,AddComponent什么的,我们都学过了。

接下来,就是对各种Component的熟悉了。我们可以看到,无论是在这里对Scene的初始化,还是在Init里面,都出现了许多的Component,我们知道,Component才决定了每个实体都有什么具体的功能,这里,我们就对这些Component进行学习。我想,当我们看了两三个Component之后,就能知道Component具体是要怎么写的,就能写出自己的Component了。就像我们刚开始学习Unity的时候,也是先去读Unity的Api,知道组件的写法、用法,才逐渐开始写属于自己的逻辑。心急吃不了热豆腐,我们一步一个脚印,慢慢来。
Landlords的Component学习

从Component学习回来,我们知道Game里面存放了一个静态Scene变量scene,并且上面添加了EventComponent和TimerComponent组件。就是这么简单。

Game看完了,我们回到Init。

Init

HolyShit,我们还是继续我们的Landlords的Component学习,实在是有太多组件了。
我们看到,在加载了大量基础功能的组件后,我们开始下载资源了。

await BundleHelper.DownloadBundle();

BundleHelper

public static async Task DownloadBundle()
{
    Game.EventSystem.Run(EventIdType.LoadingBegin);
    await StartDownLoadResources();
    Game.EventSystem.Run(EventIdType.LoadingFinish);
}

我们看到,这里我们先Trigger了EventSystemLoadingBegin事件,这个时候,注册了该事件的方法会被执行。比如显示正在加载的UI界面等。(当然要我们先注册好的。咋注册的?在添加EventSystem组件的时候就注册了,还不明白的回去复习。)之后,就是异步开始加载资源了。

public static async Task StartDownLoadResources()
{
    if (Define.IsAsync)
    {
        try
        {
            using (BundleDownloaderComponent bundleDownloaderComponent = Game.Scene.AddComponent<BundleDownloaderComponent>())
            {
                await bundleDownloaderComponent.StartAsync();
            }
            Game.Scene.GetComponent<ResourcesComponent>().LoadOneBundle("StreamingAssets");
            ResourcesComponent.AssetBundleManifestObject = Game.Scene.GetComponent<ResourcesComponent>().GetAsset<AssetBundleManifest>("StreamingAssets", "AssetBundleManifest");
        }
        catch (Exception e)
        {
            Log.Error(e.ToString());
        }

    }
}

BundleDownloaderComponent学习笔记
我们通过BundleDownloaderComponent下载了所有需要更新的热更新资源。并加载了”StreamingAssets”bundle。关于该Demo的打包工具,将会是一个大工程。以后我们讲讲。

Init

Game.Hotfix.LoadHotfixAssembly();

之后便是热更的内容。我们会在之后开一个热更相关的学习笔记。现在先略过。

2018/4.6 别略过了,再不看就进行不下去了。HotFix

// 加载配置
Game.Scene.GetComponent<ResourcesComponent>().LoadBundle("config.unity3d");
Game.Scene.AddComponent<ConfigComponent>();
Game.Scene.GetComponent<ResourcesComponent>().UnloadBundle("config.unity3d");

这段很简单,先加载配置文件的信息,然后根据信息对游戏进行配置,配置完后卸载配置文件。ConfigComponent学习笔记

再往下看,我发现再不去看HotFix部分的代码就看不下去了。

躲得过初一躲不过十五,大家随我一起去看看HotFix吧。

还在更新ing……

猜你喜欢

转载自blog.csdn.net/norman_lin/article/details/79706300
今日推荐