IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity 框架开发搭建学习 2021 (2) 模块入口 -> 正文阅读

[游戏开发]Unity 框架开发搭建学习 2021 (2) 模块入口

模块基类

因为我们不使用单例来作为模块的唯一性,使用全局管理得模块入口来管理模块。

模块特点 :

1.和单例一样,使用该模块得时候才会被创建,且具有唯一性。

2.模块之间存在优先级,优先级高的,优先轮序。Priority该值越小 优先级越高

public abstract class BubbleFrameModel
    {
        /// <summary>
        /// 优先级 根据这个值来 优先轮序
        /// </summary>
        internal virtual int Priority => 0;

        /// <summary>
        /// update 更新
        /// </summary>
        /// <param name="dt"></param>
        internal virtual void DoUpdate(float dt)
        {
            
        }

    }

模块管理入口((类名)BubbleFrameEntry)

? ? ? ?在管理类里,由于我们存在模块之间得优先级,在创建模块时,需要对模块进行一个排序,在获取模块时,需要对模块进行一个优先级由高到低的顺序遍历。

? ? ? ?所以我们用链表来储存模块。链表的做法可以参考网上,有很多教程。使用链表的优势有很多,首当其冲的就是插入和删除便捷,其次就是开始无需給定长度,长度可动态增长和减少。也非常适用于我们的优先级从高到低的顺序查找。

获取对应模块 (方法名(GetModel))

/// <summary>
    /// 获取模块
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <returns></returns>
    public static T GetModel<T>() where T : BubbleFrameModel
    {
        Type type = typeof(T);
        
        if (type.IsAbstract)
        {
            throw new GameException($"{type} is invalid");
        }

        foreach (var model in GameModels)
        {
            if (model.GetType()==type)
            {
                return model as T;
            }
        }
        return CreateModel(type) as T;
    }

? ? ? ?当外部需要使用该模块的功能时,需要在模块入口内获取该模块,如果该类型时抽象类,说明调用类不对,否则就遍历该模块链表返回对应的模块。

创建对应模块 (方法名(CreateModelByType))

? ? ? ? 如果链表内不存在该模块,需要创建该模块。

 public BubbleFrameModel CreateModelByType(Type type)
        {
            BubbleFrameModel instance = (BubbleFrameModel) Activator.CreateInstance(type);
            LinkedListNode<BubbleFrameModel> current = GameModels.First;
            LinkedListNode<BubbleFrameModel> beforeNode = null;
        
            while (current!=null)
            {
                if (current.Value.Priority > instance.Priority)
                {
                    beforeNode = current;
                    break;
                }
                current = current.Next;
            }

            if (beforeNode!=null)
            {
                GameModels.AddBefore(beforeNode, instance);
            }
            else
            {
                GameModels.AddLast(instance);
            }

            Idle = true;
            return instance;
        }
    }

? ? ? ? 代码很简单,当模块链表里不存在这个这个模块的实例对象,说明是首次使用该模块,这个时候需要把模块动态创建?? ,使用反射创建该类型的实例,接着就是正常的遍历模块链表,判断下一个节点的Priority是否大于当前模块的Priority,大于则插入,不存在这类节点就插入链表的尾节点。

调整:

这样可能会延伸出一个问题,当俩个进程重复调用静态方法时,静态方法只会执行一次,所以在这创建一个创建模块的进程类,当这个进程类中正在创建模块时,我们重新创建一个构建模块类。

? ? ? ? 当存在空闲状态的进程类时,则使用这个进程类创建对象,如果没有该进程类,则创建一个空闲状态的进程类,创建模块对象。

构建模块类时,使用反射创建模块对象,插入到优先级队列中,将自己的构建模块类的状态变成空闲状态,便于下个模块类调用。

?

这样就完成了模块的入口,没有使用单例模式,使用反射机制创建需要的各模块对象。?

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-08-19 12:23:28  更:2021-08-19 12:24:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 9:01:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码