| | |
| | | |
| | | namespace Poco |
| | | { |
| | | public class UnityNode : AbstractNode |
| | | { |
| | | public static Dictionary<string, string> TypeNames = new Dictionary<string, string>() { |
| | | { "Text", "Text" }, |
| | | { "Gradient Text", "Gradient.Text" }, |
| | | { "Image", "Image" }, |
| | | { "RawImage", "Raw.Image" }, |
| | | { "Mask", "Mask" }, |
| | | { "2DRectMask", "2D-Rect.Mask" }, |
| | | { "Button", "Button" }, |
| | | { "InputField", "InputField" }, |
| | | { "Toggle", "Toggle" }, |
| | | { "Toggle Group", "ToggleGroup" }, |
| | | { "Slider", "Slider" }, |
| | | { "ScrollBar", "ScrollBar" }, |
| | | { "DropDown", "DropDown" }, |
| | | { "ScrollRect", "ScrollRect" }, |
| | | { "Selectable", "Selectable" }, |
| | | { "Camera", "Camera" }, |
| | | { "RectTransform", "Node" }, |
| | | }; |
| | | public static string DefaultTypeName = "GameObject"; |
| | | private GameObject gameObject; |
| | | private Renderer renderer; |
| | | private RectTransform rectTransform; |
| | | private Rect rect; |
| | | private Vector2 objectPos; |
| | | private List<string> components; |
| | | private Camera camera; |
| | | public class UnityNode : AbstractNode |
| | | { |
| | | public static Dictionary<string, string> TypeNames = new Dictionary<string, string>() { |
| | | { "Text", "Text" }, |
| | | { "Gradient Text", "Gradient.Text" }, |
| | | { "Image", "Image" }, |
| | | { "RawImage", "Raw.Image" }, |
| | | { "Mask", "Mask" }, |
| | | { "2DRectMask", "2D-Rect.Mask" }, |
| | | { "Button", "Button" }, |
| | | { "InputField", "InputField" }, |
| | | { "Toggle", "Toggle" }, |
| | | { "Toggle Group", "ToggleGroup" }, |
| | | { "Slider", "Slider" }, |
| | | { "ScrollBar", "ScrollBar" }, |
| | | { "DropDown", "DropDown" }, |
| | | { "ScrollRect", "ScrollRect" }, |
| | | { "Selectable", "Selectable" }, |
| | | { "Camera", "Camera" }, |
| | | { "RectTransform", "Node" }, |
| | | }; |
| | | public static string DefaultTypeName = "GameObject"; |
| | | private GameObject gameObject; |
| | | private Renderer renderer; |
| | | private RectTransform rectTransform; |
| | | private Rect rect; |
| | | private Vector2 objectPos; |
| | | private List<string> components; |
| | | private Camera camera; |
| | | |
| | | |
| | | public UnityNode(GameObject obj) |
| | | { |
| | | gameObject = obj; |
| | | camera = Camera.main; |
| | | foreach (var cam in Camera.allCameras) { |
| | | // skip the main camera |
| | | // we want to use specified camera first then fallback to main camera if no other cameras |
| | | // for further advanced cases, we could test whether the game object is visible within the camera |
| | | if (cam == Camera.main) { |
| | | continue; |
| | | } |
| | | if ((cam.cullingMask & (1 << gameObject.layer)) != 0) { |
| | | camera = cam; |
| | | } |
| | | } |
| | | public UnityNode(GameObject obj) |
| | | { |
| | | gameObject = obj; |
| | | camera = Camera.main; |
| | | foreach (var cam in Camera.allCameras) |
| | | { |
| | | // skip the main camera |
| | | // we want to use specified camera first then fallback to main camera if no other cameras |
| | | // for further advanced cases, we could test whether the game object is visible within the camera |
| | | if (cam == Camera.main) |
| | | { |
| | | continue; |
| | | } |
| | | if ((cam.cullingMask & (1 << gameObject.layer)) != 0) |
| | | { |
| | | camera = cam; |
| | | } |
| | | } |
| | | |
| | | renderer = gameObject.GetComponent<Renderer>(); |
| | | rectTransform = gameObject.GetComponent<RectTransform>(); |
| | | rect = GameObjectRect(renderer, rectTransform); |
| | | objectPos = renderer ? WorldToGUIPoint(camera, renderer.bounds.center) : Vector2.zero; |
| | | components = GameObjectAllComponents(); |
| | | } |
| | | renderer = gameObject.GetComponent<Renderer>(); |
| | | rectTransform = gameObject.GetComponent<RectTransform>(); |
| | | rect = GameObjectRect(renderer, rectTransform); |
| | | objectPos = renderer ? WorldToGUIPoint(camera, renderer.bounds.center) : Vector2.zero; |
| | | components = GameObjectAllComponents(); |
| | | } |
| | | |
| | | public override AbstractNode getParent() |
| | | { |
| | | GameObject parentObj = gameObject.transform.parent.gameObject; |
| | | return new UnityNode(parentObj); |
| | | } |
| | | public override AbstractNode getParent() |
| | | { |
| | | GameObject parentObj = gameObject.transform.parent.gameObject; |
| | | return new UnityNode(parentObj); |
| | | } |
| | | |
| | | public override List<AbstractNode> getChildren() |
| | | { |
| | | List<AbstractNode> children = new List<AbstractNode>(); |
| | | foreach (Transform child in gameObject.transform) |
| | | { |
| | | children.Add(new UnityNode(child.gameObject)); |
| | | } |
| | | return children; |
| | | } |
| | | public override List<AbstractNode> getChildren() |
| | | { |
| | | List<AbstractNode> children = new List<AbstractNode>(); |
| | | foreach (Transform child in gameObject.transform) |
| | | { |
| | | children.Add(new UnityNode(child.gameObject)); |
| | | } |
| | | return children; |
| | | } |
| | | |
| | | public override object getAttr(string attrName) |
| | | { |
| | | switch (attrName) |
| | | { |
| | | case "name": |
| | | return gameObject.name; |
| | | case "type": |
| | | return GuessObjectTypeFromComponentNames(components); |
| | | case "visible": |
| | | return GameObjectVisible(renderer, components); |
| | | case "pos": |
| | | return GameObjectPosInScreen(objectPos, renderer, rectTransform, rect); |
| | | case "size": |
| | | return GameObjectSizeInScreen(rect, rectTransform); |
| | | case "scale": |
| | | return new List<float>() { 1.0f, 1.0f }; |
| | | case "anchorPoint": |
| | | return GameObjectAnchorInScreen(renderer, rect, objectPos); |
| | | case "zOrders": |
| | | return GameObjectzOrders(); |
| | | case "clickable": |
| | | return GameObjectClickable(components); |
| | | case "text": |
| | | return GameObjectText(); |
| | | case "components": |
| | | return components; |
| | | case "texture": |
| | | return GetImageSourceTexture(); |
| | | case "tag": |
| | | return GameObjectTag(); |
| | | case "layer": |
| | | return GameObjectLayerName (); |
| | | public override object getAttr(string attrName) |
| | | { |
| | | switch (attrName) |
| | | { |
| | | case "name": |
| | | return gameObject.name; |
| | | case "type": |
| | | return GuessObjectTypeFromComponentNames(components); |
| | | case "visible": |
| | | return GameObjectVisible(renderer, components); |
| | | case "pos": |
| | | return GameObjectPosInScreen(objectPos, renderer, rectTransform, rect); |
| | | case "size": |
| | | return GameObjectSizeInScreen(rect, rectTransform); |
| | | case "scale": |
| | | return new List<float>() { 1.0f, 1.0f }; |
| | | case "anchorPoint": |
| | | return GameObjectAnchorInScreen(renderer, rect, objectPos); |
| | | case "zOrders": |
| | | return GameObjectzOrders(); |
| | | case "clickable": |
| | | return GameObjectClickable(components); |
| | | case "text": |
| | | return GameObjectText(); |
| | | case "components": |
| | | return components; |
| | | case "texture": |
| | | return GetImageSourceTexture(); |
| | | case "tag": |
| | | return GameObjectTag(); |
| | | case "layer": |
| | | return GameObjectLayerName(); |
| | | case "_ilayer": |
| | | return GameObjectLayer (); |
| | | return GameObjectLayer(); |
| | | case "_instanceId": |
| | | return gameObject.GetInstanceID (); |
| | | default: |
| | | return null; |
| | | } |
| | | } |
| | | return gameObject.GetInstanceID(); |
| | | default: |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | |
| | | public override Dictionary<string, object> enumerateAttrs() |
| | | { |
| | | Dictionary<string, object> payload = GetPayload(); |
| | | Dictionary<string, object> ret = new Dictionary<string, object>(); |
| | | foreach (KeyValuePair<string, object> p in payload) |
| | | { |
| | | if (p.Value != null) |
| | | { |
| | | ret.Add(p.Key, p.Value); |
| | | } |
| | | } |
| | | return ret; |
| | | } |
| | | public override Dictionary<string, object> enumerateAttrs() |
| | | { |
| | | Dictionary<string, object> payload = GetPayload(); |
| | | Dictionary<string, object> ret = new Dictionary<string, object>(); |
| | | foreach (KeyValuePair<string, object> p in payload) |
| | | { |
| | | if (p.Value != null) |
| | | { |
| | | ret.Add(p.Key, p.Value); |
| | | } |
| | | } |
| | | return ret; |
| | | } |
| | | |
| | | |
| | | private Dictionary<string, object> GetPayload() |
| | | { |
| | | Dictionary<string, object> payload = new Dictionary<string, object>() { |
| | | { "name", gameObject.name }, |
| | | { "type", GuessObjectTypeFromComponentNames (components) }, |
| | | { "visible", GameObjectVisible (renderer, components) }, |
| | | { "pos", GameObjectPosInScreen (objectPos, renderer, rectTransform, rect) }, |
| | | { "size", GameObjectSizeInScreen (rect, rectTransform) }, |
| | | { "scale", new List<float> (){ 1.0f, 1.0f } }, |
| | | { "anchorPoint", GameObjectAnchorInScreen (renderer, rect, objectPos) }, |
| | | { "zOrders", GameObjectzOrders () }, |
| | | { "clickable", GameObjectClickable (components) }, |
| | | { "text", GameObjectText () }, |
| | | { "components", components }, |
| | | { "texture", GetImageSourceTexture () }, |
| | | { "tag", GameObjectTag () }, |
| | | { "_ilayer", GameObjectLayer() }, |
| | | { "layer", GameObjectLayerName() }, |
| | | { "_instanceId", gameObject.GetInstanceID () }, |
| | | }; |
| | | return payload; |
| | | } |
| | | private Dictionary<string, object> GetPayload() |
| | | { |
| | | Dictionary<string, object> payload = new Dictionary<string, object>() { |
| | | { "name", gameObject.name }, |
| | | { "type", GuessObjectTypeFromComponentNames (components) }, |
| | | { "visible", GameObjectVisible (renderer, components) }, |
| | | { "pos", GameObjectPosInScreen (objectPos, renderer, rectTransform, rect) }, |
| | | { "size", GameObjectSizeInScreen (rect, rectTransform) }, |
| | | { "scale", new List<float> (){ 1.0f, 1.0f } }, |
| | | { "anchorPoint", GameObjectAnchorInScreen (renderer, rect, objectPos) }, |
| | | { "zOrders", GameObjectzOrders () }, |
| | | { "clickable", GameObjectClickable (components) }, |
| | | { "text", GameObjectText () }, |
| | | { "components", components }, |
| | | { "texture", GetImageSourceTexture () }, |
| | | { "tag", GameObjectTag () }, |
| | | { "_ilayer", GameObjectLayer() }, |
| | | { "layer", GameObjectLayerName() }, |
| | | { "_instanceId", gameObject.GetInstanceID () }, |
| | | }; |
| | | return payload; |
| | | } |
| | | |
| | | private string GuessObjectTypeFromComponentNames(List<string> components) |
| | | { |
| | | List<string> cns = new List<string>(components); |
| | | cns.Reverse(); |
| | | foreach (string name in cns) |
| | | { |
| | | if (TypeNames.ContainsKey (name)) |
| | | { |
| | | return TypeNames [name]; |
| | | } |
| | | } |
| | | return DefaultTypeName; |
| | | } |
| | | private string GuessObjectTypeFromComponentNames(List<string> components) |
| | | { |
| | | List<string> cns = new List<string>(components); |
| | | cns.Reverse(); |
| | | foreach (string name in cns) |
| | | { |
| | | if (TypeNames.ContainsKey(name)) |
| | | { |
| | | return TypeNames[name]; |
| | | } |
| | | } |
| | | return DefaultTypeName; |
| | | } |
| | | |
| | | private bool GameObjectVisible(Renderer renderer, List<string> components) |
| | | { |
| | | if (gameObject.activeInHierarchy) |
| | | { |
| | | bool light = components.Contains("Light"); |
| | | // bool mesh = components.Contains ("MeshRenderer") && components.Contains ("MeshFilter"); |
| | | bool particle = components.Contains("ParticleSystem") && components.Contains("ParticleSystemRenderer"); |
| | | if (light || particle) |
| | | { |
| | | return false; |
| | | } |
| | | else |
| | | { |
| | | return renderer ? renderer.isVisible : true; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | return false; |
| | | } |
| | | } |
| | | private bool GameObjectVisible(Renderer renderer, List<string> components) |
| | | { |
| | | if (gameObject.activeInHierarchy) |
| | | { |
| | | bool light = components.Contains("Light"); |
| | | // bool mesh = components.Contains ("MeshRenderer") && components.Contains ("MeshFilter"); |
| | | bool particle = components.Contains("ParticleSystem") && components.Contains("ParticleSystemRenderer"); |
| | | if (light || particle) |
| | | { |
| | | return false; |
| | | } |
| | | else |
| | | { |
| | | return renderer ? renderer.isVisible : true; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | private int GameObjectLayer() |
| | | { |
| | | return gameObject.layer; |
| | | } |
| | | private string GameObjectLayerName() |
| | | { |
| | | return LayerMask.LayerToName (gameObject.layer); |
| | | } |
| | | private int GameObjectLayer() |
| | | { |
| | | return gameObject.layer; |
| | | } |
| | | private string GameObjectLayerName() |
| | | { |
| | | return LayerMask.LayerToName(gameObject.layer); |
| | | } |
| | | |
| | | private bool GameObjectClickable(List<string> components) |
| | | { |
| | | Button button = gameObject.GetComponent<Button>(); |
| | | return button ? button.isActiveAndEnabled : false; |
| | | } |
| | | private bool GameObjectClickable(List<string> components) |
| | | { |
| | | Button button = gameObject.GetComponent<Button>(); |
| | | return button ? button.isActiveAndEnabled : false; |
| | | } |
| | | |
| | | private string GameObjectText() |
| | | { |
| | | Text text = gameObject.GetComponent<Text>(); |
| | | return text ? text.text : null; |
| | | } |
| | | private string GameObjectText() |
| | | { |
| | | Text text = gameObject.GetComponent<Text>(); |
| | | return text ? text.text : null; |
| | | } |
| | | |
| | | private string GameObjectTag() |
| | | { |
| | | string tag; |
| | | try |
| | | { |
| | | tag = !gameObject.CompareTag("Untagged") ? gameObject.tag : null; |
| | | } |
| | | catch (UnityException) |
| | | { |
| | | tag = null; |
| | | } |
| | | return tag; |
| | | } |
| | | private string GameObjectTag() |
| | | { |
| | | string tag; |
| | | try |
| | | { |
| | | tag = !gameObject.CompareTag("Untagged") ? gameObject.tag : null; |
| | | } |
| | | catch (UnityException) |
| | | { |
| | | tag = null; |
| | | } |
| | | return tag; |
| | | } |
| | | |
| | | private List<string> GameObjectAllComponents() |
| | | { |
| | | List<string> components = new List<string> (); |
| | | Component[] allComponents = gameObject.GetComponents<Component> (); |
| | | if (allComponents != null) |
| | | { |
| | | foreach (Component ac in allComponents) |
| | | { |
| | | if (ac != null) |
| | | { |
| | | components.Add (ac.GetType ().Name); |
| | | } |
| | | } |
| | | } |
| | | return components; |
| | | } |
| | | private List<string> GameObjectAllComponents() |
| | | { |
| | | List<string> components = new List<string>(); |
| | | Component[] allComponents = gameObject.GetComponents<Component>(); |
| | | if (allComponents != null) |
| | | { |
| | | foreach (Component ac in allComponents) |
| | | { |
| | | if (ac != null) |
| | | { |
| | | components.Add(ac.GetType().Name); |
| | | } |
| | | } |
| | | } |
| | | return components; |
| | | } |
| | | |
| | | private Dictionary<string, float> GameObjectzOrders() |
| | | { |
| | | float CameraViewportPoint = 0; |
| | | if (camera != null) |
| | | { |
| | | CameraViewportPoint = Math.Abs(camera.WorldToViewportPoint(gameObject.transform.position).z); |
| | | } |
| | | Dictionary<string, float> zOrders = new Dictionary<string, float>() { |
| | | { "global", 0f }, |
| | | { "local", -1 * CameraViewportPoint } |
| | | }; |
| | | return zOrders; |
| | | } |
| | | private Dictionary<string, float> GameObjectzOrders() |
| | | { |
| | | float CameraViewportPoint = 0; |
| | | if (camera != null) |
| | | { |
| | | CameraViewportPoint = Math.Abs(camera.WorldToViewportPoint(gameObject.transform.position).z); |
| | | } |
| | | Dictionary<string, float> zOrders = new Dictionary<string, float>() { |
| | | { "global", 0f }, |
| | | { "local", -1 * CameraViewportPoint } |
| | | }; |
| | | return zOrders; |
| | | } |
| | | |
| | | private Rect GameObjectRect(Renderer renderer, RectTransform rectTransform) |
| | | { |
| | | Rect rect = new Rect(0, 0, 0, 0); |
| | | if (renderer) |
| | | { |
| | | rect = RendererToScreenSpace(camera, renderer); |
| | | } |
| | | else if (rectTransform) |
| | | { |
| | | rect = RectTransformToScreenSpace(rectTransform); |
| | | } |
| | | return rect; |
| | | } |
| | | private Rect GameObjectRect(Renderer renderer, RectTransform rectTransform) |
| | | { |
| | | Rect rect = new Rect(0, 0, 0, 0); |
| | | if (renderer) |
| | | { |
| | | rect = RendererToScreenSpace(camera, renderer); |
| | | } |
| | | else if (rectTransform) |
| | | { |
| | | rect = RectTransformToScreenSpace(rectTransform); |
| | | } |
| | | return rect; |
| | | } |
| | | |
| | | private float[] GameObjectPosInScreen(Vector3 objectPos, Renderer renderer, RectTransform rectTransform, Rect rect) |
| | | { |
| | | float[] pos = { 0f, 0f }; |
| | | private float[] GameObjectPosInScreen(Vector3 objectPos, Renderer renderer, RectTransform rectTransform, Rect rect) |
| | | { |
| | | float[] pos = { 0f, 0f }; |
| | | |
| | | if (renderer) |
| | | { |
| | | // 3d object |
| | | pos[0] = objectPos.x / (float)Screen.width; |
| | | pos[1] = objectPos.y / (float)Screen.height; |
| | | } |
| | | else if (rectTransform) |
| | | { |
| | | // ui object (rendered on screen space, other render modes may be different) |
| | | // use center pos for now |
| | | Canvas rootCanvas = GetRootCanvas (gameObject); |
| | | RenderMode renderMode = rootCanvas != null ? rootCanvas.renderMode : new RenderMode (); |
| | | switch (renderMode) |
| | | { |
| | | case RenderMode.ScreenSpaceCamera: |
| | | //上一个方案经过实际测试发现还有两个问题存在 |
| | | //1.在有Canvas Scaler修改了RootCanvas的Scale的情况下坐标的抓取仍然不对,影响到了ScreenSpaceCameram模式在不同分辨率和屏幕比例下识别的兼容性。 |
| | | //2.RectTransformUtility转的 rectTransform.transform.position本质上得到的是RectTransform.pivot中心轴在屏幕上的坐标,如果pivot不等于(0.5,0.5), |
| | | //那么获取到的position就不等于图形的中心点。 |
| | | //试了一晚上,找到了解决办法。 |
| | | if (renderer) |
| | | { |
| | | // 3d object |
| | | pos[0] = objectPos.x / (float)Screen.width; |
| | | pos[1] = objectPos.y / (float)Screen.height; |
| | | } |
| | | else if (rectTransform) |
| | | { |
| | | // ui object (rendered on screen space, other render modes may be different) |
| | | // use center pos for now |
| | | Canvas rootCanvas = GetRootCanvas(gameObject); |
| | | RenderMode renderMode = rootCanvas != null ? rootCanvas.renderMode : new RenderMode(); |
| | | switch (renderMode) |
| | | { |
| | | case RenderMode.ScreenSpaceCamera: |
| | | //上一个方案经过实际测试发现还有两个问题存在 |
| | | //1.在有Canvas Scaler修改了RootCanvas的Scale的情况下坐标的抓取仍然不对,影响到了ScreenSpaceCameram模式在不同分辨率和屏幕比例下识别的兼容性。 |
| | | //2.RectTransformUtility转的 rectTransform.transform.position本质上得到的是RectTransform.pivot中心轴在屏幕上的坐标,如果pivot不等于(0.5,0.5), |
| | | //那么获取到的position就不等于图形的中心点。 |
| | | //试了一晚上,找到了解决办法。 |
| | | |
| | | //用MainCanvas转一次屏幕坐标 |
| | | Vector2 position = RectTransformUtility.WorldToScreenPoint(rootCanvas.worldCamera, rectTransform.transform.position); |
| | |
| | | pos[1] = position.y / Screen.height; |
| | | break; |
| | | case RenderMode.WorldSpace: |
| | | Vector2 _pos = RectTransformUtility.WorldToScreenPoint (rootCanvas.worldCamera, rectTransform.transform.position); |
| | | pos [0] = _pos.x / Screen.width; |
| | | pos [1] = (Screen.height - _pos.y) / Screen.height; |
| | | Vector2 _pos = RectTransformUtility.WorldToScreenPoint(rootCanvas.worldCamera, rectTransform.transform.position); |
| | | pos[0] = _pos.x / Screen.width; |
| | | pos[1] = (Screen.height - _pos.y) / Screen.height; |
| | | break; |
| | | default: |
| | | pos[0] = rect.center.x / (float)Screen.width; |
| | | pos[1] = rect.center.y / (float)Screen.height; |
| | | break; |
| | | } |
| | | } |
| | | return pos; |
| | | } |
| | | } |
| | | } |
| | | return pos; |
| | | } |
| | | |
| | | private Canvas GetRootCanvas (GameObject gameObject) |
| | | { |
| | | Canvas canvas = gameObject.GetComponentInParent<Canvas> (); |
| | | // 如果unity版本小于unity5.5,就用递归的方式取吧,没法直接取rootCanvas |
| | | // 如果有用到4.6以下版本的话就自己手动在这里添加条件吧 |
| | | private Canvas GetRootCanvas(GameObject gameObject) |
| | | { |
| | | Canvas canvas = gameObject.GetComponentInParent<Canvas>(); |
| | | // 如果unity版本小于unity5.5,就用递归的方式取吧,没法直接取rootCanvas |
| | | // 如果有用到4.6以下版本的话就自己手动在这里添加条件吧 |
| | | #if UNITY_4_6 || UNITY_4_7 || UNITY_4_8 || UNITY_4_9 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 || UNITY_5_3 || UNITY_5_4 |
| | | if (canvas && canvas.isRootCanvas) { |
| | | return canvas; |
| | |
| | | } |
| | | } |
| | | #else |
| | | if (canvas && canvas.isRootCanvas) |
| | | { |
| | | return canvas; |
| | | } |
| | | else if (canvas) |
| | | { |
| | | return canvas.rootCanvas; |
| | | } |
| | | else |
| | | { |
| | | return null; |
| | | } |
| | | if (canvas && canvas.isRootCanvas) |
| | | { |
| | | return canvas; |
| | | } |
| | | else if (canvas) |
| | | { |
| | | return canvas.rootCanvas; |
| | | } |
| | | else |
| | | { |
| | | return null; |
| | | } |
| | | #endif |
| | | } |
| | | } |
| | | |
| | | private float[] GameObjectSizeInScreen(Rect rect, RectTransform rectTransform) |
| | | { |
| | | float[] size = { 0f, 0f }; |
| | | if (rectTransform) |
| | | { |
| | | Canvas rootCanvas = GetRootCanvas (gameObject); |
| | | RenderMode renderMode = rootCanvas != null ? rootCanvas.renderMode : new RenderMode (); |
| | | switch (renderMode) |
| | | { |
| | | case RenderMode.ScreenSpaceCamera: |
| | | Rect _rect = RectTransformUtility.PixelAdjustRect (rectTransform, rootCanvas); |
| | | size = new float[] { |
| | | private float[] GameObjectSizeInScreen(Rect rect, RectTransform rectTransform) |
| | | { |
| | | float[] size = { 0f, 0f }; |
| | | if (rectTransform) |
| | | { |
| | | Canvas rootCanvas = GetRootCanvas(gameObject); |
| | | RenderMode renderMode = rootCanvas != null ? rootCanvas.renderMode : new RenderMode(); |
| | | switch (renderMode) |
| | | { |
| | | case RenderMode.ScreenSpaceCamera: |
| | | Rect _rect = RectTransformUtility.PixelAdjustRect(rectTransform, rootCanvas); |
| | | size = new float[] { |
| | | _rect.width * rootCanvas.scaleFactor / (float)Screen.width, |
| | | _rect.height * rootCanvas.scaleFactor / (float)Screen.height |
| | | }; |
| | | break; |
| | | case RenderMode.WorldSpace: |
| | | Rect rect_ = rectTransform.rect; |
| | | RectTransform canvasTransform = rootCanvas.GetComponent<RectTransform>(); |
| | | size = new float[] { rect_.width / canvasTransform.rect.width, rect_.height / canvasTransform.rect.height }; |
| | | break; |
| | | default: |
| | | size = new float[] { rect.width / (float)Screen.width, rect.height / (float)Screen.height }; |
| | | break; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | size = new float[] { rect.width / (float)Screen.width, rect.height / (float)Screen.height }; |
| | | } |
| | | return size; |
| | | } |
| | | break; |
| | | case RenderMode.WorldSpace: |
| | | Rect rect_ = rectTransform.rect; |
| | | RectTransform canvasTransform = rootCanvas.GetComponent<RectTransform>(); |
| | | size = new float[] { rect_.width / canvasTransform.rect.width, rect_.height / canvasTransform.rect.height }; |
| | | break; |
| | | default: |
| | | size = new float[] { rect.width / (float)Screen.width, rect.height / (float)Screen.height }; |
| | | break; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | size = new float[] { rect.width / (float)Screen.width, rect.height / (float)Screen.height }; |
| | | } |
| | | return size; |
| | | } |
| | | |
| | | private float[] GameObjectAnchorInScreen(Renderer renderer, Rect rect, Vector3 objectPos) |
| | | { |
| | | float[] defaultValue = { 0.5f, 0.5f }; |
| | | if (rectTransform) |
| | | { |
| | | Vector2 data = rectTransform.pivot; |
| | | defaultValue[0] = data[0]; |
| | | defaultValue[1] = 1 - data[1]; |
| | | return defaultValue; |
| | | } |
| | | if (!renderer) |
| | | { |
| | | //<Modified> some object do not have renderer |
| | | return defaultValue; |
| | | } |
| | | float[] anchor = { (objectPos.x - rect.xMin) / rect.width, (objectPos.y - rect.yMin) / rect.height }; |
| | | if (Double.IsNaN(anchor[0]) || Double.IsNaN(anchor[1])) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | else if (Double.IsPositiveInfinity(anchor[0]) || Double.IsPositiveInfinity(anchor[1])) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | else if (Double.IsNegativeInfinity(anchor[0]) || Double.IsNegativeInfinity(anchor[1])) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | else |
| | | { |
| | | return anchor; |
| | | } |
| | | } |
| | | private float[] GameObjectAnchorInScreen(Renderer renderer, Rect rect, Vector3 objectPos) |
| | | { |
| | | float[] defaultValue = { 0.5f, 0.5f }; |
| | | if (rectTransform) |
| | | { |
| | | Vector2 data = rectTransform.pivot; |
| | | defaultValue[0] = data[0]; |
| | | defaultValue[1] = 1 - data[1]; |
| | | return defaultValue; |
| | | } |
| | | if (!renderer) |
| | | { |
| | | //<Modified> some object do not have renderer |
| | | return defaultValue; |
| | | } |
| | | float[] anchor = { (objectPos.x - rect.xMin) / rect.width, (objectPos.y - rect.yMin) / rect.height }; |
| | | if (Double.IsNaN(anchor[0]) || Double.IsNaN(anchor[1])) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | else if (Double.IsPositiveInfinity(anchor[0]) || Double.IsPositiveInfinity(anchor[1])) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | else if (Double.IsNegativeInfinity(anchor[0]) || Double.IsNegativeInfinity(anchor[1])) |
| | | { |
| | | return defaultValue; |
| | | } |
| | | else |
| | | { |
| | | return anchor; |
| | | } |
| | | } |
| | | |
| | | private string GetImageSourceTexture() |
| | | { |
| | | Image image = gameObject.GetComponent<Image>(); |
| | | if (image != null && image.sprite != null) |
| | | { |
| | | return image.sprite.name; |
| | | } |
| | | private string GetImageSourceTexture() |
| | | { |
| | | Image image = gameObject.GetComponent<Image>(); |
| | | if (image != null && image.sprite != null) |
| | | { |
| | | return image.sprite.name; |
| | | } |
| | | |
| | | RawImage rawImage = gameObject.GetComponent<RawImage>(); |
| | | if (rawImage != null && rawImage.texture != null) |
| | | { |
| | | return rawImage.texture.name; |
| | | } |
| | | RawImage rawImage = gameObject.GetComponent<RawImage>(); |
| | | if (rawImage != null && rawImage.texture != null) |
| | | { |
| | | return rawImage.texture.name; |
| | | } |
| | | |
| | | SpriteRenderer spriteRenderer = gameObject.GetComponent<SpriteRenderer>(); |
| | | if (spriteRenderer != null && spriteRenderer.sprite != null) |
| | | { |
| | | return spriteRenderer.sprite.name; |
| | | } |
| | | SpriteRenderer spriteRenderer = gameObject.GetComponent<SpriteRenderer>(); |
| | | if (spriteRenderer != null && spriteRenderer.sprite != null) |
| | | { |
| | | return spriteRenderer.sprite.name; |
| | | } |
| | | |
| | | Renderer render = gameObject.GetComponent<Renderer>(); |
| | | if (renderer != null && renderer.material != null) |
| | | { |
| | | return renderer.material.color.ToString(); |
| | | } |
| | | Renderer render = gameObject.GetComponent<Renderer>(); |
| | | if (renderer != null && renderer.material != null) |
| | | { |
| | | return renderer.material.color.ToString(); |
| | | } |
| | | |
| | | return null; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | protected static Vector2 WorldToGUIPoint(Camera camera, Vector3 world) |
| | | { |
| | | Vector2 screenPoint = Vector2.zero; |
| | | if (camera != null) |
| | | { |
| | | screenPoint = camera.WorldToScreenPoint(world); |
| | | screenPoint.y = (float)Screen.height - screenPoint.y; |
| | | } |
| | | return screenPoint; |
| | | } |
| | | protected static Vector2 WorldToGUIPoint(Camera camera, Vector3 world) |
| | | { |
| | | Vector2 screenPoint = Vector2.zero; |
| | | if (camera != null) |
| | | { |
| | | screenPoint = camera.WorldToScreenPoint(world); |
| | | screenPoint.y = (float)Screen.height - screenPoint.y; |
| | | } |
| | | return screenPoint; |
| | | } |
| | | |
| | | protected static Rect RendererToScreenSpace(Camera camera, Renderer renderer) |
| | | { |
| | | Vector3 cen = renderer.bounds.center; |
| | | Vector3 ext = renderer.bounds.extents; |
| | | Vector2[] extentPoints = new Vector2[8] { |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x - ext.x, cen.y - ext.y, cen.z - ext.z)), |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x + ext.x, cen.y - ext.y, cen.z - ext.z)), |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x - ext.x, cen.y - ext.y, cen.z + ext.z)), |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x + ext.x, cen.y - ext.y, cen.z + ext.z)), |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x - ext.x, cen.y + ext.y, cen.z - ext.z)), |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x + ext.x, cen.y + ext.y, cen.z - ext.z)), |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x - ext.x, cen.y + ext.y, cen.z + ext.z)), |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x + ext.x, cen.y + ext.y, cen.z + ext.z)) |
| | | }; |
| | | Vector2 min = extentPoints[0]; |
| | | Vector2 max = extentPoints[0]; |
| | | foreach (Vector2 v in extentPoints) |
| | | { |
| | | min = Vector2.Min(min, v); |
| | | max = Vector2.Max(max, v); |
| | | } |
| | | return new Rect(min.x, min.y, max.x - min.x, max.y - min.y); |
| | | } |
| | | protected static Rect RendererToScreenSpace(Camera camera, Renderer renderer) |
| | | { |
| | | Vector3 cen = renderer.bounds.center; |
| | | Vector3 ext = renderer.bounds.extents; |
| | | Vector2[] extentPoints = new Vector2[8] { |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x - ext.x, cen.y - ext.y, cen.z - ext.z)), |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x + ext.x, cen.y - ext.y, cen.z - ext.z)), |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x - ext.x, cen.y - ext.y, cen.z + ext.z)), |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x + ext.x, cen.y - ext.y, cen.z + ext.z)), |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x - ext.x, cen.y + ext.y, cen.z - ext.z)), |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x + ext.x, cen.y + ext.y, cen.z - ext.z)), |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x - ext.x, cen.y + ext.y, cen.z + ext.z)), |
| | | WorldToGUIPoint (camera, new Vector3 (cen.x + ext.x, cen.y + ext.y, cen.z + ext.z)) |
| | | }; |
| | | Vector2 min = extentPoints[0]; |
| | | Vector2 max = extentPoints[0]; |
| | | foreach (Vector2 v in extentPoints) |
| | | { |
| | | min = Vector2.Min(min, v); |
| | | max = Vector2.Max(max, v); |
| | | } |
| | | return new Rect(min.x, min.y, max.x - min.x, max.y - min.y); |
| | | } |
| | | |
| | | protected static Rect RectTransformToScreenSpace(RectTransform rectTransform) |
| | | { |
| | | Vector2 size = Vector2.Scale(rectTransform.rect.size, rectTransform.lossyScale); |
| | | Rect rect = new Rect(rectTransform.position.x, Screen.height - rectTransform.position.y, size.x, size.y); |
| | | rect.x -= (rectTransform.pivot.x * size.x); |
| | | rect.y -= ((1.0f - rectTransform.pivot.y) * size.y); |
| | | return rect; |
| | | } |
| | | protected static Rect RectTransformToScreenSpace(RectTransform rectTransform) |
| | | { |
| | | Vector2 size = Vector2.Scale(rectTransform.rect.size, rectTransform.lossyScale); |
| | | Rect rect = new Rect(rectTransform.position.x, Screen.height - rectTransform.position.y, size.x, size.y); |
| | | rect.x -= (rectTransform.pivot.x * size.x); |
| | | rect.y -= ((1.0f - rectTransform.pivot.y) * size.y); |
| | | return rect; |
| | | } |
| | | |
| | | public static bool SetText (GameObject go, string textVal) |
| | | { |
| | | if (go != null) |
| | | { |
| | | var inputField = go.GetComponent<InputField>(); |
| | | if (inputField != null) |
| | | { |
| | | inputField.text = textVal; |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | public static bool SetText(GameObject go, string textVal) |
| | | { |
| | | if (go != null) |
| | | { |
| | | var inputField = go.GetComponent<InputField>(); |
| | | if (inputField != null) |
| | | { |
| | | inputField.text = textVal; |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | } |