public static List <UINode> GetInteractiveGameobject(List <string> buttonTypes) { //string[] typeNames = new string[] { UIButtonName, UIToggleName, UIEventListenerName }; //string[] typeNamesFirst = new string[] { UIButtonNameFirstPass, UIToggleNameFirstPass, UIEventListenerNameFirstPass }; List <string> typeNames = new List <string>(); List <string> typeNamesFirst = new List <string>(); typeNames.Add(UIButtonName); typeNamesFirst.Add(UIButtonNameFirstPass); typeNames.Add(UIToggleName); typeNamesFirst.Add(UIToggleNameFirstPass); typeNames.Add(UIEventListenerName); typeNamesFirst.Add(UIEventListenerNameFirstPass); if (buttonTypes != null) { for (int i = 0; i < buttonTypes.Count; ++i) { typeNames.Add(buttonTypes[i]); typeNamesFirst.Add(buttonTypes[i]); } } HashSet <int> buffers = new HashSet <int>(); List <UINode> gameObjects = new List <UINode>(); Rectangle rect = new Rectangle(); for (int i = 0; i < typeNames.Count; ++i) { Type buttonType = Type.GetType(typeNames[i]); if (buttonType == null) { buttonType = Type.GetType(typeNamesFirst[i]); } if (buttonType != null) { Component[] objs = GameObject.FindObjectsOfType(buttonType) as Component[]; foreach (Component c in objs) { GameObject obj = c.gameObject; Logger.v("Find GameObject " + obj.name); if (!buffers.Contains(obj.GetInstanceID()) && OverUIElement(obj, ref rect)) { Rectangle rc = new Rectangle(); if (RuntimePlatform.Android == Application.platform)//安卓默认返回绝对坐标 { rc = CoordinateTool.ConvertUnity2Mobile(rect); } else if (RuntimePlatform.IPhonePlayer == Application.platform)//ios 默认返回归一化的坐标 { rc.x = rect.x / Screen.width; rc.y = 1 - rect.y / Screen.height; rc.width = rect.width / Screen.width; rc.height = rect.height / Screen.height; } UINode node = new UINode(obj, rc); buffers.Add(obj.GetInstanceID()); gameObjects.Add(node); } } } } return(gameObjects); }
/// <summary> /// 获取所有潜在的可交互的节点 /// /// /// </summary> /// <returns></returns> public static List <UINode> GetInteractiveGameobject(List <String> buttonTypes) { Logger.d("GetInteractiveGameobject"); HashSet <int> buffer = new HashSet <int>(); List <UINode> vaildGameObjects = new List <UINode>(); Canvas[] canvas = GameObject.FindObjectsOfType <Canvas>(); List <BaseRaycaster> raycaster = GetVaildRaycast(); for (int i = 0; i < canvas.Length; ++i) { GameObject gameobject = canvas[i].gameObject; //步骤1,找出当前界面下包含IEventSystemHandler的所有节点 Component[] handlers = GetIEventSystemHandler(gameobject); for (int j = 0; j < handlers.Length; ++j) { Component c = handlers[j] as Component; if (c != null && !buffer.Contains(c.gameObject.GetInstanceID())) { buffer.Add(c.gameObject.GetInstanceID()); Logger.d("UGUI may Clickable gameobject => " + c.gameObject); //步骤2,过滤掉所有被遮挡的节点。以点击中间点的方式 Rectangle rect = new Rectangle(); if (CanInputEventOverObject(raycaster, c.gameObject, ref rect)) { if (RuntimePlatform.Android == Application.platform) { //android 默认返回绝对坐标 rect = CoordinateTool.ConvertUnity2Mobile(rect); } else if (RuntimePlatform.IPhonePlayer == Application.platform) {//ios 默认返回归一化的坐标 rect.x /= Screen.width; rect.y = 1 - rect.y / Screen.height; rect.width /= Screen.width; rect.height /= Screen.height; } UINode node = new UINode(c.gameObject, rect); Logger.d("Gameobject can click " + c.gameObject); vaildGameObjects.Add(node); } } } } List <Component> comps = new List <Component>(); for (int i = 0; buttonTypes != null && i < buttonTypes.Count; ++i) { Type buttonType = Type.GetType(buttonTypes[i]); if (buttonType != null) { Component[] handlers = GameObject.FindObjectsOfType(buttonType) as Component[]; for (int j = 0; j < handlers.Length; ++j) { Component c = handlers[j] as Component; if (c != null && !buffer.Contains(c.gameObject.GetInstanceID())) { buffer.Add(c.gameObject.GetInstanceID()); Logger.d("UGUI may Clickable gameobject => " + c.gameObject); //步骤2,过滤掉所有被遮挡的节点。以点击中间点的方式 Rectangle rect = new Rectangle(); if (CanInputEventOverObject(raycaster, c.gameObject, ref rect)) { if (RuntimePlatform.Android == Application.platform)//android默认返回绝对坐标 { rect = CoordinateTool.ConvertUnity2Mobile(rect); } else if (RuntimePlatform.IPhonePlayer == Application.platform) {//ios 默认返回绝对坐标 rect.x /= Screen.width; rect.y = 1 - rect.y / Screen.height; rect.width /= Screen.width; rect.height /= Screen.height; } UINode node = new UINode(c.gameObject, rect); Logger.d("Gameobject can click " + c.gameObject); vaildGameObjects.Add(node); } } } } } return(vaildGameObjects); }