Unity3D KEngineExtensions解析

发表于2018-04-09
评论0 1k浏览
KEngine作为Unity3D的工具集和框架,有些情况下需要使用到,为此下面就和大家介绍KEngine在项目中一些常用的扩展。

#region Copyright (c) 2015 KEngine / Kelly <http://github.com/mr-kelly>, All rights reserved.  
// KEngine - Toolset and framework for Unity3D  
// ===================================  
//   
// Filename: KEngineExtensions.cs  
// Author:  Kelly  
//   
// This library is free software; you can redistribute it and/or  
// modify it under the terms of the GNU Lesser General Public  
// License as published by the Free Software Foundation; either  
// version 3.0 of the License, or (at your option) any later version.  
//   
// This library is distributed in the hope that it will be useful,  
// but WITHOUT ANY WARRANTY; without even the implied warranty of  
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  
// Lesser General Public License for more details.  
//   
// You should have received a copy of the GNU Lesser General Public  
// License along with this library.  
#endregion  
using System;  
using System.Collections.Generic;  
using System.Text;  
using KEngine;  
using UnityEngine;  
/// <summary>  
/// Extension Unity's function, to be more convinient  
/// </summary>  
public static class KEngineExtensions  
{  
    public static void SetWidth(this RectTransform rectTrans, float width)  
    {  
        var size = rectTrans.sizeDelta;  
        size.x = width;  
        rectTrans.sizeDelta = size;  
    }  
    public static void SetHeight(this RectTransform rectTrans, float height)  
    {  
        var size = rectTrans.sizeDelta;  
        size.y = height;  
        rectTrans.sizeDelta = size;  
    }  
    public static void SetPositionX(this Transform t, float newX)  
    {  
        t.position = new Vector3(newX, t.position.y, t.position.z);  
    }  
    public static void SetPositionY(this Transform t, float newY)  
    {  
        t.position = new Vector3(t.position.x, newY, t.position.z);  
    }  
    public static void SetLocalPositionX(this Transform t, float newX)  
    {  
        t.localPosition = new Vector3(newX, t.localPosition.y, t.localPosition.z);  
    }  
    public static void SetLocalPositionY(this Transform t, float newY)  
    {  
        t.localPosition = new Vector3(t.localPosition.x, newY, t.localPosition.z);  
    }  
    public static void SetPositionZ(this Transform t, float newZ)  
    {  
        t.position = new Vector3(t.position.x, t.position.y, newZ);  
    }  
    public static void SetLocalPositionZ(this Transform t, float newZ)  
    {  
        t.localPosition = new Vector3(t.localPosition.x, t.localPosition.y, newZ);  
    }  
    public static void SetLocalScale(this Transform t, Vector3 newScale)  
    {  
        t.localScale = newScale;  
    }  
    public static void SetLocalScaleZero(this Transform t)  
    {  
        t.localScale = Vector3.zero;  
    }  
    public static float GetPositionX(this Transform t)  
    {  
        return t.position.x;  
    }  
    public static float GetPositionY(this Transform t)  
    {  
        return t.position.y;  
    }  
    public static float GetPositionZ(this Transform t)  
    {  
        return t.position.z;  
    }  
    public static float GetLocalPositionX(this Transform t)  
    {  
        return t.localPosition.x;  
    }  
    public static float GetLocalPositionY(this Transform t)  
    {  
        return t.localPosition.y;  
    }  
    public static float GetLocalPositionZ(this Transform t)  
    {  
        return t.localPosition.z;  
    }  
    public static bool HasRigidbody(this GameObject gobj)  
    {  
        return (gobj.GetComponent<Rigidbody>() != null);  
    }  
    public static bool HasAnimation(this GameObject gobj)  
    {  
        return (gobj.GetComponent<Animation>() != null);  
    }  
    public static void SetSpeed(this Animation anim, float newSpeed)  
    {  
        anim[anim.clip.name].speed = newSpeed;  
    }  
    public static Vector2 ToVector2(this Vector3 vec)  
    {  
        return new Vector2(vec.x, vec.y);  
    }  
    public static byte ToByte(this string val)  
    {  
        return string.IsNullOrEmpty(val) ? (byte)0 : Convert.ToByte(val);  
    }  
    public static int ToInt32(this string val)  
    {  
        return string.IsNullOrEmpty(val) ? 0 : Convert.ToInt32(val);  
    }  
    public static long ToInt64(this string val)  
    {  
        return string.IsNullOrEmpty(val) ? 0 : Convert.ToInt64(val);  
    }  
    public static float ToFloat(this string val)  
    {  
        return string.IsNullOrEmpty(val) ? 0f : Convert.ToSingle(val);  
    }  
    /// <summary>  
    /// Get from object Array  
    /// </summary>  
    /// <typeparam name="T"></typeparam>  
    /// <param name="openArgs"></param>  
    /// <param name="offset"></param>  
    /// <param name="isLog"></param>  
    /// <returns></returns>  
    public static T Get<T>(this object[] openArgs, int offset, bool isLog = true)  
    {  
        T ret;  
        if ((openArgs.Length - 1) >= offset)  
        {  
            var arrElement = openArgs[offset];  
            if (arrElement == null)  
                ret = default(T);  
            else  
            {  
                try  
                {  
                    ret = (T)Convert.ChangeType(arrElement, typeof(T));  
                }  
                catch (Exception)  
                {  
                    if (arrElement is string && string.IsNullOrEmpty(arrElement as string))  
                        ret = default(T);  
                    else  
                    {  
                        Log.Error("[Error get from object[],  '{0}' change to type {1}", arrElement, typeof(T));  
                        ret = default(T);  
                    }  
                }  
            }  
        }  
        else  
        {  
            ret = default(T);  
            if (isLog)  
                Log.Error("[GetArg] {0} args - offset: {1}", openArgs, offset);  
        }  
        return ret;  
    }  
}  
// C# 扩展, 扩充C#类的功能  
public static class KEngineToolExtensions  
{  
    // 扩展List/    
    public static void Shuffle<T>(this IList<T> list)  
    {  
        System.Random rng = new System.Random();  
        int n = list.Count;  
        while (n > 1)  
        {  
            n--;  
            int k = rng.Next(n + 1);  
            T value = list[k];  
            list[k] = list[n];  
            list[n] = value;  
        }  
    }  
    /// <summary>  
    /// </summary>  
    /// <param name="source"></param>  
    /// <typeparam name="T"></typeparam>  
    /// <returns></returns>  
    public static T KFirstOrDefault<T>(this IEnumerable<T> source)  
    {  
        if (source != null)  
        {  
            foreach (T item in source)  
            {  
                return item;  
            }  
        }  
        return default(T);  
    }  
    public static List<T> KFirst<T>(this IEnumerable<T> source, int num)  
    {  
        var count = 0;  
        var items = new List<T>();  
        if (source != null)  
        {  
            foreach (T item in source)  
            {  
                if (++count > num)  
                {  
                    break;  
                }  
                items.Add(item);  
            }  
        }  
        return items;  
    }  
    public delegate bool KFilterAction<T>(T t);  
    public static List<T> KFilter<T>(this IEnumerable<T> source, KFilterAction<T> testAction)  
    {  
        var items = new List<T>();  
        if (source != null)  
        {  
            foreach (T item in source)  
            {  
                if (testAction(item))  
                {  
                    items.Add(item);  
                }  
            }  
        }  
        return items;  
    }  
    public delegate bool KFilterAction<T, K>(T t, K k);  
    public static Dictionary<T, K> KFilter<T, K>(this IEnumerable<KeyValuePair<T, K>> source,  
        KFilterAction<T, K> testAction)  
    {  
        var items = new Dictionary<T, K>();  
        if (source != null)  
        {  
            foreach (KeyValuePair<T, K> pair in source)  
            {  
                if (testAction(pair.Key, pair.Value))  
                {  
                    items.Add(pair.Key, pair.Value);  
                }  
            }  
        }  
        return items;  
    }  
    public static T KLastOrDefault<T>(this IEnumerable<T> source)  
    {  
        var result = default(T);  
        foreach (T item in source)  
        {  
            result = item;  
        }  
        return result;  
    }  
    /// <summary>  
    /// == Linq Last  
    /// </summary>  
    /// <typeparam name="T"></typeparam>  
    /// <param name="source"></param>  
    /// <param name="num"></param>  
    /// <returns></returns>  
    public static List<T> KLast<T>(this IEnumerable<T> source, int num)  
    {  
        // 开始读取的位置  
        var startIndex = Math.Max(0, source.KToList().Count - num);  
        var index = 0;  
        var items = new List<T>();  
        if (source != null)  
        {  
            foreach (T item in source)  
            {  
                if (index < startIndex)  
                {  
                    continue;  
                }  
                items.Add(item);  
            }  
        }  
        return items;  
    }  
    /// <summary>  
    /// HashSet AddRange  
    /// </summary>  
    /// <typeparam name="T"></typeparam>  
    /// <param name="this"></param>  
    /// <param name="items"></param>  
    /// <returns></returns>  
    public static bool AddRange<T>(this HashSet<T> @this, IEnumerable<T> items)  
    {  
        bool allAdded = true;  
        foreach (T item in items)  
        {  
            allAdded &= @this.Add(item);  
        }  
        return allAdded;  
    }  
    public static T[] KToArray<T>(this IEnumerable<T> source)  
    {  
        var list = new List<T>();  
        foreach (T item in source)  
        {  
            list.Add(item);  
        }  
        return list.ToArray();  
    }  
    public static List<T> KToList<T>(this IEnumerable<T> source)  
    {  
        var list = new List<T>();  
        foreach (T item in source)  
        {  
            list.Add(item);  
        }  
        return list;  
    }  
    public static List<T> KUnion<T>(this List<T> first, List<T> second, IEqualityComparer<T> comparer)  
    {  
        var results = new List<T>();  
        var list = first.KToList();  
        list.AddRange(second);  
        foreach (T item in list)  
        {  
            var include = false;  
            foreach (T result in results)  
            {  
                if (comparer.Equals(result, item))  
                {  
                    include = true;  
                    break;  
                }  
            }  
            if (!include)  
            {  
                results.Add(item);  
            }  
        }  
        return results;  
    }  
    public static string KJoin<T>(this IEnumerable<T> source, string sp)  
    {  
        var result = new StringBuilder();  
        foreach (T item in source)  
        {  
            if (result.Length == 0)  
            {  
                result.Append(item);  
            }  
            else  
            {  
                result.Append(sp).Append(item);  
            }  
        }  
        return result.ToString();  
    }  
    public static bool KContains<TSource>(this IEnumerable<TSource> source, TSource value)  
    {  
        foreach (TSource item in source)  
        {  
            if (Equals(item, value))  
            {  
                return true;  
            }  
        }  
        return false;  
    }  
    // by KK, 获取自动判断JSONObject的str,n  
    //public static object Value(this JSONObject jsonObj)  
    //{  
    //    switch (jsonObj.type)  
    //    {  
    //        case JSONObject.Type.NUMBER:  // 暂时返回整形!不管浮点了, lua目前少用浮点  
    //            return (int)jsonObj.n;  
    //        case JSONObject.Type.STRING:  
    //            return jsonObj.str;  
    //        case JSONObject.Type.NULL:  
    //            return null;  
    //        case JSONObject.Type.ARRAY:  
    //        case JSONObject.Type.OBJECT:  
    //            return jsonObj;  
    //        case JSONObject.Type.BOOL:  
    //            return jsonObj.b;  
    //    }  
    //    return null;  
    //}  
}  

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引