由于GameFramework的官方Demo(StarForce)封装的比较多,不利于入门学习(但作为代码风格和编程思路的学习是非常好的),所以,我打算用尽量少(能不能用就不用)的封装来重新实现一遍StarForce的基础功能,希望能帮到初学框架的你。
在学习此Demo之前,强烈建议先看完Demo1至Demo6。
本Demo源码:https://github.com/mutouzdl/gameframework_demo.git
下载源码后,用Unity3D打开工程,进入DemoStarForce目录,即为本Demo的项目。
本Demo没有对应的教程,仅作学习参考用,以下为注意事项:
- DemoSF_GameEntry脚本要挂载到GameFramework对象上(或其他对象也行,总之要让这个脚本生效)
- 删除DemoSF_Launch场景里MainCamera的AudioListener,因为这个场景是不会卸载的,其他场景可能会有AudioListener,这样会警告有两个Listener
-
如果UI上的按钮无法点击,那是正常的,因为我们没有设置好UI组件,在UI组件下建一个Canvas,名字无所谓(这里是UI Form Instances):
其次,必须把建好的Canvas对象拖到UI组件的Instance Root属性上
做了以上操作后,UI仍然无法响应操作的话,那就是我们的预制体没有建好,我猜大家可能会直接把官方Demo的MenuForm预制体复制过来用,但是官方的预制体是比较特别的,它没有Canvas等必须的组件(它通过代码自动创建)。
我们简单点,给自己的预制体加上两个必备脚本就可以了:
最后,少不了在初始场景里加上EventSystem,不然是无法响应点击事件的。 - 离开菜单流程时,要关闭菜单UI(否则UI会一直存在)
- 初始场景(DemoSF_Launch)的Camera的Tag一定不要设置为MainCamera,因为这个初始场景是不卸载的,如果它的Camera是Main的话,在代码中调用Camera.main的时候就会查找到初始场景的Camera,而不是你当前场景的Camera。
- 加载实体时(ShowEntity),可以传递一个UserData,当实体显示时,可以通过OnShow、OnInit等函数的UserData参数获取传递的值。这种方式可以用于一些实体的动态赋值,比如武器发射子弹时,子弹的位置要怎么确定?这时候就可以在显示子弹的时候传递当前武器的位置过去,子弹在显示时就可以获得到这个位置信息。
- 本Demo为严重阉割版,只演示最基础的功能,碰撞处理逻辑也只是用日志展示,没有攻击特效、没有死亡特效、也没有血量和攻击等概念。
通过这个Demo,你可以了解到以下的知识点:
- Game Framework通过流程(Procedure)来控制场景间的切换
- 大部分操作是异步的(或者看起来是的),它们通过订阅事件来监听操作的结果(如加载UI成功事件、加载实体成功事件,唔,还有你自己定义的奇怪事件)
- 场景和UI是需要主动卸载的,否则会一直存在(哪怕切换了场景)
- 实体都要继承EntityLogic类,并且有固定的生命周期函数,套路很明确,上手比较轻松(你只要不断新建继承了EntityLogic的类,就能建立千奇百怪的实体了)。你可能印象最深刻的是:ShowEntity(加载实体)和HideEntity(隐藏实体)
- 记住UserData这个参数,它在订阅事件、加载实体等操作时都可以传递,然后在事件发生或实体成功加载时,你可以重新获得这个参数。然后,你可以做任何你想做的事情(不包括羞羞的那种)
-
本Demo十分简陋,仅供框架入门学习之用,学完本Demo后,请一定要继续研究官方的StarForce示例,并学习它的代码风格和思维。