GameFrameWork入门学习

主要是配合官方StarForce项目来学习的

1. 导入unity资源包下载地址:

http://gameframework.cn/download

2. 源码下载地址:

https://github.com/EllanJiang/GameFramework

3. 初始场景

  • 存在一个初始场景,这个场景放置着GameFrameWork预制体,这个场景将一直不会被销毁(图中Builtin其实就是GameFrameWork预制体,只是将名字改了一下)
  • 初始场景也是作为入口
  • GameFrameWork预制体下有很多个模块,其中Procedure用来**流程和设置初始流程

GameFrameWork入门学习

4. 流程

  • 流程类继承自ProcedureBase,如下
public class ProcedureMain : ProcedureBase
{
    
}
  • 切换状态就是切换流程
    • 切换状态一般放在OnUpdate()函数内
    • ChangeState<流程>(procedureOwner);
protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
{
    base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
    //ProcedureChangeScene:改变场景的流程类
    ChangeState<ProcedureChangeScene>(procedureOwner);
}

5. 状态生命周期函数

函数 调用顺序
OnInit() 状态初始化
OnEnter() 进入状态调用
OnUpdate() 状态轮询调用
OnLeave() 离开状态调用
OnDestory() 销毁状态调用

6. 实体Entity

例如:
①制作一个预制体Cube,无需放入场景中
②添加实体组Entity Group
GameFrameWork入门学习
③编写该实体的逻辑脚本,继承自EntityLogic

using UnityGameFramework.Runtime;

public class Entity_Cube:EntityLogic
{
    protected override void OnShow(object userData)
    {
        base.OnShow(userData);
        Log.Debug("Entity_Cube");
    }
}

④在某个流程的OnEnter()中,写入下方代码

protected override void OnEnter(ProcedureOwner procedureOwner)
{
    base.OnEnter(procedureOwner);
    EntityComponent entityComponent = UnityGameFramework.Runtime.GameEntry.GetComponent<EntityComponent>();
    entityComponent.ShowEntity<Entity_Cube>(1,"Assets/Cube.prefab","Cube");
}

其中:entityComponent.ShowEntity<Entity_Cube>(1,“Assets/Cube.prefab”,“Cube”);

  • <>内填的是该实体的逻辑脚本
  • 第一个参数:实体id
  • 第二个参数:实体预制体的具体路径
  • 第三个参数:属于哪个实体组,如②步骤的组名(Cube)

7. 显示UI

①制作一个UI预制体,无需放入场景中

②添加UI组UI Group

③编写该实体的逻辑脚本,继承自UIFormLogic, 与实体不同,这个逻辑脚本必须挂载到UI预制体上

④在某个流程的OnEnter()中,写入下方代码

protected override void OnEnter(ProcedureOwner procedureOwner)
{
    base.OnEnter(procedureOwner);
    UIComponent uiComponent = UnityGameFramework.Runtime.GameEntry.GetComponent<UIComponent>();
    uiComponent.OpenUIForm("Assets/Canvas.prefab", "Image");
}

8. 加载配置文件

  • 制作配置文件,现在Excel表中写好,导出为.txt的文件

GameFrameWork入门学习

  • 写好相关的属性脚本
using System.Collections;
using System.Collections.Generic;
using GameFramework;
using StarForce;
using UnityEngine;
using UnityGameFramework.Runtime;

public class DRMyPlayer  : DataRowBase
{
    private int m_Id = 0;

    /// <summary>
    /// 获取玩家编号。
    /// </summary>
    public override int Id
    {
        get
        {
            return m_Id;
        }
    }

    /// <summary>
    /// 获取资源名称。
    /// </summary>
    public string Name
    {
        get;
        private set;
    }

    /// <summary>
    /// 获取资源名称。
    /// </summary>
    public string AssetName
    {
        get;
        private set;
    }

    /// <summary>
    /// 获取等级。
    /// </summary>
    public int Level
    {
        get;
        private set;
    }

    public override bool ParseDataRow(GameFrameworkSegment<string> dataRowSegment)
    {
        string[] columnTexts = dataRowSegment.Source.Substring(dataRowSegment.Offset, dataRowSegment.Length).Split(DataTableExtension.DataSplitSeparators);
        for (int i = 0; i < columnTexts.Length; i++)
        {
            columnTexts[i] = columnTexts[i].Trim(DataTableExtension.DataTrimSeparators);
        }
        int index = 0;
        index++;//将带#的行略过
        m_Id = int.Parse(columnTexts[index++]);
        //index++;//将属性(带中文的列)略过,如果列中没有属性列就不需要这句了
        Name = columnTexts[index++];
        AssetName = columnTexts[index++];
        Level = int.Parse(columnTexts[index++]);
        return true;
    }
}

其中,继承DataRowBase,最主要的是ParseDataRow函数的编写

  • 在某个流程中加载.txt
protected override void OnEnter(ProcedureOwner procedureOwner)
{
    base.OnEnter(procedureOwner);
    EventComponent eventComponent UnityGameFramework.Runtime.GameEntry.GetComponent<EventComponen();
    eventComponent.Subscribe(LoadDataTableSuccessEventArgs.EventIdLoadDataTableSuccess);
    eventComponent.Subscribe(LoadDataTableFailureEventArgs.EventIdLoadDataTableFailure);
    DataTableComponent dataTableComponent UnityGameFramework.Runtime.GameEntry.GetComponent<DataTableCompent>();
    dataTableComponent.LoadDataTable<DRMyPlayer>("player""Assets/MyAssets/player.txt", LoadType.Text);
}

void LoadDataTableSuccess(object sender, GameEventArgs e)
{
    LoadDataTableSuccessEventArgs ne = e aLoadDataTableSuccessEventArgs;
    Log.Debug("Success---" + ne.DataTableName);
    DataTableComponent dataTableComponent =
        UnityGameFramework.Runtime.GameEntry.GetComponent<DataTablemponent>();
    IDataTable<DRMyPlayer> player dataTableComponent.GetDataTable<DRMyPlayer>();
    //这里的id(66,77)填的是.txt文件里的id,看上面的.txt文件
    DRMyPlayer myPlayer1 = player.GetDataRow(66);
    DRMyPlayer myPlayer2 = player.GetDataRow(77);
    if (myPlayer1 != null && myPlayer2 != null)
    {
        // 此行存在,可以获取内容了
        Log.Debug(myPlayer1.Name + "--" + myPlayer1.AssetName + "--+ myPlayer1.Id + "--" +myPlayer1.Level);
        Log.Debug(myPlayer2.Name + "--" + myPlayer2.AssetName + "--+ myPlayer2.Id + "--" +myPlayer2.Level)
    }
    else
    {
        // 此行不存在
    }
}

void LoadDataTableFailure(object sender, GameEventArgs e)
{
    LoadDataTableSuccessEventArgs ne = e aLoadDataTableSuccessEventArgs;
    Log.Debug("Failure---" + ne.DataTableName);
}

9. Web请求

  • 先在流程中订阅web请求成功或失败后的回滚函数
protected override void OnEnter(ProcedureOwner procedureOwner)
{
    base.OnEnter(procedureOwner);
    UnityGameFramework.Runtime.GameEntry.GetComponent<EventComponen().Subscribe(WebRequestSuccessEventArgs.EventId,OnWebRequestSuccess);
    UnityGameFramework.Runtime.GameEntry.GetComponent<EventComponen().Subscribe(WebRequestFailureEventArgs.EventId,OnWebRequestFailure)
    RequestVersion();
}
  • 其中OnWebRequestSuccess,OnWebRequestFailure分别是请求函数RequestVersion()请求成功或失败之后执行的函数
  • RequestVersion()函数如下:
private void RequestVersion()
{
    WebRequestComponent webRequest = UnityGameFramework.Runtime.GameEntry.GetComponent<WebRequestComponent>();
    webRequest.AddWebRequest(url);
    webRequest.AddWebRequest(url, wwwForm);
}
  • 采用了事件订阅的方式来调用请求后的方法