GameFrameWork框架(Unity3D)使用笔记(五)游戏主流程ProcedureMain

Unity Game FrameWork—模块使用—框架组件简要说明 Global Helper为相关配置为数据(文本,xml,json等)解析方式,其他组件的Helper选项配置,均为数据加载以及解析的结构定义,框架提供了一套默认的解析方式。UI也有分组,需注意。数据表使用的是框架默认的解析方式DefaultDataTableHelper,如果我们数据表定义的结构和Demo默认的不一样,这个时候我们需要扩展自己的数据解析脚本,并选择自定义的解析方式。调试窗口没必要纠结,使用默认的即可,如果有新的需求可以看具体的框架逻辑去修改,当然也有很多其他的调试工具和调试手段可以使用。 阅读详情

目录

前言:

一、切换到ProcedureMain流程

二、场景布置

三、生成主角

1、EntityLogic

2、EntityData

(1)Id

(2)TypeId

(3)Position

(4)Rotation

 成功!


前言:

        前面已经完成了UI界面切换等功能,但是真正的游戏内容主体部分还没有开始,下面就来实现游戏的主流程。

        本篇的内容又用到了GF的一个新模块:Entity。这一次我们主要实现的就是在场景中生成主角。


一、切换到ProcedureMain流程

        首先先给“开始”按钮按钮增加一下切换到ProcedureMain的功能。

        之前已经写过了,按下开始按钮会设置m_StartGame为true:

//MenuForm.cs

//ProcedureMenu.cs然后就是在菜单流程中的OnUpdate里面检测m_StartGame,如果是true则利用转换流程ProcedureChangeScene到主流程:

  protected override void OnUpdate(IFsm<GameFramework.Procedure.IProcedureManager> procedureOwner, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);

            if (m_StartGame)
            {
                //先设置要转换的下一个场景的ID:
                procedureOwner.SetData<VarInt32>("NextSceneId",GameEntry.Config.GetInt("Scene.Main"));
                //然后进行场景切换流程
                ChangeState<ProcedureChangeScene>(procedureOwner);
            }
        }

 然后在场景切换流程里面,写好了切换到主流程的逻辑:

#ProcedureChangeScene.cs
protected override void OnUpdate(IFsm<GameFramework.Procedure.IProcedureManager> procedureOwner, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);

            if (!m_IsChangeSceneComplete)   
            {
                return;  //还没完成场景切换
            }
            if (m_ChangeToMenu)
            {
                ChangeState<ProcedureMenu>(procedureOwner);   //菜单
            }else
            {
                ChangeState<ProcedureMain>(procedureOwner);   //游戏运行主流程
            }
        }

别忘了加到Build Settings里面: 

然后测试试试:

 

从结果可以看出,场景确实切换了,但是UI并没有关闭, 经过调查是上次自己在测试的时候注释掉了“在菜单流程结束的时候关闭菜单UI界面”的逻辑,恢复后就解决了:

ProcedureMenu.cs
protected override void OnLeave(IFsm<GameFramework.Procedure.IProcedureManager> procedureOwner, bool isShutdown)
        {
            base.OnLeave(procedureOwner, isShutdown);

            GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);

            Log.Info("退出菜单流程!");
            
            if (m_MenuForm != null)
            {
                m_MenuForm.Close(isShutdown);
                m_MenuForm = null;
            }
            
        }

 然后就切换到主游戏场景和流程了。


二、场景布置

        目前场景是空的,因为我们这个是2D游戏所以先在场景上把简单的关卡墙体啥的摆好:

        (我直接拿以前的项目的东西来做了,包括一些2D游戏需要的插件的安装这里省去了,因为文字内容重点在GF框架)。

        ​​​​​​​

这个关卡的任务很简单,就是主角从左下角出生,然后走到门进去,通关!


三、生成主角

        之前主角的控制脚本都是直接一把梭的,既然这里用了框架最好就是用状态机复刻一下。并且把逻辑和数据分离(参考StarForce),不过这里为了节约时间就直接用之前做好的预制体,主要是用来展示一下实体的生成方式。        

然后预制体:

1、EntityLogic

然后,和UI的使用方法很类似(需要实现一个继承UIFormLogic的类),我们需要为这个实体写一个继承EntityLogic 类的脚本:

 然后,我们在游戏流程里加上生成实体的语句。

在此之前,因为所有实体都有一个唯一的ID用来标识,为了方便统一地生成这个ID,我们先写一个扩展方法:

                                                            ​​​

然后我们就可以在主流程里写生成实体的语句:

然后运行,点击开始游戏按钮:

发现人物并没有出现。

其实如果经验够丰富的话,你应该能猜到为啥没有出现。实际上人物实体已经生成了,但是我们并没有指定它的初始位置,所以我们打开框架下的Entity模块可以找到生成的Character:

而它的位置是预制体中设置的位置:

那怎么才能在生成这个玩家Entity的时候指定它所生成的位置呢?

首先,一个比较完整的实体,应该包含逻辑(Logic)和数据(Data)吧。我们刚才写了这个Player的逻辑(Logic)(继承了EntityLogic),是不是还缺少数据部分(EntityData)?

那我们下面就来实现数据部分。

2、EntityData

和EntityLogic使用方法不同的是,框架里面没有可以让我们来继承的EntityData类,所以我们需要自己实现自己的EntityData类。

先实现一个抽象类EntityData,让其它实体去继承它。所以我们需要考虑所有实体都共有的属性。这里我们参照StarForce的EntityData的实现:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
[Serializable]
public abstract class EntityData
{
    [SerializeField]
    private int m_Id = 0;

    [SerializeField]
    private int m_TypeId = 0;

    [SerializeField]
    private Vector3 m_Position = Vector3.zero;

    [SerializeField]
    private Quaternion m_Rotation = Quaternion.identity;

    public EntityData(int entityId, int typeId)
    {
        m_Id = entityId;
        m_TypeId = typeId;
    }

    /// <summary>
    /// 实体编号。
    /// </summary>
    public int Id
    {
        get
        {
            return m_Id;
        }
    }

    /// <summary>
    /// 实体类型编号。
    /// </summary>
    public int TypeId
    {
        get
        {
            return m_TypeId;
        }
    }

    /// <summary>
    /// 实体位置。
    /// </summary>
    public Vector3 Position
    {
        get
        {
            return m_Position;
        }
        set
        {
            m_Position = value;
        }
    }

    /// <summary>
    /// 实体朝向。
    /// </summary>
    public Quaternion Rotation
    {
        get
        {
            return m_Rotation;
        }
        set
        {
            m_Rotation = value;
        }
    }
}

 当然目录结构也要管理好:

下面来解释一下这个EntityData的内容:

里面有四个属性,都是在Unity中生成的实体所共有的特点。

(1)Id

        实体编号

        用于唯一标识一个实体,所有实体的ID互不相同。

(2)TypeId

        实体类型编号

        首先这里需要明白一件事情,根据框架作者的项目可以看出,游戏中所有对象(如怪物、玩家)都是从配置文件(数据表)中加载配置,然后再创建出来。

        然后,举个例子,策划设计了史莱姆怪物,然后为它们写数据表Shilaimu.txt。然后史莱姆怪物分好多种类,比如雷史莱姆,草史莱姆,风史莱姆,火史莱姆,岩史莱姆, 冰史莱姆,然后在配置表中,大概是这样:

        每一种怪物都有个ID,具体体现就是数据表的第一列的ID,这个就是TypeId。

        那TypeId和Id的区别是啥呢?Id是在整个实体框架里面唯一标识一个实体,而TypeId则标识了一个种类。比如场景中可能有两个雷史莱姆,他们的TypeId是一样的,因为它们种类一样,但是他们的Id不一样,因为他们是不同的个体。

(3)Position

        位置

        每个在场景里的物体一定都有个位置,是一个三维向量。

(4)Rotation

        旋转

        每个在场景里的物体一定都有个朝向,是一个四元数。     

        抽象基类写好了下面就来写Player的PlayerData类。:

       

目前我们的目的只是把玩家显示到特定位置,所以这里暂且先继承一下写好的抽象基类就行。

然后改一改显示实体的代码,在playerData里面设置了初始位置。

然后运行看看:

(红色报错可以无视,是角色动画部分复制过来的时候没设置好)

 emm角色还是不在场景里面。原因是这样的:

虽然我们设置了Player这个实体的数据部分PlayerData的Position信息,但是这个信息只是被实体的playerData携带了,并没有”应用“出来,而要把生成的实体“移动”到我们规定的位置,还需要在实体的EntityLogic部分对其进行实现(Player.cs)。

所以我们在Player类里面的Init()函数里面加上改变实体位置到playerData.Position处的逻辑:

CachedTransform是父类里的一个属性,缓存的是实体的Transform。这里的意思就是在实体初始化的时候设置好Transform的Position为之前在playerData里设置的Position(ShowEntity函数传递进去的playerData最终会到达这里函数的userData参数)

然后运行看看结果:

 成功!


这次成功将实体加载到了场景里面,鉴于篇幅本篇先到这里为止。接下来要做的工作将围绕继续完成这一关的流程进行。

 

 

 


                                                                 

 

 

 

 

 

 

 

        

        

【Unity3D框架】GameFramework框架完全教程《全网最全》-专栏文章目录 最近准备学习框架,了解到GameFramework框架是国产Unity3D框架,准备学习一下,但是奈何全网关于这个框架的教程实在太少。为了让自己学习方便一些,也为了让后来者乘凉。将框架以自己的理解整理目录,并且补全教程。觉得教程有帮助别忘了一键三连哦。 阅读详情

相关推荐

Unity 游戏框架之GameFramework和ET对比

Unity 框架 GF 和 ET 哪个更好用,各自的优点,缺点是什么? 随着Unity的不断发展,现在出现了很多比较牛逼的 开源 框架,其中,我觉得 最厉害的是 Game Framework 和 ET 这2个框架。 ET:https://github.com/egametang/ET GameFramework:https://github.com/EllanJiang/UnityGameFramework

TxNet 4万+

Unity GameFramework StarForce 流程介绍

根据提供的案例参考即可实现自己的组件。

zzzsss123333的博客 1558

GameFramework教程✨一、本专栏概述及注意事项

大家好,我是SKODE。 小提示:选中左侧目录,可快速找到所需内容 本系列博客地址:传送门

星河造梦坊 7756

GameFramework框架

ellan做事风格非常低调,属于实干派,几乎没有宣传过框架,但是多年持续维护更新,框架实际是提炼于知名的商业项目。虽然框架文档十分匮乏,新人上手相对困难,但是GF依然靠着过硬的代码质量吸引开发者使用和学习。每个模块的xxxManager都会实现对应的IxxxManager接口,UGF只会直接引用接口,不会直接引用Manager。如果需要调用依赖于引擎实现的接口,可以定义对应的IHelper接口并在UGF层实现接口,GF层只管调用不管具体实现。对常用模块封装,规范开发过程,保证产品质量,内置19个模块。

—巨人绿 4507

GameFramework教程✨三、流程

大家好,我是SKODE。 小提示:选中左侧目录,可快速找到所需内容 本系列博客地址:传送门 E大该章链接:传送门 一、什么是流程 贯穿游戏运行时整个生命周期的有限状态机。通过流程,将不同的游戏状态进行解耦将是一个非常好的习惯。对于网络游戏,你可能需要如检查资源流程、更新资源流程、检查服务器列表流程、选择服务器流程、登录服务器流程、创建角色流程等流程,而对于单机游戏,你可能需要在游戏选择菜单流程和游戏实际玩法流程之间做切换。如果想增加流程,只要派生自 ProcedureBase 类并实现..

星河造梦坊 6126

【GameFramework框架】四、GameFramework框架内置模块

【GameFramework框架内置模块】1、全局配置(Config)【GameFramework框架内置模块】2、数据节点(Data Node)【GameFramework框架内置模块】3、数据表(Data Table)【GameFramework框架内置模块】4、调试器(Debugger)【GameFramework框架内置模块】5、下载(Download)【GameFramework框架内置模块】6、实体(Entity)【GameFramework框架内置模块】7、事件(Event)

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 5643

GameFrameWork框架(Unity3D)使用笔记(六)游戏主流程ProcedureMain——从数据表加载出所需实体

养成实体从数据表配置中加载的好习惯。

HowToPause的博客 1807

GameFramework框架详解之 UI框架

UI框架是我们不管开发游戏还是App,都必不可少的一个模块。好的UI框架凤毛麟角,但是Gameframework可以算是其中一个了。今天我们就来拆解一下GF的UI框架。Unity技术开发干活 - 总目录Unity精选 - 专栏目录Unity之ASE入门到精通 - 专栏目录UniRx入门到精通 - 专栏目录Unity技术开发干活 - 总目录。

TxNet 6975

GameFrameWork框架(Unity3D)使用笔记(七)游戏主流程ProcedureMain——虽然游戏本来没有怪物但是为了使用状态机模块写一个简单怪物AI吧(下)

这篇直接接着上一篇开始写啦。使用GF的状态机的话,我们要做的主要是实现一下各个状态类。虽然有些细节需要注意但是总体来说按照设计填代码就好了。

HowToPause的博客 1137

【GameFramework框架】一、框架介绍

这是GameFramework框架教程的第一篇,但是博主不准备直接就讲GameFramework框架。【GameFramework框架】二、GameFramework框架介绍了。框架(Framework)通常被理解为一种基础要素的集合,它们用于承载系统的必要功能。约束性:框架定义了解决特定问题的边界,并将相关的软件组件约束在这个范围内,以保持框架的内聚性和解决问题的专注性。支撑性:框架本身不直接解决问题,而是提供一个基础的支撑结构,使得在其上构建的解决方案更为灵活和高效。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1万+

从DIY到实战:手把手教你搭建一个媲美吉时利2450的nA级电流源表(附原理图与避坑指南)

本文详细解析如何从零打造nA级精密电流源,涵盖核心设计原理、PCB布局技巧、热电偶效应应对及校准验证体系。通过低成本替代方案和优化设计,实现媲美商用源表的性能,特别适合硬件爱好者和独立开发者。文章还提供原理图与避坑指南,助你轻松搭建高精度电流源系统。

weixin_42656416的博客 292

GameFrameWork框架(Unity3D)使用笔记(七)游戏主流程ProcedureMain——虽然游戏本来没有怪物但是为了使用状态机模块写一个简单怪物AI吧(上)

状态机是游戏开发中很常用的东西,GF中也有对应的模块FSM(有限状态机)。但是呢,前面我用到的玩家预制体里的控制脚本是一把梭的。。。而且代码是很久以前写的可读性很差。。。(就是说不想再重构了呗),然后在这个游戏里目前并没有AI怪物的需求。。。所以为了强行练习使用GF的有限状态机模块,我准备写一个简单的怪物AI,使用FSM来完成。

HowToPause的博客 1414

腾讯云TDSQL MySQL版 - 开发指南兼容性

语言结构 分布式实例支持所有 MySQL 使用的文字格式,包括: String Literals Numeric Literals Date and Time Literals Hexadecimal Literals Bit-Value Literals Boolean Literals NULL Values String Literals String Literals 是一个 bytes 或者 characters 的序列,两端被单引号'或者双引号"包围,TDSQL MySQL版

weixin_43872058的博客 909

【Unity 3D】GameFramework、QFramework框架简介及应用实战(超详细 附源码)

【Unity 3D】GameFramework、QFramework框架简介及应用实战(超详细 附源码)

showswoller的博客 1万+

#智慧文旅#文创商城管理系统,一站式文旅商品营销管理平台

#智慧文旅#文创商城管理系统满足景区、运营公司或者全域文旅对文创店铺、商品的全流程管理需求,提供文创商品的线上线下产品销售、会员管理、促销管理等服务。包括文创店铺的基本信息管理、文创商品的分类管理、标签管理、上下架管理、库存案例、配送管理等功能。

数字赋能,开启智慧文旅新时代 1174

用Unity Wheel Collider做坦克转向?3步实现履带式载具物理效果

本文详细解析了如何利用Unity的Wheel Collider组件实现履带式载具的差速转向物理效果。通过思维转换、场景搭建和核心代码实现三步,将Wheel Collider从模拟轮式车辆转向改造为控制履带扭矩差的系统,并深入探讨了参数调试与真实感提升的方法,帮助开发者打造物理反馈扎实的坦克或特种车辆模拟。

weixin_29009971的博客 223

【Unity】Game Framework框架学习使用

这篇文章主要是自己学习GameFramework的时候的一些使用心得

好吃的和好看的都需要用实力来争取 4665

【iOS开发】dyld: Symbol not found: ___chkstk_darwin 问题解决

【iOS开发】dyld: Symbol not found: ___chkstk_darwin 问题解决 Xcode 13.2.1 运行到iOS12.x版本上崩溃报错如下:dyld: Symbol not found: ___chkstk_darwin dyld: Symbol not found: ___chkstk_darwin Referenced from: /private/var/containers/Bundle/Application/A424CEFD-51DB-450E-9D62-B8

wm9028的专栏 6563

GameFramework框架——FSM和Procedure的底层调用梳理

GameFramework框架——FSM和Procedure的底层调用

m0_46210273的博客 942

避坑指南:vue-print-nb打印隐藏元素与空白页的那些事儿

本文深入解析了使用vue-print-nb插件时,打印出现空白页及隐藏元素问题的根本原因与解决方案。核心在于理解浏览器打印原理,并通过CSS媒体查询精准控制样式。文章提供了从重置根元素高度、处理隐藏元素到控制分页的完整避坑指南,帮助开发者彻底解决打印样式难题。

weixin_29008691的博客 437

ResNet改进(7):添加 SK注意力机制

实现 SK 注意力机制。

2401_82355416的博客 732

GameFramework---框架简介与下载(一)

@TOC# 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例

南宫铭的博客 4393

基于Simulink的永磁同步电机容错控制(缺相容错)

本文基于Simulink平台,详细介绍了永磁同步电机(PMSM)缺相容错控制的仿真实现方法。针对逆变器开路故障导致的缺相问题,提出"检测-重构-补偿"三阶段控制策略:采用电流阈值法快速检测故障(<5ms),重构αβ坐标系实现两相矢量控制,并通过谐波电流注入抑制转矩脉动(<8%)。仿真结果表明,该方法能有效维持故障后电机运行,转速波动<3%,满足电动汽车等关键应用的可靠性需求。文章包含完整的Simulink建模步骤、MATLAB函数代码及参数设置,为工程实践提供了可复现的

xiaoheshang_123的博客 146

探索游戏开发新框架:`GameFramework`

探索游戏开发新框架:GameFramework 去发现同类优质开源项目:https://gitcode.com/ 项目简介 是一个开源的游戏开发框架,由C#编写,专为跨平台的游戏开发而设计。它提供了一整套完整的游戏开发工具链和组件,包括但不限于网络通信、资源管理、事件系统、任务调度等核心功能,旨在简化游戏开发过程,提高开发效率。 技术分析 模块化设计:GameFramework采用模块化的结...

gitblog_00097的博客 572

默纳克系统烧录程序与软件升级工具解析:涵盖V3.14V3.16系统升级、老国标V1.26及Boot loader V2.41V3.10

默纳克系统的五个关键烧录程序及其软件升级工具,包括系统升级工具V3.14和V3.16、老国标烧录软件V1.26以及Boot loader烧录工具V2.41和V3.10。每个工具都有其独特的功能和应用场景。系统升级工具主要负责不同版本间的升级逻辑,如新增功能模块或修复已知问题;老国标烧录软件则专注于满足国家相关标准的要求;而Boot loader烧录工具则是系统启动时的重要组件,负责硬件初始化等任务。文中还提供了简化的代码示例,帮助读者更好地理解各个工具的具体实现。适合人群:从事嵌入式系统开发的技术人员,尤其是需要对默纳克系统进行维护和升级的专业人士。使用场景及目标:适用于需要对默纳克系统进行软件升级或烧录操作的场合,旨在提高系统的稳定性、兼容性和功能性。通过学习本文,技术人员可以掌握这些工具的使用方法,从而有效提升工作效率。其他说明:本文不仅解释了各个工具的功能,还展示了部分代码片段,有助于读者深入理解其实现机制。同时提醒使用者根据实际情况选择适当的工具版本,以确保最佳效果。

Wyse-USB-Imaging-Tool

Wyse_USB_Imaging_Tool

GameFrameWork框架(Unity3D)使用笔记(一)Entry

GameFrameWork框架(Unity3D)使用笔记(一)Entry。本篇讲解了如何引用框架以及创建GameEntry。

HowToPause的博客 6942

2017年国赛高教杯奖D题-化工厂巡检路径规划与建模论文.zip

2017年国赛高教杯奖D题-化工厂巡检路径规划与建模论文.zip【项目说明】1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用!3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。5、不懂配置和运行,可远程教学6、欢迎下载,沟通交流,互相学习,共同进步!

Unity技术-GameFramework文档系列(五)- 创建实体,2024年最新阿里面试p7

点击跳转=>保姆式Cocos合成大西瓜案例点击跳转=>养不起真猫,就用代码吸猫-Unity粒子实现画猫咪点击跳转=>Unity粒子特效系列-龙卷风预制体做好了,unitypackage包直接用!点击跳转=>姐姐喊我解锁套娃新技能:FairyGUI在Unity中实现List嵌套List/立体画廊等,玩出花儿来点击跳转=>Unity新手必备5款宝藏插件–价值上千元白嫖最新版点击跳转=>爆肝万字C#基础入门大总结【建议收藏】点击跳转=>【万字】修行Android Studio技巧到出神入化,快速涨薪【建议收藏】点

m0_54853787的博客 618

电极贴片_低频电刺激_电极_按摩仪_功能性电刺激_经络_源码.zip

电极贴片_低频电刺激_电极_按摩仪_功能性电刺激_经络_源码

上一篇: Django框架数据库(mysql)存储时间DateTimeField的用法
下一篇: Unity改变物体的Transform.position无效没有变化(CharacterController)的解决办法
咖啡咖_CoffCa
博客等级 码龄6年 116粉丝 58原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咖啡咖_CoffCa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值