using System; using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; using UnityEngine.Events; using XFramework; public static class GameObjectCreater { /// /// 异步加载AB包创建车队 创建完成后执行完成事件 /// public static async void CreateCarFromAB(List carDatas, Transform parent, UnityAction createrOverAction) { Dictionary> taskDic = new Dictionary>(); Dictionary nameToTaskDic = new Dictionary(); for (int i = 0; i < carDatas.Count; i++) { string prefabName = "武器修理工程车";//后续根据车辆名称完善 现阶段所有车型用同一个模型 nameToTaskDic.Add(carDatas[i].carName, prefabName);// if (!taskDic.ContainsKey(prefabName))//避免加载重复资源 { string path = StreamingAssetsManager.GetPath(prefabName);//根据预制件名称获取资源路径 taskDic.Add(prefabName, AssetBundleHelper.LoadABPrefab(path, prefabName)); } if (!string.IsNullOrEmpty(carDatas[i].onboardEquip))//该车辆存在展开时的车载装备 加载车载装备 { string childPrefabName = "600平米帐篷";//后续按照车载装备名称完善 现阶段所有只有一个车载模型 if (!taskDic.ContainsKey(childPrefabName))//避免加载重复资源 { nameToTaskDic.Add(carDatas[i].onboardEquip, childPrefabName);//车载物体没有分配好唯一名称 string childPrefabPath = StreamingAssetsManager.GetPath(childPrefabName);//根据预制件名称获取资源路径 taskDic.Add(childPrefabName, AssetBundleHelper.LoadABPrefab(childPrefabPath, childPrefabName)); } } } await Task.WhenAll(taskDic.Values);//等待所有的车辆和车载物体加载完成 for (int i = 0; i < carDatas.Count; i++) { //string path = StreamingAssetsManager.GetPath("武器修理工程车");//后续按照车辆名称完善 //GameObject prefab = await AssetBundleHelper.LoadABPrefab(path, "武器修理工程车"); GameObject prefab = taskDic[nameToTaskDic[carDatas[i].carName]].Result;//获取资源加载线程的资源 可能为空 后续处理为空情况 GameObject newGO = GameObject.Instantiate(prefab); newGO.transform.parent = parent; CarCtrl carCtrl = newGO.AddComponent(); carCtrl.SetInitData(carDatas[i]); if (!string.IsNullOrEmpty(carDatas[i].onboardEquip))//该车辆存在展开时的车载装备 加载车载装备 { //string equipPath =StreamingAssetsManager.GetPath("600平米帐篷");//后续按照车载装备名称完善 //GameObject equipPrefab = await AssetBundleHelper.LoadABPrefab(equipPath, carDatas[i].onboardEquip); GameObject equipPrefab = taskDic[nameToTaskDic[carDatas[i].onboardEquip]].Result;//获取资源加载线程的资源 可能为空 后续处理为空情况 carCtrl.SetOnboardEquip(equipPrefab, $"{carDatas[i].carName}_{carDatas[i].onboardEquip}"); } Crat3DText(carCtrl, new Vector3(0, 6, 0), "MainCamText", Camera.main.transform, LookAtState.LookAt);//创建展示车辆名称的3D文字 GameObjectManager.Instance.SetNewCar(carCtrl); } createrOverAction?.Invoke(); } /// /// 创建突发事件触发器 /// /// internal static void CreateTufaTrigger(List tuFaDatas, Transform parent) { for (int i = 0; i < tuFaDatas.Count; i++) { GameObject newTufa = new GameObject($"TuFa_{tuFaDatas[i].name.ToString()}"); newTufa.transform.SetParent(parent); newTufa.transform.position = MapHelper.GetWorldPosFromAnchPos(new Vector2(tuFaDatas[i].posX, tuFaDatas[i].posY)); TuFaTriggerInstanceCtrl tuFaTrigger = newTufa.AddComponent(); tuFaTrigger.InitTrigger(tuFaDatas[i].name, tuFaDatas[i].ID); GameObjectManager.Instance.InjeectGO(ManagerGOTypes.tufa, tuFaTrigger.gameObject, tuFaDatas[i].ID); } } /// /// 创建展示AB包中装备名称的3D文字 /// /// public static void Crat3DText(IShowName3DText useGO,Vector3 localPos,string layerName, Transform lookTarget, LookAtState lookAtState,float textSzie=0) { GameObject nameTextPrefab = ResourcesManager.Load("Name3DText"); Text3DCtrl text3DCtrl= GameObject.Instantiate(nameTextPrefab, useGO.GetTrans()).GetComponent(); if (text3DCtrl) { text3DCtrl.transform.localPosition = localPos; text3DCtrl.SetLookTarget(lookTarget); text3DCtrl.LookAtState = lookAtState; text3DCtrl.SetLayer(layerName); text3DCtrl.SetTextSize(textSzie); useGO.Bind3DText(text3DCtrl); } else { Debug.Log("3D文字预制件未挂载Text3DCtrl无法完成初始化"); } } /// /// 创建VR虚拟同步人物模型 初始化物体名称 /// public static void CreatSyncVRPerson(List allUser) { GameObject vrPersonPrafab = ResourcesManager.Load("VR_PersonSyncPrefab"); for (int i = 0; i < allUser.Count; i++) { VRPersonSyncHandlerCtrl vRPerson = GameObject.Instantiate(vrPersonPrafab).GetComponent(); vRPerson.SetUser(allUser[i].userName, allUser[i].ip); } } }