public static void ResetAllCollider() { GameColliderSet colliderSet = new GameColliderSet(); var guids = AssetDatabase.FindAssets("t:GameObject", new string[] { "Assets/ResourceEx/Prefab" }); int count = guids.Length; for (int i = 0; i < count; i++) { EditorUtility.DisplayProgressBar("更新碰撞框数据", "正在更新碰撞框数据(" + i + "/" + count + ")", i / (float)count); string goPath = AssetDatabase.GUIDToAssetPath(guids[i]); GameObject gameObject = AssetDatabase.LoadAssetAtPath <GameObject>(goPath); GameColliderView colliderView = gameObject.GetComponent <GameColliderView>(); if (colliderView != null) { GameColliderItem colliderItem = new GameColliderItem(); colliderItem.path = goPath; FindCollider(gameObject.transform, gameObject.transform, colliderItem); colliderSet.mLstColliderItem.Add(colliderItem); } } NEUtil.SerializerObject(GameColliderCfgSys.GameColliderPath, colliderSet, GameColliderCfgSys.RelateTypes); EditorUtility.ClearProgressBar(); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); }
private static void FindCollider(Transform root, Transform trans, GameColliderItem gameColliderItem) { int count = trans.childCount; for (int i = 0; i < count; i++) { var child = trans.GetChild(i); if (child.tag == "GameCollider" && gameColliderItem != null) { Collider collider = child.GetComponent <Collider>(); if (collider != null) { var scale = child.lossyScale; collider.enabled = false; if (scale.x != 1 || scale.y != 1 || scale.z != 1) { EditorUtility.DisplayDialog("提示", "child=" + child.name + "不能有缩放", "知道了"); return; } if (collider is SphereCollider) { SphereCollider sphereCollider = (SphereCollider)collider; CircleColliderData colliderData = new CircleColliderData(); colliderData.name = child.name; colliderData.gameColliderType = GameColliderType.CircleCollider; Vector3 center = child.TransformPoint(sphereCollider.center); var localCenter = root.InverseTransformPoint(center); colliderData.center = new TSVector(FP.FromFloat(localCenter.x), 0, FP.FromFloat(localCenter.z)); var localForward = child.forward; colliderData.forward = new TSVector(FP.FromFloat(localForward.x), 0, FP.FromFloat(localForward.z)); colliderData.radius = FP.FromFloat(sphereCollider.radius); gameColliderItem.mLstData.Add(colliderData); } else if (collider is BoxCollider) { BoxCollider boxCollider = (BoxCollider)collider; RectColliderData colliderData = new RectColliderData(); colliderData.name = child.name; colliderData.gameColliderType = GameColliderType.RectCollider; Vector3 center = child.TransformPoint(boxCollider.center); var localCenter = root.InverseTransformPoint(center); colliderData.center = new TSVector(FP.FromFloat(localCenter.x), 0, FP.FromFloat(localCenter.z)); var localForward = child.forward; colliderData.forward = new TSVector(FP.FromFloat(localForward.x), 0, FP.FromFloat(localForward.z)); colliderData.halfWidth = FP.FromFloat(boxCollider.size.x / 2f); colliderData.halfHeight = FP.FromFloat(boxCollider.size.z / 2f); gameColliderItem.mLstData.Add(colliderData); } else { EditorUtility.DisplayDialog("提示", "暂时不支持" + collider.GetType().ToString() + "碰撞框(请删除它再重试)", "知道了"); return; } } } FindCollider(root, child, gameColliderItem); } }
private void LoadData() { TextAsset textAsset = AssetDatabase.LoadAssetAtPath <TextAsset>(GameColliderCfgSys.GameColliderPath); m_cColliderSet = null; if (textAsset != null) { var bytes = textAsset.bytes; m_cColliderSet = NEUtil.DeSerializerObjectFromBuff(bytes, typeof(GameColliderSet), GameColliderCfgSys.RelateTypes) as GameColliderSet; } if (m_cColliderSet == null) { m_cColliderSet = new GameColliderSet(); } GameColliderView colliderView = (GameColliderView)target; PrefabType prefabType = PrefabUtility.GetPrefabType(colliderView.gameObject); Debug.Log(prefabType); m_bIsPrefab = (prefabType == PrefabType.Prefab || prefabType == PrefabType.PrefabInstance); if (m_bIsPrefab) { UnityEngine.Object prefab = null; if (prefabType == PrefabType.PrefabInstance) { prefab = PrefabUtility.GetPrefabParent(colliderView.gameObject); } else { prefab = colliderView.gameObject; } Debug.Log(prefab); if (m_cColliderSet != null && prefab != null) { string path = AssetDatabase.GetAssetPath(prefab); Debug.Log("path:" + path); m_cColliderItem = m_cColliderSet.GetColliderItem(path); if (m_cColliderItem == null) { m_cColliderItem = new GameColliderItem(); m_cColliderItem.path = path; m_cColliderSet.mLstColliderItem.Add(m_cColliderItem); } } } }