前提

每隔一段时间,阿茶都会使用GameFramework和相关衍生框架去创建一个空白项目,每一次都会跟着教程一点点的添加,但是每次都会遇到Procedure设置的时候在Inspector窗口中无法找到流程的问题,网络上几乎找不到一个合理的解决方式,每次都需要在这个问题上浪费掉很多很多时间。

一次两次还好,时间长了真的会很让人烦躁的啊!

今天阿茶又遇到了这个问题,所以这次决定记录一下。

猜测

通过阅读如下源码,发现框架去获取流程是通过反射的方式获取的。同时官方文档也证明了这一点。

1
2
// Assets\GameFramework\Scripts\Editor\Inspector\ProcedureComponentInspector.cs: 116
m_ProcedureTypeNames = Type.GetRuntimeTypeNames(typeof(ProcedureBase));

因此,找不到流程的大概原因就是,脚本所在的程序集(Assembly)无法获取我所创建的Produce文件所在的程序集。

解决方式就是让GameFramework所在的程序集UnityGameFramework.Editor获取到流程所在的程序集GameMain

方法

通过添加程序集的引用(失败)

因为在GameMain中的脚本需要访问GameFramework中的方法,因此在程序集GameMain的引用配置中已经添加了GameFramework所在的程序集UnityGameFramework.Editor

根据经验猜测,如果此时在程序集UnityGameFramework.Editor的引用配置中添加程序集GameMain,此时会因为循环引用而报错。

经过实践证明也是如此。

其他方式(成功)

经过不懈的努力(查找资料,并且注意比对上一个项目中的文件和空项目文件),阿茶终于解决了这个问题!

在文件\Assets\GameFramework\Scripts\Editor\Misc\Type.cs中,添加了下面的修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// ......

namespace UnityGameFramework.Editor
{
/// <summary>
/// 类型相关的实用函数。
/// </summary>
internal static class Type
{
private static readonly string[] RuntimeAssemblyNames =
{
#if UNITY_2017_3_OR_NEWER
"UnityGameFramework.Runtime",
#endif
"Assembly-CSharp",
-
+ "GameMain"
};
// ......
// 下方不变

按照这样的方式修改代码后,回到Unity,GameFramework终于成功加载了我的所有流程内容。

参考

公司之前的项目