GameFrameWork入门学习
主要是配合官方
StarForce
项目来学习的
1. 导入unity资源包下载地址:
2. 源码下载地址:
3. 初始场景
- 存在一个初始场景,这个场景放置着
GameFrameWork
预制体,这个场景将一直不会被销毁(图中Builtin
其实就是GameFrameWork
预制体,只是将名字改了一下) - 初始场景也是作为入口
-
GameFrameWork
预制体下有很多个模块,其中Procedure
用来**流程和设置初始流程
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
③编写该实体的逻辑脚本,继承自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的文件
- 写好相关的属性脚本
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);
}
- 采用了事件订阅的方式来调用请求后的方法