美文网首页unity3d
Unity手游项目架构设计与开发管理

Unity手游项目架构设计与开发管理

作者: 罗卡恩 | 来源:发表于2019-04-25 08:15 被阅读62次

    https://www.bilibili.com/video/av30482033?from=search&seid=14081717784937497017
    本文为视频的记录知识点 因为视频只有左声道听起来很蛋疼 而且都是英文自己看理解翻译 方便以后回顾

    Unity架构设计的流派

    EmptyGO
    Simple GameManager
    Manger of Managers
    MVCS(StrageloC)
    MVVM(uFrame)
    ....

    EmptyGO

    是一个框架的雏形
    1.Put all the code without visual representation in the world
    onto an empty game pbject
    在一个空的游戏对象上挂 类似于一个脚本管理所有东西

    2.Use GameObject.Find() or inspector target references to communicate with each other
    使用gameobject.find()或inspector目标引用(就是public拖进来)相互沟通
    一旦有预制体 UI界面然后东西变多后控制逻辑也不方便管理

    Simple GameManager

    最简单最常用的架构方法
    1.Make the EmptyGO as a Singleton
    在之前基础上用单例类管理所有东西

    GameManager.Instance.palySound("GunShot")
    

    2.Good and appropriate for small projects
    适合小型项目

    3.Its not plug-and-play
    它不是放上就用的 有管理者调度

    Manger of Managers

    现在改为一堆Manager管理


    image.png

    1.MainManager customizes and managers all the submanagers
    由一个MainManager管理其他整个子Manager

    2.Submanagers operate as singletons and can easily address each other to collaborate
    子Manager单独运行,可以很方便的互相联系协作 相当于解耦合

    最好游戏项目有
    GameManager
    EventManager
    MenuManager
    GUI Manager
    Audio Manager

    • EventManager
      WHY LEVEL MANAGER?
      为什么要有场景管理
      官方有
      using UnityEngine.SceneManagement;
      SceneManager.LoadScene(场景索引号);同步加载
      SceneManager.LoadSceneAsync(场景索引号); 异步加载


      image.png

      这是老方法
      lssue 1:you need to know the scene name or the index of the scene you want to load,but most probably the name or order will be changed later
      问题1 要根据 名字和Index加载场景 你之后改名字或者顺序变一下就完蛋了

    lssue 2:there's no simple method of passing arguments to a scene,e.g.,assuming you're reusing one scene for many different levels.
    问题2 没有简单的方法可以将参数传递给场景,例如,几个场景差不多想公用一个场景 只是传入参数不同

    lssue 3:managing multiple level work flows is not a simple task,suppose you want to create two versions of your game:demo and the full version
    管理多层次的工作流程不是一个简单的任务,假设您想要创建游戏的两个版本:演示版和完整版
    Compose aconfiguration table
    组成配置表
    Create a new API:
    然后写一个新的API


    image.png

    在管理类中调整循序 我们只用加载下一个场景就行了

    In the configuration table, It also should be allowed to set an argument line for each level
    在配置表中,还应给每个场景设置参数。
    Then this argument line can be easily accessed later
    那么这个参数行以后可以很容易地访问
    之后用配置表进行加载
    It should be allowed to create multiple configuration tables,and before building your application switch between them.
    应该允许创建多个配置表,并在构建应用程序之前在它们之间switch切换。
    In that way you can quickly create two different versions of your game
    这样你就可以快速创建两个不同版本的游戏
    More...
    With a Level Manager , you can also manager the transitions between two levels easily:
    transparency
    color
    animation
    使用场景管理器,您还可以轻松管理两个场景之间的转换加上特效:
    透明
    颜色
    动画

    • Pool Manager
      一个简单的Pool设计


      image.png

    比如东西用过一次放在List之后用了就拿出来
    有了拿出来 没有创建


    image.png

    用完不要扔放在对象池里失活掉


    image.png
    设置一个池子上限 如果超了就先进先出销毁掉
    image.png
    这样可以在频繁创建销毁节省不必要的性能损耗

    问题
    当我们用预制体要加载 在外部需要Load 所以我们要在外部加一个加载管理
    然后池子外面的东西管理需要在外面的类自己代码管理
    那么失活激活是不是可以放在一起管理
    针对每一种Prefab分别管理


    image.png

    PoolManager总池
    SpawnPool管理一类的物体(NPC 打怪掉的东西)
    PrefabPool单独每一个物体的PrefabPool(只放一个Prefab)

    最好把PoolManager设计为单例类
    然后每一个SpawnPool就是EmptyGO设计模式 一个节点下面放激活失活的对象 然后用字典管理
    可以用两个List分别管理激活和失活
    可以管理Prefab加载和卸载

    比如子弹,特效产生多的物体 设置一个上限 如果上限了就停止产生 或者用之前的把前面的推出去新生成的压进来

    如果是NPC这些很麻烦的时候 等超过多久确认没人用就销毁掉 每次删掉的数量严格控制 按每帧删除几个这样 一般一帧删3个5个 防止突然删除卡掉

    • Save Manager
      退出时加载存储
      推荐EASY SAVE插件。可以Load、Save均采用二进制(速度快)
      还能做一些简单的加密操作

    MVCS(StrageloC)

    image.png

    之前有项目UI点击事件使用访问一堆单例
    游戏复杂UI改一点就要大量去改
    把UI和逻辑分离开


    image.png

    一个人有这么多技能 用了就Play
    万一策划要之后改名字 就很尴尬
    把技能分离出来 技能就一个代码

    最简单的关键 把两个不同的东西Bind根据Key起来
    Key一样的话就在根据Name区分


    image.png

    整体功能分为
    事件回调
    根据binds实现接口功能
    一个类的实例化后触发其依赖类的实例化


    image.png
    image.png
    这个就是一个MVC思想多了个管理
    image.png
    image.png

    核心代码进行绑定实现


    image.png
    image.png
    绑定和监听者
    这是之间技能之间切换
    image.png
    坏处 这套机制依赖于反射 比较耗时间

    MVVM(uFrame)

    有编辑器界面 图形化 前面的只是个插件


    image.png

    总结

    如果是刚毕业的学生、新手比较多 用框架可能会影响开发效率
    如果是资深的话 用框架就事半功倍
    不用复杂框架的话最好用EvenetManager 把UI和控制代码分离开

    好的项目规则

    用C# 不要用JS

    命名起有含义的名字

    起文件夹尽量要和Manager对应起来

    0容忍1对警告和报红 警告到最后可能会内存泄露

    不要动态开辟内存 一个数组开20个就20个不要动态最后不够用再添加(加载资源Load没办法) 不然会到最后越来越卡

    少GetComponent Find.GameObject 很慢的操作

    美术资源要合理

    Unity也有免费的框架


    image.png

    有相关的事件 就是个测试用捕捉异常的插件

    做项目要不要单纯做一个项目 写完就完了 把代码写完要有一个传递下去的思想

    相关文章

      网友评论

        本文标题:Unity手游项目架构设计与开发管理

        本文链接:https://www.haomeiwen.com/subject/yaowgqtx.html