少年修仙传客户端代码仓库
client_Wu Xijin
2018-08-14 a6b4579b7c83b90d940f48977dfb06c74f5b3c68
Utility/UIUtility.cs
@@ -1,335 +1,352 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using Snxxz.UI;
public static class UIUtility
{
    public static GameObject CreateWidget(string _sourceName, string _name)
    {
        var prefab = UILoader.LoadPrefab(_sourceName);
        if (prefab == null)
        {
            return null;
        }
        var instance = GameObject.Instantiate(prefab);
        instance.name = string.IsNullOrEmpty(_name) ? _sourceName : _name;
        return instance;
    }
    public static T GetComponent<T>(this Transform transform, string path) where T : Component
    {
        if (transform == null || string.IsNullOrEmpty(path))
        {
            return null;
        }
        var _child = transform.Find(path);
        if (_child == null)
        {
            return null;
        }
        else
        {
            return _child.GetComponent<T>();
        }
    }
    public static T GetComponent<T>(this Component component, string path) where T : Component
    {
        if (component == null || string.IsNullOrEmpty(path))
        {
            return null;
        }
        var _child = component.transform.Find(path);
        if (_child == null)
        {
            return null;
        }
        else
        {
            return _child.GetComponent<T>();
        }
    }
    public static T GetComponent<T>(this GameObject gameObject, string path) where T : Component
    {
        if (gameObject == null || string.IsNullOrEmpty(path))
        {
            return null;
        }
        var _child = gameObject.transform.Find(path);
        if (_child == null)
        {
            return null;
        }
        else
        {
            return _child.GetComponent<T>();
        }
    }
    public static Vector2 GetMaxWorldPosition(this RectTransform _rectTransform)
    {
        Vector2 max;
        var offsetY = (1 - _rectTransform.pivot.y) * _rectTransform.rect.height;
        var offsetX = (1 - _rectTransform.pivot.x) * _rectTransform.rect.width;
        max = _rectTransform.TransformPoint(offsetX, offsetY, 0);
        return max;
    }
    public static Vector2 GetMinWorldPosition(this RectTransform _rectTransform)
    {
        Vector2 min;
        var offsetY = -_rectTransform.pivot.y * _rectTransform.rect.height;
        var offsetX = -_rectTransform.pivot.x * _rectTransform.rect.width;
        min = _rectTransform.TransformPoint(offsetX, offsetY, 0);
        return min;
    }
    public static Vector2 GetMaxReferencePosition(this RectTransform _rectTransform, Transform _reference)
    {
        Vector2 max;
        var offsetY = (1 - _rectTransform.pivot.y) * _rectTransform.rect.height;
        var offsetX = (1 - _rectTransform.pivot.x) * _rectTransform.rect.width;
        max = _rectTransform.TransformPoint(offsetX, offsetY, 0);
        max = _reference.InverseTransformVector(max);
        return max;
    }
    public static Vector2 GetMinReferencePosition(this RectTransform _rectTransform, Transform _reference)
    {
        Vector2 min;
        var offsetY = -_rectTransform.pivot.y * _rectTransform.rect.height;
        var offsetX = -_rectTransform.pivot.x * _rectTransform.rect.width;
        min = _rectTransform.TransformPoint(offsetX, offsetY, 0);
        min = _reference.InverseTransformVector(min);
        return min;
    }
    public static int RayCrossingCount(Vector2 p, List<Vector3> vertices)
    {
        var crossNum = 0;
        for (int i = 0, count = vertices.Count; i < count; i++)
        {
            var v1 = vertices[i];
            var v2 = vertices[(i + 1) % count];
            if (((v1.y <= p.y) && (v2.y > p.y))
                || ((v1.y > p.y) && (v2.y <= p.y)))
            {
                if (p.x < v1.x + (p.y - v1.y) / (v2.y - v1.y) * (v2.x - v1.x))
                {
                    crossNum += 1;
                }
            }
        }
        return crossNum;
    }
    public static UIVertex PackageUIVertex(Vector3 _position, Vector2 _uv0, Color _color)
    {
        var vertex = new UIVertex();
        vertex.position = _position;
        vertex.uv0 = _uv0;
        vertex.color = _color;
        return vertex;
    }
    public static UIVertex PackageUIVertexUV1(Vector3 _position, Vector2 _uv1, Color _color)
    {
        var vertex = new UIVertex();
        vertex.position = _position;
        vertex.uv1 = _uv1;
        vertex.color = _color;
        return vertex;
    }
    public static Vector3 ClampWorldPosition(RectTransform _area, PointerEventData _data)
    {
        if (_area == null || _data == null)
        {
            return Vector3.zero;
        }
        else
        {
            var worldMousePos = Vector3.zero;
            if (RectTransformUtility.ScreenPointToWorldPointInRectangle(_area, _data.position, _data.pressEventCamera, out worldMousePos))
            {
                return worldMousePos;
            }
            else
            {
                return _data.pointerCurrentRaycast.worldPosition;
            }
        }
    }
    public static bool RectTransformContain(RectTransform _area, RectTransform _test)
    {
        if (_area == null || _test == null)
        {
            return false;
        }
        var worldcornersA = new Vector3[4];
        _area.GetWorldCorners(worldcornersA);
        var worldcornersB = new Vector3[4];
        _test.GetWorldCorners(worldcornersB);
        var a = new Quadrangle(worldcornersA[0].x, worldcornersA[0].y, worldcornersA[2].x, worldcornersA[2].y);
        var b = new Quadrangle(worldcornersB[0].x, worldcornersB[0].y, worldcornersB[2].x, worldcornersB[2].y);
        if (a.minX > b.maxX || a.maxX < b.minX || a.minY > b.maxY || a.maxY < b.minY)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    struct Quadrangle
    {
        public float minX;
        public float minY;
        public float maxX;
        public float maxY;
        public Quadrangle(float _minX, float _minY, float _maxX, float _maxY)
        {
            this.minX = _minX;
            this.minY = _minY;
            this.maxX = _maxX;
            this.maxY = _maxY;
        }
    }
    public static Vector2 GetEdge(List<UIVertex> _vertexs, int _axis)
    {
        if (_vertexs == null || _vertexs.Count == 0)
        {
            DesignDebug.Log("非法顶点数据");
            return Vector2.zero;
        }
        if (_axis != 0 && _axis != 1)
        {
            DesignDebug.Log("非法轴");
            return Vector2.zero;
        }
        var count = _vertexs.Count;
        var min = _vertexs[0].position[_axis];
        var max = _vertexs[0].position[_axis];
        for (int i = 1; i < count; i++)
        {
            if (_vertexs[i].position[_axis] < min)
            {
                min = _vertexs[i].position[_axis];
            }
            else if (_vertexs[i].position[_axis] > max)
            {
                max = _vertexs[i].position[_axis];
            }
        }
        return new Vector2(min, max);
    }
    public static void AddQuad(VertexHelper vertexHelper, Vector3[] quadPositions, Color32 color, Vector2[] quadUVs)
    {
        if (quadPositions == null || quadPositions.Length < 4)
        {
            DesignDebug.Log("非法顶点数组");
            return;
        }
        if (quadUVs == null || quadUVs.Length < 4)
        {
            DesignDebug.Log("非法UV数组");
            return;
        }
        var currentVertCount = vertexHelper.currentVertCount;
        for (var i = 0; i < 4; i++)
        {
            vertexHelper.AddVert(quadPositions[i], color, quadUVs[i]);
        }
        vertexHelper.AddTriangle(currentVertCount, currentVertCount + 1, currentVertCount + 2);
        vertexHelper.AddTriangle(currentVertCount + 2, currentVertCount + 3, currentVertCount);
    }
    public static void AddTriangle(VertexHelper vertexHelper, Vector3[] positions, Color32 color, Vector2[] uvs)
    {
        if (positions == null || positions.Length < 3)
        {
            DesignDebug.Log("非法顶点数组");
            return;
        }
        if (uvs == null || uvs.Length < 3)
        {
            DesignDebug.Log("非法UV数组");
            return;
        }
        var currentVertCount = vertexHelper.currentVertCount;
        for (var i = 0; i < 3; i++)
        {
            vertexHelper.AddVert(positions[i], color, uvs[i]);
        }
        vertexHelper.AddTriangle(currentVertCount, currentVertCount + 1, currentVertCount + 2);
    }
    public static string GetUIElementRelativePath(UIRoot _root, Transform _transform)
    {
        List<Transform> parents = new List<Transform>() { _transform };
        GetParents(_transform, ref parents);
        if (parents.Contains(_root.transform))
        {
            parents.Remove(_root.transform);
        }
        var names = new string[parents.Count];
        for (int i = 0; i < names.Length; i++)
        {
            names[i] = parents[i].gameObject.name;
        }
        return string.Join("/", names);
    }
    public static void GetParents(Transform _transform, ref List<Transform> _parents)
    {
        if (_transform == null || _parents == null)
        {
            return;
        }
        if (_transform.parent != null)
        {
            _parents.Insert(0, _transform.parent);
            GetParents(_transform.parent, ref _parents);
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using Snxxz.UI;
public static class UIUtility
{
    public static GameObject CreateWidget(string _sourceName, string _name)
    {
        var prefab = UILoader.LoadPrefab(_sourceName);
        if (prefab == null)
        {
            return null;
        }
        var instance = GameObject.Instantiate(prefab);
        instance.name = string.IsNullOrEmpty(_name) ? _sourceName : _name;
        return instance;
    }
    public static T GetComponent<T>(this Transform transform, string path) where T : Component
    {
        if (transform == null || string.IsNullOrEmpty(path))
        {
            return null;
        }
        var _child = transform.Find(path);
        if (_child == null)
        {
            return null;
        }
        else
        {
            return _child.GetComponent<T>();
        }
    }
    public static T GetComponent<T>(this Component component, string path) where T : Component
    {
        if (component == null || string.IsNullOrEmpty(path))
        {
            return null;
        }
        var _child = component.transform.Find(path);
        if (_child == null)
        {
            return null;
        }
        else
        {
            return _child.GetComponent<T>();
        }
    }
    public static T GetComponent<T>(this GameObject gameObject, string path) where T : Component
    {
        if (gameObject == null || string.IsNullOrEmpty(path))
        {
            return null;
        }
        var _child = gameObject.transform.Find(path);
        if (_child == null)
        {
            return null;
        }
        else
        {
            return _child.GetComponent<T>();
        }
    }
    public static Vector2 GetMaxWorldPosition(this RectTransform _rectTransform)
    {
        Vector2 max;
        var offsetY = (1 - _rectTransform.pivot.y) * _rectTransform.rect.height;
        var offsetX = (1 - _rectTransform.pivot.x) * _rectTransform.rect.width;
        max = _rectTransform.TransformPoint(offsetX, offsetY, 0);
        return max;
    }
    public static Vector2 GetMinWorldPosition(this RectTransform _rectTransform)
    {
        Vector2 min;
        var offsetY = -_rectTransform.pivot.y * _rectTransform.rect.height;
        var offsetX = -_rectTransform.pivot.x * _rectTransform.rect.width;
        min = _rectTransform.TransformPoint(offsetX, offsetY, 0);
        return min;
    }
    public static Vector2 GetMaxReferencePosition(this RectTransform _rectTransform, Transform _reference)
    {
        Vector2 max;
        var offsetY = (1 - _rectTransform.pivot.y) * _rectTransform.rect.height;
        var offsetX = (1 - _rectTransform.pivot.x) * _rectTransform.rect.width;
        max = _rectTransform.TransformPoint(offsetX, offsetY, 0);
        max = _reference.InverseTransformVector(max);
        return max;
    }
    public static Vector2 GetMinReferencePosition(this RectTransform _rectTransform, Transform _reference)
    {
        Vector2 min;
        var offsetY = -_rectTransform.pivot.y * _rectTransform.rect.height;
        var offsetX = -_rectTransform.pivot.x * _rectTransform.rect.width;
        min = _rectTransform.TransformPoint(offsetX, offsetY, 0);
        min = _reference.InverseTransformVector(min);
        return min;
    }
    public static int RayCrossingCount(Vector2 p, List<Vector3> vertices)
    {
        var crossNum = 0;
        for (int i = 0, count = vertices.Count; i < count; i++)
        {
            var v1 = vertices[i];
            var v2 = vertices[(i + 1) % count];
            if (((v1.y <= p.y) && (v2.y > p.y))
                || ((v1.y > p.y) && (v2.y <= p.y)))
            {
                if (p.x < v1.x + (p.y - v1.y) / (v2.y - v1.y) * (v2.x - v1.x))
                {
                    crossNum += 1;
                }
            }
        }
        return crossNum;
    }
    public static UIVertex PackageUIVertex(Vector3 _position, Vector2 _uv0, Color _color)
    {
        var vertex = new UIVertex();
        vertex.position = _position;
        vertex.uv0 = _uv0;
        vertex.color = _color;
        return vertex;
    }
    public static UIVertex PackageUIVertexUV1(Vector3 _position, Vector2 _uv1, Color _color)
    {
        var vertex = new UIVertex();
        vertex.position = _position;
        vertex.uv1 = _uv1;
        vertex.color = _color;
        return vertex;
    }
    public static Vector3 ClampWorldPosition(RectTransform _area, PointerEventData _data)
    {
        if (_area == null || _data == null)
        {
            return Vector3.zero;
        }
        else
        {
            var worldMousePos = Vector3.zero;
            if (RectTransformUtility.ScreenPointToWorldPointInRectangle(_area, _data.position, _data.pressEventCamera, out worldMousePos))
            {
                return worldMousePos;
            }
            else
            {
                return _data.pointerCurrentRaycast.worldPosition;
            }
        }
    }
    public static bool RectTransformContain(RectTransform _area, RectTransform _test)
    {
        if (_area == null || _test == null)
        {
            return false;
        }
        var worldcornersA = new Vector3[4];
        _area.GetWorldCorners(worldcornersA);
        var worldcornersB = new Vector3[4];
        _test.GetWorldCorners(worldcornersB);
        var a = new Quadrangle(worldcornersA[0].x, worldcornersA[0].y, worldcornersA[2].x, worldcornersA[2].y);
        var b = new Quadrangle(worldcornersB[0].x, worldcornersB[0].y, worldcornersB[2].x, worldcornersB[2].y);
        if (a.minX > b.maxX || a.maxX < b.minX || a.minY > b.maxY || a.maxY < b.minY)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    public static bool IsPointerOverGameObject()
    {
        if (EventSystem.current == null)
        {
            return false;
        }
        var eventData = new PointerEventData(EventSystem.current);
        eventData.pressPosition = Input.mousePosition;
        eventData.position = Input.mousePosition;
        var list = new List<RaycastResult>();
        EventSystem.current.RaycastAll(eventData, list);
        return list.Count > 0;
    }
    struct Quadrangle
    {
        public float minX;
        public float minY;
        public float maxX;
        public float maxY;
        public Quadrangle(float _minX, float _minY, float _maxX, float _maxY)
        {
            this.minX = _minX;
            this.minY = _minY;
            this.maxX = _maxX;
            this.maxY = _maxY;
        }
    }
    public static Vector2 GetEdge(List<UIVertex> _vertexs, int _axis)
    {
        if (_vertexs == null || _vertexs.Count == 0)
        {
            DesignDebug.Log("非法顶点数据");
            return Vector2.zero;
        }
        if (_axis != 0 && _axis != 1)
        {
            DesignDebug.Log("非法轴");
            return Vector2.zero;
        }
        var count = _vertexs.Count;
        var min = _vertexs[0].position[_axis];
        var max = _vertexs[0].position[_axis];
        for (int i = 1; i < count; i++)
        {
            if (_vertexs[i].position[_axis] < min)
            {
                min = _vertexs[i].position[_axis];
            }
            else if (_vertexs[i].position[_axis] > max)
            {
                max = _vertexs[i].position[_axis];
            }
        }
        return new Vector2(min, max);
    }
    public static void AddQuad(VertexHelper vertexHelper, Vector3[] quadPositions, Color32 color, Vector2[] quadUVs)
    {
        if (quadPositions == null || quadPositions.Length < 4)
        {
            DesignDebug.Log("非法顶点数组");
            return;
        }
        if (quadUVs == null || quadUVs.Length < 4)
        {
            DesignDebug.Log("非法UV数组");
            return;
        }
        var currentVertCount = vertexHelper.currentVertCount;
        for (var i = 0; i < 4; i++)
        {
            vertexHelper.AddVert(quadPositions[i], color, quadUVs[i]);
        }
        vertexHelper.AddTriangle(currentVertCount, currentVertCount + 1, currentVertCount + 2);
        vertexHelper.AddTriangle(currentVertCount + 2, currentVertCount + 3, currentVertCount);
    }
    public static void AddTriangle(VertexHelper vertexHelper, Vector3[] positions, Color32 color, Vector2[] uvs)
    {
        if (positions == null || positions.Length < 3)
        {
            DesignDebug.Log("非法顶点数组");
            return;
        }
        if (uvs == null || uvs.Length < 3)
        {
            DesignDebug.Log("非法UV数组");
            return;
        }
        var currentVertCount = vertexHelper.currentVertCount;
        for (var i = 0; i < 3; i++)
        {
            vertexHelper.AddVert(positions[i], color, uvs[i]);
        }
        vertexHelper.AddTriangle(currentVertCount, currentVertCount + 1, currentVertCount + 2);
    }
    public static string GetUIElementRelativePath(UIRoot _root, Transform _transform)
    {
        List<Transform> parents = new List<Transform>() { _transform };
        GetParents(_transform, ref parents);
        if (parents.Contains(_root.transform))
        {
            parents.Remove(_root.transform);
        }
        var names = new string[parents.Count];
        for (int i = 0; i < names.Length; i++)
        {
            names[i] = parents[i].gameObject.name;
        }
        return string.Join("/", names);
    }
    public static void GetParents(Transform _transform, ref List<Transform> _parents)
    {
        if (_transform == null || _parents == null)
        {
            return;
        }
        if (_transform.parent != null)
        {
            _parents.Insert(0, _transform.parent);
            GetParents(_transform.parent, ref _parents);
        }
    }
}