public static TankInitSystem InitTankPrefabs(VehicleData vehicleData, bool isPreviewMode) { #region Collision Detect if (vehicleData.modelData.MainModel.GetComponentsInChildren <BoxCollider>().Length == 0) { if (EditorUtility.DisplayDialog("Error", "Collision should be set.We will redirct you to it.", "OK,l will set it now!", "No,l will choose another one")) { EditorGUIUtility.PingObject(vehicleData.modelData.MainModel.GetInstanceID()); OpenEditorScene(); GameObject EditColliderInstance = Instantiate <GameObject>(vehicleData.modelData.MainModel); EditColliderInstance.name = vehicleData.modelData.MainModel.name; string TempPath = System.IO.Path.GetDirectoryName(AssetDatabase.GetAssetPath(vehicleData.modelData.MainModel.GetInstanceID())); string PrefabStoreDir = System.IO.Directory.CreateDirectory(string.Format(TempPath + "/Collisions_{0}", vehicleData.modelData.MainModel.name)).FullName; AssetDatabase.Refresh(); return(null); //PrefabUtility.CreatePrefab (string.Format (PrefabStoreDir + "/{0}.prefab", vehicleData.modelData.MainModel.name),EditColliderInstance); } else { return(null); } } #endregion GameObject TankPrefabs = new GameObject(); GameObject InstanceMesh = Instantiate(vehicleData.modelData.MainModel); try { #region Init InstanceMesh.name = vehicleData.vehicleTextData.AssetName; #endregion TankPrefabs.name = vehicleData.vehicleTextData.AssetName + "_Pre"; InstanceMesh.transform.parent = TankPrefabs.transform; InstanceMesh.transform.localPosition = vehicleData.cacheData.StartPoint; GameObject VehicleDynamics = new GameObject("VehicleDynamics"); VehicleDynamics.transform.parent = InstanceMesh.transform; Transform RightWheel, LeftWheel, RightUpperWheels, LeftUpperWheels, Turret, Gun, GunDym; #region Find Dumps RightWheel = InstanceMesh.transform.Find("RightWheel"); LeftWheel = InstanceMesh.transform.Find("LeftWheel"); Turret = InstanceMesh.transform.Find("Turret"); Gun = Turret.transform.Find("Gun"); GunDym = Gun.GetChild(0); RightUpperWheels = InstanceMesh.transform.Find("RightUpperWheel"); LeftUpperWheels = InstanceMesh.transform.Find("LeftUpperWheel"); #endregion RightWheel.parent = VehicleDynamics.transform; LeftWheel.parent = VehicleDynamics.transform; LeftUpperWheels.parent = VehicleDynamics.transform; RightUpperWheels.parent = VehicleDynamics.transform; #region FireSystem VehicleComponentsReferenceManager referenceManager = InstanceMesh.AddComponent <VehicleComponentsReferenceManager>(); var mutiTurretTransList = new List <FireSystemTransform>(); //多炮塔配置 foreach (var multiTurret in vehicleData.vehicleTextData.MultiFireSystemData) { var mTurret = InstanceMesh.transform.Find(multiTurret.turretPath); var mGun = mTurret.Find(multiTurret.gunPath); var mDym = mGun.Find(multiTurret.dymPath); var turretParent = mTurret.parent; CreateWrapper(mDym, true); CreateWrapper(mGun, true); CreateWrapper(mTurret, true); mDym.parent.SetParent(mGun.parent); mGun.parent.SetParent(mTurret.parent); mTurret.parent.SetParent(turretParent); var gunFollowerTrans = new GameObject("GunFollowerTrans").transform; gunFollowerTrans.SetParent(mGun.parent); gunFollowerTrans.localPosition = multiTurret.gunFollowerOffSet; var turretFollowerTrans = new GameObject("TurretFollowerTrans").transform; turretFollowerTrans.SetParent(mGun.parent); turretFollowerTrans.localPosition = multiTurret.turretFollowerOffSet; //多炮塔毕竟少数 var mffpoint = new GameObject("FFPoint").transform; mffpoint.SetParent(mDym.parent); mffpoint.rotation = mDym.parent.rotation; mffpoint.position = mDym.parent.position + mDym.parent.forward * multiTurret.ffPointOffSet; var meffectStart = new GameObject("EffectStart").transform; meffectStart.SetParent(mDym.parent); meffectStart.rotation = mDym.parent.rotation; meffectStart.position = mDym.parent.position + mDym.parent.forward * multiTurret.effectStartOffSet; //但是 我们依然设置 Icon 方便编辑 IconManager.SetIcon(mffpoint.gameObject, IconManager.LabelIcon.Red); IconManager.SetIcon(meffectStart.gameObject, IconManager.LabelIcon.Red); mutiTurretTransList.Add( new FireSystemTransform { turret = mTurret.parent, gun = mGun.parent, dym = mDym.parent, ffPoint = mffpoint, fireEffectPoint = meffectStart, gunFollowerTrans = gunFollowerTrans, }); } referenceManager.mutiTurretTrans = mutiTurretTransList; GameObject TurretTransform = new GameObject("TurretTransform"); GameObject GunTransform = new GameObject("GunTransform"); GameObject GunDymTransform = new GameObject("GunDym"); TurretTransform.transform.SetParent(InstanceMesh.transform); TurretTransform.transform.position = Turret.transform.position; GunTransform.transform.position = Gun.transform.position; Turret.parent = TurretTransform.transform; Gun.parent = GunTransform.transform; GunTransform.transform.SetParent(TurretTransform.transform); GunDymTransform.transform.position = GunDym.transform.position; GunDymTransform.transform.SetParent(GunTransform.transform); GunDym.SetParent(GunDymTransform.transform); #endregion AddDumpNode("FFPoint", GunTransform.transform, vehicleData, true, referenceManager); AddDumpNode("EffectStart", GunTransform.transform, vehicleData, true, referenceManager); AddDumpNode("FireForceFeedbackPoint", GunTransform.transform, vehicleData, true, referenceManager); AddDumpNode("EngineSmoke", InstanceMesh.transform, vehicleData, true, referenceManager); AddDumpNode("EngineSound", InstanceMesh.transform, vehicleData, true, referenceManager); AddDumpNode("MainCameraFollowTarget", InstanceMesh.transform, vehicleData, true, referenceManager); AddDumpNode("MainCameraGunner", GunTransform.transform, vehicleData, true, referenceManager); AddDumpNode("CenterOfGravity", InstanceMesh.transform, vehicleData, true, referenceManager); AddDumpNode("BotPoint", InstanceMesh.transform, vehicleData, true, referenceManager); referenceManager.LeftTrack = InstanceMesh.transform.Find("LeftTrack").gameObject; referenceManager.RightTrack = InstanceMesh.transform.Find("RightTrack").gameObject; referenceManager.LeftWheels = ResortWheelTrans(GetChilds(LeftWheel)); referenceManager.RightWheels = ResortWheelTrans(GetChilds(RightWheel)); referenceManager.LeftUpperWheels = ResortWheelTrans(GetChilds(LeftUpperWheels)); referenceManager.RightUpperWheels = ResortWheelTrans(GetChilds(RightUpperWheels)); GameObject HitBoxInstance = Instantiate <GameObject>(vehicleData.modelData.HitBox.HitBoxPrefab); HitBoxInstance.transform.position += vehicleData.cacheData.StartPoint; referenceManager.MainHitBox = HitBoxInstance.transform.Find("Main").gameObject; referenceManager.TurretHitBox = HitBoxInstance.transform.Find("Turret").gameObject; referenceManager.GunHitBox = HitBoxInstance.transform.Find("Gun").gameObject; referenceManager.DymHitBox = HitBoxInstance.transform.Find("Dym").gameObject; HitBoxInstance.transform.Find("Main").name = "MainHitBox"; HitBoxInstance.transform.Find("MainHitBox").SetParent(InstanceMesh.transform); HitBoxInstance.transform.Find("Turret").name = "TurretHitBox"; HitBoxInstance.transform.Find("TurretHitBox").SetParent(TurretTransform.transform); HitBoxInstance.transform.Find("Gun").name = "GunHitBox"; HitBoxInstance.transform.Find("GunHitBox").SetParent(GunTransform.transform); HitBoxInstance.transform.Find("Dym").name = "DymHitBox"; HitBoxInstance.transform.Find("DymHitBox").SetParent(GunDymTransform.transform); DestroyImmediate(HitBoxInstance); new GameObject("MainCameraTarget").transform.SetParent(TurretTransform.transform); TankInitSystem initySystem = TankPrefabs.AddComponent <TankInitSystem>(); initySystem.vehicleTextData = vehicleData.vehicleTextData; #region Vehicle Physic var vehiclePhysic = InstanceMesh.AddComponent <Rigidbody>(); vehiclePhysic.mass = vehicleData.vehicleTextData.PTCParameter.Mass; vehiclePhysic.drag = 0.1f; vehiclePhysic.angularDrag = 2.5f; vehiclePhysic.useGravity = true; referenceManager.VehiclePhysic = vehiclePhysic; #endregion referenceManager.VehicleDynamics = VehicleDynamics; referenceManager.TurretGameObject = TurretTransform; referenceManager.GunGameObject = GunTransform; referenceManager.GunDymGameObject = GunDymTransform; if (!isPreviewMode) { CreateWrapper(referenceManager.MainCameraFollowTarget.transform); CreateWrapper(referenceManager.MainCameraGunner.transform); } return(initySystem); } catch (System.Exception exception) { EditorUtility.DisplayDialog("Exception", exception.Message + "\n" + exception.StackTrace, "OK"); DestroyImmediate(TankPrefabs); throw exception; } }
TankInitSystem InitTankPrefabs() { #region Collision Detect if (vehicleData.modelData.MainModel.GetComponentsInChildren <BoxCollider>().Length == 0) { if (EditorUtility.DisplayDialog("Error", "Collision should be set.We will redirct you to it.", "OK,l will set it now!", "No,l will choose another one")) { EditorGUIUtility.PingObject(vehicleData.modelData.MainModel.GetInstanceID()); OpenEditorScene(); GameObject EditColliderInstance = Instantiate <GameObject>(vehicleData.modelData.MainModel); EditColliderInstance.name = vehicleData.modelData.MainModel.name; string TempPath = System.IO.Path.GetDirectoryName(AssetDatabase.GetAssetPath(vehicleData.modelData.MainModel.GetInstanceID())); string PrefabStoreDir = System.IO.Directory.CreateDirectory(string.Format(TempPath + "/Collisions_{0}", vehicleData.modelData.MainModel.name)).FullName; AssetDatabase.Refresh(); return(null); //PrefabUtility.CreatePrefab (string.Format (PrefabStoreDir + "/{0}.prefab", vehicleData.modelData.MainModel.name),EditColliderInstance); } else { return(null); } } #endregion GameObject TankPrefabs = new GameObject(); GameObject InstanceMesh = Instantiate(vehicleData.modelData.MainModel); try { #region Init InstanceMesh.name = vehicleData.modelData.MainModel.name; #endregion TankPrefabs.name = InstanceMesh.name + "_Pre"; InstanceMesh.transform.parent = TankPrefabs.transform; GameObject TankTransform = new GameObject("TankTransform"); TankTransform.transform.parent = InstanceMesh.transform; Transform RightWheel, LeftWheel, RightUpperWheels, LeftUpperWheels, Turret, Gun, GunDym; #region Find Dumps RightWheel = InstanceMesh.transform.Find("RightWheel"); LeftWheel = InstanceMesh.transform.Find("LeftWheel"); Turret = InstanceMesh.transform.Find("Turret"); Gun = Turret.transform.Find("Gun"); GunDym = Gun.GetChild(0); RightUpperWheels = InstanceMesh.transform.Find("RightUpperWheel"); LeftUpperWheels = InstanceMesh.transform.Find("LeftUpperWheel"); #endregion RightWheel.parent = TankTransform.transform; LeftWheel.parent = TankTransform.transform; LeftUpperWheels.parent = TankTransform.transform; RightUpperWheels.parent = TankTransform.transform; GameObject TurretTransform = new GameObject("TurretTransform"); GameObject GunTransform = new GameObject("GunTransform"); GameObject GunDymTransform = new GameObject("GunDym"); VehicleComponentsReferenceManager referenceManager = InstanceMesh.AddComponent <VehicleComponentsReferenceManager>(); TurretTransform.transform.SetParent(InstanceMesh.transform); TurretTransform.transform.position = Turret.transform.position; GunTransform.transform.position = Gun.transform.position; Turret.parent = TurretTransform.transform; Gun.parent = GunTransform.transform; GunTransform.transform.SetParent(TurretTransform.transform); GunDymTransform.transform.position = GunDym.transform.position; GunDymTransform.transform.SetParent(GunTransform.transform); GunDym.SetParent(GunDymTransform.transform); #region Add fire animation Animator FireAnimator = GunDymTransform.AddComponent <Animator>(); FireAnimator.runtimeAnimatorController = vehicleData.vehicleTextData.TFParameter.GymAnimation; #endregion AddDumpNode("FFPoint", GunTransform.transform, true, referenceManager); AddDumpNode("EffectStart", GunTransform.transform, true, referenceManager); AddDumpNode("FireForceFeedbackPoint", GunTransform.transform, true, referenceManager); AddDumpNode("EngineSmoke", InstanceMesh.transform, true, referenceManager); AddDumpNode("EngineSound", InstanceMesh.transform, true, referenceManager); AddDumpNode("MainCameraFollowTarget", InstanceMesh.transform, true, referenceManager); AddDumpNode("MainCameraGunner", GunTransform.transform, true, referenceManager); AddDumpNode("MachineGunFFPoint", TurretTransform.transform, true, referenceManager); AddDumpNode("CenterOfGravity", InstanceMesh.transform, true, referenceManager); referenceManager.LeftTrack = InstanceMesh.transform.Find("LeftTrack").gameObject; referenceManager.RightTrack = InstanceMesh.transform.Find("RightTrack").gameObject; GameObject HitBoxInstance = Instantiate <GameObject>(vehicleData.modelData.HitBox.HitBoxPrefab); HitBoxInstance.transform.Find("Main").name = "MainHitBox"; HitBoxInstance.transform.Find("MainHitBox").SetParent(InstanceMesh.transform); HitBoxInstance.transform.Find("Turret").name = "TurretHitBox"; HitBoxInstance.transform.Find("TurretHitBox").SetParent(TurretTransform.transform); HitBoxInstance.transform.Find("Gun").name = "GunHitBox"; HitBoxInstance.transform.Find("GunHitBox").SetParent(GunTransform.transform); HitBoxInstance.transform.Find("Dym").name = "DymHitBox"; HitBoxInstance.transform.Find("DymHitBox").SetParent(GunDymTransform.transform); DestroyImmediate(HitBoxInstance); Restore(LeftWheel.GetComponentsInChildren <Transform>()); Restore(RightWheel.GetComponentsInChildren <Transform>()); Restore(LeftUpperWheels.GetComponentsInChildren <Transform>()); Restore(RightUpperWheels.GetComponentsInChildren <Transform>()); new GameObject("MainCameraTarget").transform.SetParent(TurretTransform.transform); TankInitSystem initySystem = TankPrefabs.AddComponent <TankInitSystem>(); initySystem.PSParameter = vehicleData.vehicleTextData.PSParameter; initySystem.TFParameter = vehicleData.vehicleTextData.TFParameter; initySystem.MTParameter = vehicleData.vehicleTextData.MTParameter; initySystem.PTCParameter = vehicleData.vehicleTextData.PTCParameter; return(initySystem); } catch (System.Exception exception) { EditorUtility.DisplayDialog("Exception", exception.Message + "\n" + exception.StackTrace, "OK"); DestroyImmediate(TankPrefabs); throw exception; return(null); } }
TankInitSystem InitTankPrefabs() { #region 碰撞检测 if (vehicleData.modelData.MainModel.GetComponentsInChildren <BoxCollider> ().Length == 0) { if (EditorUtility.DisplayDialog("错误", "坦克模型必须设置完毕碰撞数据", "好的,立刻去设置", "重新选择资源")) { EditorGUIUtility.PingObject(vehicleData.modelData.MainModel.GetInstanceID()); OpenEditorScene(); GameObject EditColliderInstance = Instantiate <GameObject> (vehicleData.modelData.MainModel); EditColliderInstance.name = vehicleData.modelData.MainModel.name; string TempPath = System.IO.Path.GetDirectoryName(AssetDatabase.GetAssetPath(vehicleData.modelData.MainModel.GetInstanceID())); string PrefabStoreDir = System.IO.Directory.CreateDirectory(string.Format(TempPath + "/Collisions_{0}", vehicleData.modelData.MainModel.name)).FullName; AssetDatabase.Refresh(); //PrefabUtility.CreatePrefab (string.Format (PrefabStoreDir + "/{0}.prefab", vehicleData.modelData.MainModel.name),EditColliderInstance); } else { return(null); } } #endregion #region 初始化 坦克物体变量 GameObject TankPrefabs = new GameObject(); GameObject InstanceMesh = Instantiate(vehicleData.modelData.MainModel); InstanceMesh.name = vehicleData.modelData.MainModel.name; #endregion TankPrefabs.name = InstanceMesh.name + "_Pre"; InstanceMesh.transform.parent = TankPrefabs.transform; GameObject TankTransform = new GameObject("TankTransform"); TankTransform.transform.parent = InstanceMesh.transform; Transform RightWheel, LeftWheel, RightUpperWheels, LeftUpperWheels, Turret, Gun, GunDym; #region 在模型上寻找虚拟对象 RightWheel = InstanceMesh.transform.Find("RightWheel"); LeftWheel = InstanceMesh.transform.Find("LeftWheel"); Turret = InstanceMesh.transform.Find("Turret"); Gun = Turret.transform.Find("Gun"); GunDym = Gun.GetChild(0); RightUpperWheels = InstanceMesh.transform.Find("RightUpperWheel"); LeftUpperWheels = InstanceMesh.transform.Find("LeftUpperWheel"); #endregion RightWheel.parent = TankTransform.transform; LeftWheel.parent = TankTransform.transform; LeftUpperWheels.parent = TankTransform.transform; RightUpperWheels.parent = TankTransform.transform; #region 实例化坦克的附加物体 坦克控制器 坦克脚本 坦克ui 坦克瞄准镜 主摄像机 坦克引擎声音 坦克引擎烟雾 死亡效果 //EngineSmoke = new GameObject("EngineSmoke"); //LeftTrackEffect = new GameObject("LeftTrackEffect"); //RightTrackEffect=new GameObject("RightTrackEffect"); #endregion GameObject TurretTransform = new GameObject("TurretTransform"); GameObject GunTransform = new GameObject("GunTransform"); GameObject GunDymTransform = new GameObject("GunDym"); VehicleComponentsReferenceManager referenceManager = InstanceMesh.AddComponent <VehicleComponentsReferenceManager>(); //GameObject MainHitBox = new GameObject ("MainHitBox"); //GameObject TurretHitBox = new GameObject ("TurretHitBox"); TurretTransform.transform.SetParent(InstanceMesh.transform); TurretTransform.transform.position = Turret.transform.position; GunTransform.transform.position = Gun.transform.position; Turret.parent = TurretTransform.transform; Gun.parent = GunTransform.transform; GunTransform.transform.SetParent(TurretTransform.transform); GunDymTransform.transform.position = GunDym.transform.position; GunDymTransform.transform.SetParent(GunTransform.transform); GunDym.SetParent(GunDymTransform.transform); #region 发射动画 Animator FireAnimator = GunDymTransform.AddComponent <Animator> (); FireAnimator.runtimeAnimatorController = vehicleData.vehicleTextData.TFParameter.GymAnimation; #endregion AddDumpNode("FFPoint", GunTransform.transform, true, referenceManager); AddDumpNode("EffectStart", GunTransform.transform, true, referenceManager); AddDumpNode("FireForceFeedbackPoint", InstanceMesh.transform, true, referenceManager); AddDumpNode("EngineSmoke", InstanceMesh.transform, true, referenceManager); AddDumpNode("EngineSound", InstanceMesh.transform, true, referenceManager); AddDumpNode("MainCameraFollowTarget", InstanceMesh.transform, true, referenceManager); AddDumpNode("MainCameraGunner", GunTransform.transform, true, referenceManager); AddDumpNode("MachineGunFFPoint", TurretTransform.transform, true, referenceManager); AddDumpNode("CenterOfGravity", InstanceMesh.transform, true, referenceManager); //MainHitBox.transform.parent = TankModel.transform; //TurretHitBox.transform.parent = TurretTransform.transform; //EngineSmoke.transform.parent = TankModel.transform; //EngineSmoke.tag = "EngineSmoke"; // GameObject LODMesh = new GameObject ("LODMesh"); // LODMesh.transform.SetParent (TankModel.transform); // LODMesh.tag = "LODMesh"; GameObject HitBoxInstance = Instantiate <GameObject> (vehicleData.modelData.HitBox.HitBoxPrefab); HitBoxInstance.transform.Find("Main").name = "MainHitBox"; HitBoxInstance.transform.Find("MainHitBox").SetParent(InstanceMesh.transform); HitBoxInstance.transform.Find("Turret").name = "TurretHitBox"; HitBoxInstance.transform.Find("TurretHitBox").SetParent(TurretTransform.transform); HitBoxInstance.transform.Find("Gun").name = "GunHitBox"; HitBoxInstance.transform.Find("GunHitBox").SetParent(GunTransform.transform); HitBoxInstance.transform.Find("Dym").name = "DymHitBox"; HitBoxInstance.transform.Find("DymHitBox").SetParent(GunDymTransform.transform); DestroyImmediate(HitBoxInstance); //HitBoxInstance.transform.Find("Dym").SetParent() Restore(LeftWheel.GetComponentsInChildren <Transform> ()); Restore(RightWheel.GetComponentsInChildren <Transform> ()); Restore(LeftUpperWheels.GetComponentsInChildren <Transform> ()); Restore(RightUpperWheels.GetComponentsInChildren <Transform> ()); new GameObject("MainCameraTarget").transform.SetParent(TurretTransform.transform); TankInitSystem initySystem = TankPrefabs.AddComponent <TankInitSystem>(); initySystem.PSParameter = vehicleData.vehicleTextData.PSParameter; initySystem.TFParameter = vehicleData.vehicleTextData.TFParameter; initySystem.MTParameter = vehicleData.vehicleTextData.MTParameter; initySystem.PTCParameter = vehicleData.vehicleTextData.PTCParameter; return(initySystem); }