框架涉及的文件路径整理

在ResFrame.Editor——Editor文件夹下新建ResFrameConfig脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
using UnityEngine;
using UnityEditor;
[CreateAssetMenu(fileName ="ResFrameConfig",menuName ="CreateResFrameConfig",order = 2)]
public class ResFrameConfig : ScriptableObject
{
[Tooltip("打包时生成AB包配置表的二进制路径")]
public string m_ABBytePath = "Assets/GameData/Data/ABData/AssetBundleConfig.bytes";
[Tooltip("类转Xml或Excel转xml时生成的xml所在的文件夹路径")]
public string m_XmlPath = "Assets/GameData/Data/Xml/";
[Tooltip("Xml转二进制时生成的二进制文件所在的文件夹路径")]
public string m_BinaryPath = "Assets/GameData/Data/Binary/";
[Tooltip("存放数据类脚本的文件夹路径")]
public string m_ScriptsPath = "Assets/Scripts/Data/";
}
[CustomEditor(typeof(ResFrameConfig))]
public class ResFrameConfigInspector : Editor
{
SerializedProperty m_ABBytePath;
SerializedProperty m_XmlPath;
SerializedProperty m_BinaryPath;
SerializedProperty m_ScriptsPath;

private void OnEnable()
{
m_ABBytePath = serializedObject.FindProperty("m_ABBytePath");
m_XmlPath = serializedObject.FindProperty("m_XmlPath");
m_BinaryPath = serializedObject.FindProperty("m_BinaryPath");
m_ScriptsPath = serializedObject.FindProperty("m_ScriptsPath");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.PropertyField(m_ABBytePath, new GUIContent("AB包二进制配置文件路径"));
EditorGUILayout.Space(5);
EditorGUILayout.PropertyField(m_XmlPath, new GUIContent("Xml配置文件路径"));
EditorGUILayout.Space(5);
EditorGUILayout.PropertyField(m_BinaryPath, new GUIContent("二进制配置文件路径"));
EditorGUILayout.Space(5);
EditorGUILayout.PropertyField(m_ScriptsPath, new GUIContent("数据脚本路径"));
EditorGUILayout.Space(5);
serializedObject.ApplyModifiedProperties();
}
}
public class ResConfig
{
private const string ResFramePath = "Assets/ResFrame.Editor/Editor/ResFrameConfig.asset";
public static ResFrameConfig GetResFrameConfig()
{
ResFrameConfig resConfig = AssetDatabase.LoadAssetAtPath<ResFrameConfig>(ResFramePath);
return resConfig;
}
}

在ResFrame.Editor——Editor文件夹内“右键——CreateResFrameConfig”。可以在里面修改各个路径位置

BundleEditor

修改BundleEditor脚本

1
2
3
4
5
6
7
public class BundleEditor 
{
private static string ABCONFIGPATH = "Assets/ResFrame.Editor/Editor/Resource/ABConfig.asset";
private static string BYTEPATH = ResConfig.GetResFrameConfig().m_ABBytePath;//+++
private static string m_BundleTargetPath = Application.dataPath + "/../AssetBundle/" + EditorUserBuildSettings.activeBuildTarget.ToString();
//...
}

DataEditor

修改DataEditor脚本

1
2
3
4
5
6
7
public class DataEditor
{
public static string XmlPath = ResConfig.GetResFrameConfig().m_XmlPath;
public static string BinaryPath = ResConfig.GetResFrameConfig().m_BinaryPath;
public static string ScriptsPath = ResConfig.GetResFrameConfig().m_ScriptsPath;
//...
}

打包

在ResFrame.Editor——Editor——Resource文件夹内的ABConfig中,添加配置表二进制数据的路径:

1
2
3
4
AB Name:bytes
Path:Assets/GameData/Data/Binary
AB Name:UGUI
Path:Assets/GameData/UGUI

UGUI文件夹主要存放UI的美术素材

AssetBundleManager

修改AssetBundleManager指定的配置文件名称,让它可以自定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class AssetBundleManager : SingletonPattern<AssetBundleManager>
{
protected string m_ABConfigABName = "assetbundleconfig";//+++
protected string ABLoadPath //当需要热更时,我们在这里根据宏
{
get
{
return Application.streamingAssetsPath + "/";
}
}
//...
/// <summary>
/// 加载AB配置表
/// </summary>
public bool LoadAssetBundleConfig()
{
if(!ResourceManager.Instance.m_LoadFromAssetBundle)
return false;
m_ResourceItemDic.Clear();
string configPath = ABLoadPath + m_ABConfigABName;//+++
AssetBundle configAB = AssetBundle.LoadFromFile(configPath);
TextAsset textAsset = configAB.LoadAsset<TextAsset>(m_ABConfigABName);//+++
//...
}
/// <summary>
/// 加载AssetBundle并维护AssetBundleItem中间类
/// </summary>
private AssetBundle LoadAssetBundle(string abName)
{
//...
if(!m_AssetBundleItemDic.TryGetValue(abCrc, out abItem))
{
AssetBundle assetBundle = null;
string fullPath = ABLoadPath + abName;//+++
//...
}
//...
}

AssetBundle.LoadAsset这个API不区分大小写

如果需要热更,不能使用Application.streamingAssetsPath作为文件路径。安卓和WebGL不支持此路径。

UIManager

我们写一个方法,来设定UIPrefab文件夹的位置.

修改UIManger

1
2
3
4
5
6
7
8
9
10
    private string m_UIPrefabPath = "Assets/GameData/Prefabs/UGUI/Panel/";
//...
/// <summary>
/// 设置所有界面UI路径
/// </summary>
/// <param name="path"></param>
public void SetUIPrefabPath(string path)
{
m_UIPrefabPath = path;
}

GameStart

我们修改一下GameStart脚本,去除之前测试的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using UnityEngine;
using UnityEngine.EventSystems;

public class GameStart : MonoSingletonPattern<GameStart>
{
private GameObject m_GameObject;
public Transform recyclePoolTrans, sceneTrans;
public RectTransform uiRoot, windowRoot;
public Camera uiCamera;
public EventSystem eventSystem;
protected override void Awake()
{
base.Awake();
DontDestroyOnLoad(gameObject);
AssetBundleManager.Instance.LoadAssetBundleConfig();
ResourceManager.Instance.Init(this);//初始化异步加载
ObjectPoolManager.Instance.Init(recyclePoolTrans,sceneTrans);
}
private void Start()
{
LoadConfig();

UIManager.Instance.Init(uiRoot, windowRoot,uiCamera,eventSystem);
RegisterUI();
GameSceneManager.Instance.Init(this);

//GameSceneManager.Instance.LoadScene(ConstantStr.MENUSCENE);

}
/// <summary>
/// 注册UI窗口
/// </summary>
void RegisterUI()
{
//UIManager.Instance.Register<MenuWnd>(ConstantStr.MENUPANEL);
//UIManager.Instance.Register<LoadingWnd>(ConstantStr.LOADINGPANEL);
}
/// <summary>
/// 加载配置表
/// </summary>
void LoadConfig()
{
//ConfigManager.Instance.LoadData<MonsterData>(CFGPaths.TABLE_MONSTER);
}
private void Update()
{
UIManager.Instance.OnUpdate();
}
private void OnApplicationQuit()
{
#if UNITY_EDITOR
ResourceManager.Instance.ClearCache();
Resources.UnloadUnusedAssets();
#endif
}
}

将GameData——Prefabs内的GameStart这个Prefab移到ResFrame文件夹内。

GameStart脚本也放在ResFrame文件夹内。

插件

在ResFrame文件夹内新建“Plugins——Editor文件夹”,并将之前的EPPlus.dll文件放在里面。

文件夹修改

将ResFrame文件夹内的BaseFramework、ConfigFramework、ResourceFramework、UIFramework文件夹的“Framework”改为“Frm”,因为IOS系统有冲突。

在ResFrame文件夹内新建SceneMgr文件夹,将Scripts——Manager——GameSceneManager脚本移进来。

在ResFrame文件夹内新建Frames文件夹,将同级内的所有文件和文件夹全都移到Frames文件夹里。

将ResFrame.Editor文件夹下的Editor文件夹转移到ResFrame文件夹下

修改代码

修改BundleEditor的ABConfig引用

1
2
3
4
5
public class BundleEditor 
{
private static string ABCONFIGPATH = "Assets/ResFrame/Editor/Resource/ABConfig.asset";//+++
//...
}

修改ResFrameConfig的ResFramePath

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using UnityEngine;
using UnityEditor;
[CreateAssetMenu(fileName ="ResFrameConfig",menuName ="CreateResFrameConfig",order = 2)]
public class ResFrameConfig : ScriptableObject
{
//...
}
public class ResConfig
{
private const string ResFramePath = "Assets/ResFrame.Editor/Editor/ResFrameConfig.asset";//+++
public static ResFrameConfig GetResFrameConfig()
{
ResFrameConfig resConfig = AssetDatabase.LoadAssetAtPath<ResFrameConfig>(ResFramePath);
return resConfig;
}
}

导出Package

选中ResFrame文件夹并导出为package(取消所有依赖)。

在使用这个package时,需要新建GameData文件夹,GameData——Data文件夹,在Data文件夹内新建ABData、Binary、Xml文件夹。