只有你足够强,别人才会和你讲道理。
文章: 280
浏览: 2,983,617
  • 博主:笨木头
  • 关注:Unity、Net Core、Blazor
  • 邮箱:musicvs@163.com
笨木头  2018-03-26 17:11     其它,Unity3D,Game Framework     阅读(12109)     评论(10)
转载请注明,原文地址: http://www.benmutou.com/archives/2597
文章来源:笨木头与游戏开发
本文 Game Framework 版本:3.1.1

本文 Unity3D 版本:2017.3

更多GF教程和实例:https://github.com/mutouzdl/gameframework_demo.git

 
转载请注明,原文地址:http://www.benmutou.com/archives/2597 文章来源:笨木头与游戏开发
 

由于GameFramework的官方Demo(StarForce)封装的比较多,不利于入门学习(但作为代码风格和编程思路的学习是非常好的),所以,我打算用尽量少(能不能用就不用)的封装来重新实现一遍StarForce的基础功能,希望能帮到初学框架的你。

在学习此Demo之前,强烈建议先看完Demo1至Demo6。

 

本Demo源码:https://github.com/mutouzdl/gameframework_demo.git

下载源码后,用Unity3D打开工程,进入DemoStarForce目录,即为本Demo的项目。

 

本Demo没有对应的教程,仅作学习参考用,以下为注意事项:
  1. DemoSF_GameEntry脚本要挂载到GameFramework对象上(或其他对象也行,总之要让这个脚本生效)
  2. 删除DemoSF_Launch场景里MainCamera的AudioListener,因为这个场景是不会卸载的,其他场景可能会有AudioListener,这样会警告有两个Listener
  3. 如果UI上的按钮无法点击,那是正常的,因为我们没有设置好UI组件,在UI组件下建一个Canvas,名字无所谓(这里是UI Form Instances):


    其次,必须把建好的Canvas对象拖到UI组件的Instance Root属性上



    做了以上操作后,UI仍然无法响应操作的话,那就是我们的预制体没有建好,我猜大家可能会直接把官方Demo的MenuForm预制体复制过来用,但是官方的预制体是比较特别的,它没有Canvas等必须的组件(它通过代码自动创建)。

    我们简单点,给自己的预制体加上两个必备脚本就可以了:



    最后,少不了在初始场景里加上EventSystem,不然是无法响应点击事件的。
  4. 离开菜单流程时,要关闭菜单UI(否则UI会一直存在)
  5. 初始场景(DemoSF_Launch)的Camera的Tag一定不要设置为MainCamera,因为这个初始场景是不卸载的,如果它的Camera是Main的话,在代码中调用Camera.main的时候就会查找到初始场景的Camera,而不是你当前场景的Camera。
  6. 加载实体时(ShowEntity),可以传递一个UserData,当实体显示时,可以通过OnShow、OnInit等函数的UserData参数获取传递的值。这种方式可以用于一些实体的动态赋值,比如武器发射子弹时,子弹的位置要怎么确定?这时候就可以在显示子弹的时候传递当前武器的位置过去,子弹在显示时就可以获得到这个位置信息。
  7. 本Demo为严重阉割版,只演示最基础的功能,碰撞处理逻辑也只是用日志展示,没有攻击特效、没有死亡特效、也没有血量和攻击等概念。
 

通过这个Demo,你可以了解到以下的知识点:
  1. Game Framework通过流程(Procedure)来控制场景间的切换
  2. 大部分操作是异步的(或者看起来是的),它们通过订阅事件来监听操作的结果(如加载UI成功事件、加载实体成功事件,唔,还有你自己定义的奇怪事件)
  3. 场景和UI是需要主动卸载的,否则会一直存在(哪怕切换了场景)
  4. 实体都要继承EntityLogic类,并且有固定的生命周期函数,套路很明确,上手比较轻松(你只要不断新建继承了EntityLogic的类,就能建立千奇百怪的实体了)。你可能印象最深刻的是:ShowEntity(加载实体)和HideEntity(隐藏实体)
  5. 记住UserData这个参数,它在订阅事件、加载实体等操作时都可以传递,然后在事件发生或实体成功加载时,你可以重新获得这个参数。然后,你可以做任何你想做的事情(不包括羞羞的那种)
  6. 本Demo十分简陋,仅供框架入门学习之用,学完本Demo后,请一定要继续研究官方的StarForce示例,并学习它的代码风格和思维。
 
10 条评论
  • 平安京 2021-12-06 16:49:26

    作者你好,Demo已经运行不起来了,请尽快更新
    0回复
    • 一学就废 2022-08-25 16:56:06

      游戏为啥运行不起来的呢!这可能是作者设计的一个坑之一
      我们要找到DemoSF_ProcedureChangeScene.cs这个类
      接下来,我们将OnEnter()方法中的
      DemoSF_GameEntry.Scene.LoadScene ( nextSceneName, this);更改为
      DemoSF_GameEntry.Scene.LoadScene (string.Format("Assets/DemoStarForce/{0}.unity", nextSceneName), this);
      这样你就会发现能运行了
      0回复
      • 贪狼 2022-09-10 10:54:24

        也不是坑,是因为使用的GameFramework的版本不同,之前的Demo2的文章中就有指出(切换场景时,除了需要提供完整路径外,还需要提供后缀名),只是这个项目中用的还是之前的写法(只写场景名称),没有写出完整路径,会加载不出来场景,不过看一下代码调试就知道问题出在哪里了
        0回复
  • longsl 2019-02-26 12:07:52

    赞!
    0回复
  • XTStarry 2018-09-06 21:27:49

    为什么要另外写一个GameEntry呢?能起到什么作用?
    0回复
    • 博主 笨木头 2018-09-07 08:25:04

      没有什么特殊意义,只是一种写代码的习惯,你用别的方式来写也可以
      0回复
  • XTStarry 2018-09-06 21:00:05

    为什么工程文件夹里面有一个GameFramework,还有一个UnityGameFramework?
    对比了以下发现UnityGameFramework和E大的资源包一样,那GameFramework又是什么呢?
    0回复
    • 博主 笨木头 2018-09-07 08:24:21

      GameFramework是基础框架,不限于Unity引擎。
      UnityGameFramework是基于Unity引擎再做的一层封装,比如未来可能由CocosGameFramework(只是比如)
      0回复
  • Ikobe 2018-04-28 14:18:45

    阉割版的利于教学。。。
    0回复
    • 博主 笨木头 2018-04-28 15:23:20

      嗯嗯,已经尽量阉割
      0回复
发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发