static void EditorApplication_ProjectChanged() { //--projectWindowChanged已过时 //--全局监听Project视图下的资源是否发生变化(添加 删除 移动等) //EditorApplication.projectChanged += HandleForAssetsChange; //PrefabStage.prefabSaving += HandleForAssetsChange; AddressableUtil.AddCallBackForAssetChange(HandleForAssetChange); }
/// <summary> /// 初始化数据 /// </summary> public static void InitData() { //获取所有组 allGroup = AddressableUtil.FindAllGrop(); //获取保存数据 string dataSave = FileUtil.LoadTextFile($"{pathSaveData}/{saveDataFileName}"); if (dataSave.IsNull()) { addressableSaveData = new AddressableSaveBean(); } else { addressableSaveData = JsonUtil.FromJsonByNet <AddressableSaveBean>(dataSave); } }
protected override void InitTask() { LogTool.Log($"{TaskName.Value}", LogEnum.TaskLog); label.labelString = LabelName; AddressableAsync.LoadAssetsAsync <GameObject>(label, (go) => { LogTool.Log($"{go.name}"); AddressableUtil.InstantiateGo(go, true); }, (completed) => { if (completed.Status == AsyncOperationStatus.Succeeded) { LogTool.Log($"资源加载完成", LogEnum.TaskLog); IsFinish = true; } }); }
/// <summary> /// 所有资源刷新 /// </summary> public static void HandleForAllAssetChange() { List <AddressableAssetEntry> listAllData = AddressableUtil.FindAllAsset(); List <AddressableAssetEntry> listData = new List <AddressableAssetEntry>(); for (int i = 0; i < listAllData.Count; i++) { AddressableAssetEntry addressableAsset = listAllData[i]; if (addressableAsset.parentGroup.name.Equals("Built In Data")) { } else { listData.Add(addressableAsset); } } HandleForRefreshAssets(listData); }
/// <summary> /// 刷新Addressable资源 /// </summary> /// <param name="listChangeAssetEntry"></param> public static void HandleForRefreshAssets(List <AddressableAssetEntry> listChangeAssetEntry) { InitData(); if (addressableSaveData == null) { return; } for (int i = 0; i < listChangeAssetEntry.Count; i++) { EditorUI.GUIShowProgressBar("刷新进度", "资源", (float)i / listChangeAssetEntry.Count); AddressableAssetEntry itemAssetEntry = listChangeAssetEntry[i]; LogUtil.Log($"资源修改 address:{itemAssetEntry.address} AssetPath:{itemAssetEntry.AssetPath}"); if (itemAssetEntry.AssetPath.LastIndexOf("/") == 0) { LogUtil.Log($"--------- address:{itemAssetEntry.address} AssetPath:{itemAssetEntry.AssetPath}"); } string assetPathFile = itemAssetEntry.AssetPath.Remove(itemAssetEntry.AssetPath.LastIndexOf("/")); //查询保存的路径 foreach (var itemSaveGroup in addressableSaveData.dicSaveData) { string groupName = itemSaveGroup.Key; List <string> listSavePath = itemSaveGroup.Value.listPathSave; //遍历路径 如果再这个路径里 则分配要这个组 for (int f = 0; f < listSavePath.Count; f++) { string savePath = listSavePath[f]; if (assetPathFile.Equals(savePath)) { AddressableUtil.MoveAssetEntry(itemAssetEntry, groupName); AddressableUtil.ClearAllLabel(itemAssetEntry); AddressableUtil.SetLabel(itemAssetEntry, itemSaveGroup.Value.listLabel); break; } } } } EditorUtil.RefreshAsset(); EditorUI.GUIHideProgressBar(); }
/// <summary> /// 创建所有方块的mesh数据 /// </summary> public static void CreateBlockMeshData() { FileInfo[] files = FileUtil.GetFilesByPath($"{Path_Block_MeshModel}"); if (files.IsNull()) { LogUtil.Log("CreateBlockMeshData Fail No Block"); return; } AddressableAssetGroup addressableAssetGroup = AddressableUtil.FindOrCreateGroup("BlockMesh"); for (int i = 0; i < files.Length; i++) { FileInfo itemFile = files[i]; if (itemFile.Name.Contains(".meta")) { continue; } LogUtil.Log($"CreateBlockMeshData:{itemFile.Name}"); GameObject obj = EditorUtil.GetAssetByPath <GameObject>($"{Path_Block_MeshModel}/{itemFile.Name}"); Collider colliderModel = obj.GetComponentInChildren <Collider>(); //首先获取主体 Transform tfModel = obj.transform.Find("Model"); MeshFilter meshFilterModel = null; if (tfModel != null) { meshFilterModel = tfModel.GetComponentInChildren <MeshFilter>(); } MeshDataCustom meshData; if (meshFilterModel != null) { Vector3 offsetPosition = new Vector3(0.5f, 0f, 0.5f); if (tfModel != null) { offsetPosition += (tfModel.localPosition - new Vector3(0.5f, 0.5f, 0.5f)); offsetPosition += meshFilterModel.transform.localPosition + new Vector3(0f, 0.5f, 0f); } meshData = new MeshDataCustom(colliderModel, meshFilterModel.sharedMesh, 0.03125f, offsetPosition, meshFilterModel.transform.localEulerAngles); } else { meshData = new MeshDataCustom(colliderModel, 0.03125f, new Vector3(0.5f, 0f, 0.5f), Vector3.zero); } //获取Other List <Mesh> listMesh0ther = new List <Mesh>();; List <float> listSizeOther = new List <float>(); List <Vector3> listOffsetOther = new List <Vector3>(); List <Vector3> listRotateOther = new List <Vector3>(); for (int f = 1; f < 10; f++) { Transform tfOther = obj.transform.Find($"Other{f}"); if (tfOther == null) { continue; } MeshFilter meshFiltertfOther = tfOther.GetComponentInChildren <MeshFilter>(); Collider colliderOther = tfOther.GetComponentInChildren <Collider>(); if (meshFiltertfOther != null) { Vector3 offsetPosition = new Vector3(0.5f, 0f, 0.5f); offsetPosition += (tfOther.localPosition - new Vector3(0.5f, 0.5f, 0.5f)); offsetPosition += meshFiltertfOther.transform.localPosition + new Vector3(0f, 0.5f, 0f); listSizeOther.Add(0.03125f); listOffsetOther.Add(offsetPosition); listMesh0ther.Add(meshFiltertfOther.sharedMesh); listRotateOther.Add(meshFiltertfOther.transform.localEulerAngles); } } if (!listMesh0ther.IsNull()) { meshData.SetOtherMeshData(listMesh0ther, listSizeOther, listOffsetOther, listRotateOther); } string jsonData = JsonUtil.ToJson(meshData); string saveFileName = $"{itemFile.Name.Replace(".prefab", "").Replace(".obj", "")}"; //创建文件 FileUtil.CreateTextFile($"{Application.dataPath}/Prefabs/BlockMeshData", $"{saveFileName}.txt", jsonData); //添加到addressable中 string addressName = $"Assets/Prefabs/BlockMeshData/{saveFileName}.txt"; AddressableUtil.AddAssetEntry(addressableAssetGroup, addressName, addressName); } EditorUtil.RefreshAsset(); }