1331 lines
42 KiB
C#
1331 lines
42 KiB
C#
using UnityEngine;
|
||
using System;
|
||
using System.IO;
|
||
using System.Text;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using System.Security.Cryptography;
|
||
using System.Text.RegularExpressions;
|
||
using LuaInterface;
|
||
using GameLogic;
|
||
using UnityEngine.UI;
|
||
using DG.Tweening;
|
||
using ResUpdate;
|
||
using GameCore;
|
||
using System.Reflection;
|
||
using Spine.Unity;
|
||
|
||
#if UNITY_EDITOR
|
||
using UnityEditor;
|
||
#endif
|
||
|
||
namespace GameLogic
|
||
{
|
||
public static class Util
|
||
{
|
||
public static string packGameVersion = "";
|
||
public static string updateGameVersion = "";
|
||
public static string netGameVersion = "";
|
||
|
||
public static Color gray = Color.gray;
|
||
private static List<string> luaPaths = new List<string>();
|
||
|
||
public static string GetDownloadPackageUrl()
|
||
{
|
||
string download_url = string.Empty;
|
||
#if UNITY_IOS
|
||
download_url = AppConst.Download_ipa_Url;
|
||
#else
|
||
download_url = AppConst.Download_apk_Url;
|
||
#endif
|
||
return download_url;
|
||
}
|
||
|
||
public static bool IsFileExist(string fileName)
|
||
{
|
||
return File.Exists(Util.DataPath + fileName);
|
||
}
|
||
|
||
public static bool IsExracted()
|
||
{
|
||
bool isExists = Directory.Exists(DataPath) && Directory.Exists(DataPath + "lua/") && File.Exists(DataPath + AppConst.LoadingMD5Flie);
|
||
return isExists;
|
||
}
|
||
|
||
public static bool NeedExtractResource()
|
||
{
|
||
return false;
|
||
if (!IsExracted())
|
||
return true;
|
||
|
||
return CompareGameVersion(packGameVersion, updateGameVersion) > 0;
|
||
}
|
||
|
||
public static int CompareGameVersion(string version1, string version2)
|
||
{
|
||
float result = 0;
|
||
if (string.IsNullOrEmpty(version1) || string.IsNullOrEmpty(version2))
|
||
{
|
||
return version1.CompareTo(version2);
|
||
}
|
||
else
|
||
{
|
||
var temp1 = version1.Split('.');
|
||
var temp2 = version2.Split('.');
|
||
|
||
float first1 = 0;
|
||
float.TryParse(temp1[0], out first1);
|
||
|
||
float first2 = 0;
|
||
float.TryParse(temp2[0], out first2);
|
||
|
||
float middle1 = 0;
|
||
float.TryParse(temp1[1], out middle1);
|
||
|
||
float middle2 = 0;
|
||
float.TryParse(temp2[1], out middle2);
|
||
|
||
float last1 = 0;
|
||
float.TryParse(temp1[2], out last1);
|
||
|
||
float last2 = 0;
|
||
float.TryParse(temp2[2], out last2);
|
||
|
||
if (first1 != first2)
|
||
result = first1 - first2;
|
||
else if (middle1 != middle2)
|
||
result = middle1 - middle2;
|
||
else
|
||
result = last1 - last2;
|
||
|
||
}
|
||
|
||
if (result > 0) return 1;
|
||
else if (result == 0) return 0;
|
||
else return -1;
|
||
}
|
||
|
||
public static int Int(object o)
|
||
{
|
||
return Convert.ToInt32(o);
|
||
}
|
||
|
||
public static float Float(object o)
|
||
{
|
||
return (float)Math.Round(Convert.ToSingle(o), 2);
|
||
}
|
||
|
||
public static long Long(object o)
|
||
{
|
||
return Convert.ToInt64(o);
|
||
}
|
||
|
||
public static int Random(int min, int max)
|
||
{
|
||
return UnityEngine.Random.Range(min, max);
|
||
}
|
||
|
||
public static float Random(float min, float max)
|
||
{
|
||
return UnityEngine.Random.Range(min, max);
|
||
}
|
||
|
||
public static string Uid(string uid)
|
||
{
|
||
int position = uid.LastIndexOf('_');
|
||
return uid.Remove(0, position + 1);
|
||
}
|
||
|
||
public static long GetTime()
|
||
{
|
||
TimeSpan ts = new TimeSpan(DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1, 0, 0, 0).Ticks);
|
||
return (long)ts.TotalMilliseconds;
|
||
}
|
||
|
||
public static string GetDateTime()
|
||
{
|
||
return DateTime.Now.ToString();
|
||
}
|
||
|
||
public static string GetPlatformVersion()
|
||
{
|
||
App.GameMgr.StartCoroutine(GetPlatformText("Platform/" + AppConst.GameVersionFile));
|
||
return packGameVersion;
|
||
}
|
||
|
||
private static IEnumerator GetPlatformText(string filePath)
|
||
{
|
||
string versionFilePath = DataPath + filePath;
|
||
if (File.Exists(versionFilePath))
|
||
{
|
||
var lines = File.ReadAllLines(versionFilePath);
|
||
if (lines.Length > 0)
|
||
{
|
||
if (!string.IsNullOrEmpty(lines[0]))
|
||
{
|
||
packGameVersion = lines[0].Trim();
|
||
}
|
||
}
|
||
yield return null;
|
||
}
|
||
else
|
||
{
|
||
yield return App.GameMgr.StartCoroutine(GetPackageText(filePath));
|
||
}
|
||
}
|
||
|
||
private static IEnumerator GetPackageText(string fileName)
|
||
{
|
||
string filePath = GetOriginalPath() + fileName;
|
||
WWW www = new WWW(filePath);
|
||
yield return www;
|
||
if (!string.IsNullOrEmpty(www.error))
|
||
{
|
||
XDebug.Log.error("File " + fileName + " no exist in " + filePath + ",Please check it.");
|
||
}
|
||
else
|
||
{
|
||
if (www.isDone)
|
||
{
|
||
packGameVersion = www.text.Trim();
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 搜索子物体组件-GameObject版
|
||
/// </summary>
|
||
public static T Get<T>(GameObject go, string subnode) where T : Component
|
||
{
|
||
if (go != null)
|
||
{
|
||
Transform sub = go.transform.Find(subnode);
|
||
if (sub != null) return sub.GetComponent<T>();
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 搜索子物体组件-Transform版
|
||
/// </summary>
|
||
public static T Get<T>(Transform go, string subnode) where T : Component
|
||
{
|
||
if (go != null)
|
||
{
|
||
Transform sub = go.Find(subnode);
|
||
if (sub != null) return sub.GetComponent<T>();
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 搜索子物体组件-Component版
|
||
/// </summary>
|
||
public static T Get<T>(Component go, string subnode) where T : Component
|
||
{
|
||
return go.transform.Find(subnode).GetComponent<T>();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加组件
|
||
/// </summary>
|
||
public static T Add<T>(GameObject go) where T : Component
|
||
{
|
||
if (go != null)
|
||
{
|
||
T[] ts = go.GetComponents<T>();
|
||
for (int i = 0; i < ts.Length; i++)
|
||
{
|
||
if (ts[i] != null) GameObject.Destroy(ts[i]);
|
||
}
|
||
return go.gameObject.AddComponent<T>();
|
||
}
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加组件
|
||
/// </summary>
|
||
public static T Add<T>(Transform go) where T : Component
|
||
{
|
||
return Add<T>(go.gameObject);
|
||
}
|
||
|
||
public static EventTriggerListener GetEventTriggerListener(GameObject go)
|
||
{
|
||
EventTriggerListener triggerListener = null;
|
||
if (go != null)
|
||
{
|
||
triggerListener = go.GetComponent<EventTriggerListener>();
|
||
if (triggerListener == null)
|
||
{
|
||
triggerListener = go.AddComponent<EventTriggerListener>();
|
||
}
|
||
}
|
||
return triggerListener;
|
||
}
|
||
|
||
public static EventTriggerListener GetEventTriggerListenerWithNil(GameObject go)
|
||
{
|
||
EventTriggerListener triggerListener = null;
|
||
if (go != null)
|
||
{
|
||
triggerListener = go.GetComponent<EventTriggerListener>();
|
||
}
|
||
return triggerListener;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 查找子对象
|
||
/// </summary>
|
||
public static GameObject Child(GameObject go, string subnode)
|
||
{
|
||
return Child(go.transform, subnode);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 查找子对象
|
||
/// </summary>
|
||
public static GameObject Child(Transform go, string subnode)
|
||
{
|
||
Transform tran = go.Find(subnode);
|
||
if (tran == null) return null;
|
||
return tran.gameObject;
|
||
}
|
||
|
||
public static GameObject GetGameObject(GameObject root, string objName)
|
||
{
|
||
if (root == null)
|
||
return null;
|
||
|
||
return GetGameObject(root.transform, objName);
|
||
}
|
||
|
||
public static GameObject GetGameObject(Transform root, string objName)
|
||
{
|
||
if (root == null || string.IsNullOrEmpty(objName))
|
||
return null;
|
||
if (root.name.CompareTo(objName) == 0)
|
||
return root.gameObject;
|
||
|
||
var trans = FindChild(root, objName);
|
||
return trans == null ? null : trans.gameObject;
|
||
}
|
||
|
||
public static Transform GetTransform(Transform root, string objName)
|
||
{
|
||
if (root == null)
|
||
return null;
|
||
if (root.name.CompareTo(objName) == 0)
|
||
return root.transform;
|
||
|
||
var trans = FindChild(root, objName);
|
||
return trans == null ? null : trans;
|
||
}
|
||
|
||
public static Transform GetTransform(GameObject root, string objName)
|
||
{
|
||
if (root == null)
|
||
return null;
|
||
return GetTransform(root.transform, objName);
|
||
}
|
||
|
||
public static Transform FindChild(Transform root, string objName)
|
||
{
|
||
var obj = root.Find(objName);
|
||
if (obj != null)
|
||
return obj;
|
||
|
||
for (int i = 0; i < root.childCount; i++)
|
||
{
|
||
obj = FindChild(root.GetChild(i), objName);
|
||
if (obj != null)
|
||
return obj;
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 取平级对象
|
||
/// </summary>
|
||
public static GameObject Peer(GameObject go, string subnode)
|
||
{
|
||
return Peer(go.transform, subnode);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 取平级对象
|
||
/// </summary>
|
||
public static GameObject Peer(Transform go, string subnode)
|
||
{
|
||
Transform tran = go.parent.Find(subnode);
|
||
if (tran == null) return null;
|
||
return tran.gameObject;
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 计算字符串的MD5值
|
||
/// </summary>
|
||
///
|
||
public static string md5(string source)
|
||
{
|
||
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
|
||
byte[] data = System.Text.Encoding.UTF8.GetBytes(source);
|
||
byte[] md5Data = md5.ComputeHash(data, 0, data.Length);
|
||
md5.Clear();
|
||
|
||
string destString = "";
|
||
for (int i = 0; i < md5Data.Length; i++)
|
||
{
|
||
destString += System.Convert.ToString(md5Data[i], 16).PadLeft(2, '0');
|
||
}
|
||
destString = destString.PadLeft(32, '0');
|
||
return destString;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 计算文件的MD5值
|
||
/// </summary>
|
||
public static string md5file(string file)
|
||
{
|
||
try
|
||
{
|
||
FileStream fs = new FileStream(file, FileMode.Open);
|
||
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
|
||
byte[] retVal = md5.ComputeHash(fs);
|
||
fs.Close();
|
||
|
||
StringBuilder sb = new StringBuilder();
|
||
for (int i = 0; i < retVal.Length; i++)
|
||
{
|
||
sb.Append(retVal[i].ToString("x2"));
|
||
}
|
||
return sb.ToString();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
throw new Exception("md5file() fail, error:" + ex.Message);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 计算buffer的MD5值
|
||
/// </summary>
|
||
public static string md5bytes(byte[] buffer)
|
||
{
|
||
try
|
||
{
|
||
System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
|
||
byte[] retVal = md5.ComputeHash(buffer);
|
||
|
||
StringBuilder sb = new StringBuilder();
|
||
for (int i = 0; i < retVal.Length; i++)
|
||
{
|
||
sb.Append(retVal[i].ToString("x2"));
|
||
}
|
||
return sb.ToString();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
throw new Exception("md5bytes() fail, error:" + ex.Message);
|
||
}
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 清除所有子节点
|
||
/// </summary>
|
||
public static void ClearChild(Transform go)
|
||
{
|
||
if (go == null) return;
|
||
for (int i = go.childCount - 1; i >= 0; i--)
|
||
{
|
||
GameObject.DestroyImmediate(go.GetChild(i).gameObject);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 清理内存
|
||
/// </summary>
|
||
public static void ClearMemory()
|
||
{
|
||
App.LuaMgr.LuaGC();
|
||
Resources.UnloadUnusedAssets();
|
||
GC.Collect();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 取得数据存放目录
|
||
/// </summary>
|
||
public static string DataPath
|
||
{
|
||
get
|
||
{
|
||
string game = AppConst.AppName.ToLower();
|
||
if (Application.isMobilePlatform)
|
||
{
|
||
return Application.persistentDataPath + "/" + game + "/" + AppConst.PlatformPath + "/";
|
||
}
|
||
if (AppConst.DebugMode)
|
||
{
|
||
return Application.dataPath + "/" + AppConst.AssetDir + "/";
|
||
}
|
||
if (Application.platform == RuntimePlatform.OSXEditor)
|
||
{
|
||
int i = Application.dataPath.LastIndexOf('/');
|
||
return Application.dataPath.Substring(0, i + 1) + game + "/" + AppConst.PlatformPath + "/";
|
||
}
|
||
return "c:/" + game + "/" + AppConst.PlatformPath + "/";
|
||
}
|
||
}
|
||
|
||
public static string GetRelativePath()
|
||
{
|
||
if (Application.isEditor) // //
|
||
return "file:///" + DataPath; //+ System.Environment.CurrentDirectory.Replace("\\", "/") + "/Assets/" + AppConst.AssetRoot + "/";
|
||
else if (Application.isMobilePlatform || Application.isConsolePlatform)
|
||
return "file:///" + DataPath;
|
||
else // For standalone player.
|
||
return "file://" + Application.streamingAssetsPath + "/" + AppConst.PlatformPath + "/";
|
||
}
|
||
|
||
public static string GetOriginalPath()
|
||
{
|
||
if (Application.isEditor)
|
||
return "file:///" + Application.dataPath + "/" + AppConst.AssetRoot + "/";
|
||
else if (Application.isMobilePlatform || Application.isConsolePlatform)
|
||
{
|
||
if (Application.platform == RuntimePlatform.Android)
|
||
return "jar:file://" + Application.dataPath + "!/assets/" + AppConst.PlatformPath + "/";
|
||
else if (Application.platform == RuntimePlatform.IPhonePlayer)
|
||
return "file:///" + Application.dataPath + "/Raw/" + AppConst.PlatformPath + "/";
|
||
else
|
||
return "file:///" + Application.dataPath + "/" + AppConst.AssetRoot + "/";
|
||
}
|
||
else // For standalone player.
|
||
return "file://" + Application.streamingAssetsPath + "/" + AppConst.PlatformPath + "/";
|
||
}
|
||
|
||
public static void WriteFileToDataPath(string name, string content)
|
||
{
|
||
string outfile = DataPath + name;
|
||
string dir = Path.GetDirectoryName(outfile);
|
||
if (!Directory.Exists(dir))
|
||
{
|
||
Directory.CreateDirectory(dir);
|
||
}
|
||
if (File.Exists(outfile))
|
||
{
|
||
File.Delete(outfile);
|
||
}
|
||
File.WriteAllText(outfile, content);
|
||
}
|
||
|
||
public static string ReadFileFromDataPath(string name)
|
||
{
|
||
string content = null;
|
||
string outfile = DataPath + name;
|
||
if (File.Exists(outfile))
|
||
{
|
||
content = File.ReadAllText(outfile);
|
||
}
|
||
return content;
|
||
}
|
||
|
||
public static string GetAvaliableRelativePath()
|
||
{
|
||
var needExract = NeedExtractResource();
|
||
if (needExract)
|
||
return GetOriginalPath();
|
||
else
|
||
return GetRelativePath();
|
||
}
|
||
|
||
public static string GetAvaliableRelativePath_File()
|
||
{
|
||
var needExract = NeedExtractResource();
|
||
if (needExract)
|
||
return GetOriginalPath_File();
|
||
else
|
||
return GetRelativePath_File();
|
||
}
|
||
|
||
public static string GetOriginalPath_File()
|
||
{
|
||
if (Application.isEditor)
|
||
return Application.dataPath + "/" + AppConst.AssetRoot + "/";
|
||
else if (Application.isMobilePlatform || Application.isConsolePlatform)
|
||
{
|
||
if (Application.platform == RuntimePlatform.Android)
|
||
return "jar:file://" + Application.dataPath + "!/assets/" + AppConst.PlatformPath + "/";
|
||
else if (Application.platform == RuntimePlatform.IPhonePlayer)
|
||
return Application.dataPath + "/Raw/" + AppConst.PlatformPath + "/";
|
||
else
|
||
return "file:///" + Application.dataPath + "/" + AppConst.AssetRoot + "/";
|
||
}
|
||
else // For standalone player.
|
||
return "file://" + Application.streamingAssetsPath + "/" + AppConst.PlatformPath + "/";
|
||
}
|
||
|
||
public static string GetRelativePath_File()
|
||
{
|
||
if (Application.isEditor) // //
|
||
return DataPath; //+ System.Environment.CurrentDirectory.Replace("\\", "/") + "/Assets/" + AppConst.AssetRoot + "/";
|
||
else if (Application.isMobilePlatform || Application.isConsolePlatform)
|
||
return DataPath;
|
||
else // For standalone player.
|
||
return Application.streamingAssetsPath + "/" + AppConst.PlatformPath + "/";
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 应用程序内容路径
|
||
/// </summary>
|
||
public static string AppContentPath()
|
||
{
|
||
string path = string.Empty;
|
||
switch (Application.platform)
|
||
{
|
||
case RuntimePlatform.Android:
|
||
path = Application.streamingAssetsPath + "/" + AppConst.PlatformPath + "/";
|
||
break;
|
||
case RuntimePlatform.IPhonePlayer:
|
||
path = Application.streamingAssetsPath + "/" + AppConst.PlatformPath + "/";
|
||
break;
|
||
default:
|
||
path = Application.streamingAssetsPath + "/" + AppConst.PlatformPath + "/";
|
||
break;
|
||
}
|
||
return path;
|
||
}
|
||
|
||
public static string AppRootPath()
|
||
{
|
||
string path = string.Empty;
|
||
switch (Application.platform)
|
||
{
|
||
case RuntimePlatform.Android:
|
||
path = "jar:file://" + Application.dataPath + "!/assets/" + AppConst.PlatformPath + "/";
|
||
break;
|
||
case RuntimePlatform.IPhonePlayer:
|
||
path = Application.dataPath + "/Raw/" + AppConst.PlatformPath + "/";
|
||
break;
|
||
default:
|
||
path = Application.dataPath + "/" + AppConst.AssetRoot + "/";
|
||
break;
|
||
}
|
||
return path;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 取得行文本
|
||
/// </summary>
|
||
public static string GetFileText(string path)
|
||
{
|
||
return File.ReadAllText(path);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 网络可用
|
||
/// </summary>
|
||
public static bool NetAvailable
|
||
{
|
||
get
|
||
{
|
||
return Application.internetReachability != NetworkReachability.NotReachable;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 是否是无线
|
||
/// </summary>
|
||
public static bool IsWifi
|
||
{
|
||
get
|
||
{
|
||
return Application.internetReachability == NetworkReachability.ReachableViaLocalAreaNetwork;
|
||
}
|
||
}
|
||
|
||
public static void SetLogLevel(int level)
|
||
{
|
||
GameCore.BaseLogger.level = (LogLevel)level;
|
||
}
|
||
|
||
public static void Log(params object[] pars)
|
||
{
|
||
XDebug.Log.l(pars);
|
||
}
|
||
|
||
public static void LogWarning(string str)
|
||
{
|
||
XDebug.Log.warning(str);
|
||
}
|
||
|
||
public static void LogError(string str)
|
||
{
|
||
XDebug.Log.error(str);
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 防止初学者不按步骤来操作
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public static int CheckRuntimeFile()
|
||
{
|
||
if (!Application.isEditor) return 0;
|
||
string streamDir = Application.dataPath + "/" + AppConst.AssetRoot + "/";
|
||
if (!Directory.Exists(streamDir))
|
||
{
|
||
return -1;
|
||
}
|
||
else
|
||
{
|
||
string[] files = Directory.GetFiles(streamDir);
|
||
if (files.Length == 0) return -1;
|
||
|
||
if (!File.Exists(streamDir + AppConst.LoadingMD5Flie))
|
||
{
|
||
return -1;
|
||
}
|
||
}
|
||
string sourceDir = AppConst.FrameworkRoot + "/ToLua/Source/Generate/";
|
||
if (!Directory.Exists(sourceDir))
|
||
{
|
||
return -2;
|
||
}
|
||
else
|
||
{
|
||
string[] files = Directory.GetFiles(sourceDir);
|
||
if (files.Length == 0) return -2;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 执行Lua方法
|
||
/// </summary>
|
||
public static void CallMethod(string module, string func, params object[] args)
|
||
{
|
||
App.LuaMgr.CallFunction(module + "." + func, args);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 检查运行环境
|
||
/// </summary>
|
||
public static bool CheckEnvironment()
|
||
{
|
||
#if UNITY_EDITOR
|
||
int resultId = Util.CheckRuntimeFile();
|
||
if (resultId == -1)
|
||
{
|
||
Debug.LogError("没有找到框架所需要的资源,单击Game菜单下Build xxx Resource生成!!");
|
||
EditorApplication.isPlaying = false;
|
||
return false;
|
||
}
|
||
else if (resultId == -2)
|
||
{
|
||
Debug.LogError("没有找到Wrap脚本缓存,单击Lua菜单下Gen Lua Wrap Files生成脚本!!");
|
||
EditorApplication.isPlaying = false;
|
||
return false;
|
||
}
|
||
if (Application.loadedLevelName == "Test" && !AppConst.DebugMode)
|
||
{
|
||
Debug.LogError("测试场景,必须打开调试模式,AppConst.DebugMode = true!!");
|
||
EditorApplication.isPlaying = false;
|
||
return false;
|
||
}
|
||
#endif
|
||
return true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加点击事件
|
||
/// </summary>
|
||
public static void AddClick(GameObject go, LuaFunction luafunc)
|
||
{
|
||
if (go == null || luafunc == null) return;
|
||
go.GetComponent<Button>().onClick.AddListener(
|
||
delegate ()
|
||
{
|
||
luafunc.Call(go);
|
||
}
|
||
);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加点击事件,移除上一个注册的事件
|
||
/// </summary>
|
||
public static void AddOnceClick(GameObject go, LuaFunction luafunc)
|
||
{
|
||
if (go == null || luafunc == null) return;
|
||
go.GetComponent<Button>().onClick.RemoveAllListeners();
|
||
go.GetComponent<Button>().onClick.AddListener(
|
||
delegate ()
|
||
{
|
||
luafunc.Call(go);
|
||
}
|
||
);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 添加长按事件,移除上一个注册的事件
|
||
/// </summary>
|
||
public static void AddLongPressClick(GameObject go, LuaFunction luafunc, float interval)
|
||
{
|
||
if (go == null || luafunc == null) return;
|
||
var lpb = go.GetComponent<LongPressButton>();
|
||
if (lpb == null)
|
||
{
|
||
lpb = go.AddComponent<LongPressButton>();
|
||
}
|
||
lpb.interval = interval;
|
||
lpb.onLongPress.RemoveAllListeners();
|
||
lpb.onLongPress.AddListener(
|
||
delegate ()
|
||
{
|
||
luafunc.Call(go);
|
||
}
|
||
);
|
||
}
|
||
|
||
public static void AddDropDownOption(GameObject go, string optionName)
|
||
{
|
||
if (go == null) return;
|
||
go.GetComponent<Dropdown>().AddOptions(new List<string> { optionName });
|
||
}
|
||
|
||
public static void AddDropDownOptionEvent(GameObject go, LuaFunction luafunc)
|
||
{
|
||
if (go == null || luafunc == null) return;
|
||
go.GetComponent<Dropdown>().onValueChanged.AddListener(
|
||
index =>
|
||
{
|
||
luafunc.Call(index);
|
||
}
|
||
);
|
||
}
|
||
|
||
public static void AddScrollBar(GameObject go, LuaFunction luafunc)
|
||
{
|
||
if (go == null || luafunc == null) return;
|
||
go.GetComponent<Scrollbar>().onValueChanged.AddListener(
|
||
delegate (float value)
|
||
{
|
||
luafunc.Call(go, value);
|
||
}
|
||
);
|
||
}
|
||
|
||
public static void AddSlider(GameObject go, LuaFunction luafunc)
|
||
{
|
||
if (go == null || luafunc == null) return;
|
||
go.GetComponent<Slider>().onValueChanged.AddListener(
|
||
delegate (float value)
|
||
{
|
||
luafunc.Call(go, value);
|
||
}
|
||
);
|
||
}
|
||
|
||
public static void AddToggle(GameObject go, LuaFunction func)
|
||
{
|
||
if (go == null || func == null) return;
|
||
|
||
go.GetComponent<Toggle>().onValueChanged.AddListener(
|
||
delegate (bool isToggle)
|
||
{
|
||
func.Call(isToggle);
|
||
}
|
||
);
|
||
}
|
||
|
||
//改变该节点下所有粒子的相对层级
|
||
public static void AddParticleSortLayer(GameObject go, int layer)
|
||
{
|
||
if (layer == 0) return;
|
||
var gos2 = go.GetComponentsInChildren<Renderer>(true);
|
||
for (int i = 0; i < gos2.Length; i++)
|
||
{
|
||
gos2[i].GetComponent<Renderer>().sortingOrder += layer;
|
||
}
|
||
}
|
||
|
||
public static void SetParticleSortLayer(GameObject go, int layer)
|
||
{
|
||
var gos2 = go.GetComponentsInChildren<Renderer>(true);
|
||
for (int i = 0; i < gos2.Length; i++)
|
||
{
|
||
gos2[i].GetComponent<Renderer>().sortingOrder = layer;
|
||
}
|
||
}
|
||
|
||
//改变该节点下所有粒子的整体缩放比例
|
||
public static void SetParticleScale(GameObject go, float scale)
|
||
{
|
||
var hasParticleObj = false;
|
||
var particles = go.GetComponentsInChildren<ParticleSystem>(true);
|
||
var max = particles.Length;
|
||
for (int idx = 0; idx < max; idx++)
|
||
{
|
||
var particle = particles[idx];
|
||
if (particle == null) continue;
|
||
hasParticleObj = true;
|
||
|
||
var main = particle.main;
|
||
if (main.startSize3D)
|
||
{
|
||
main.startSizeXMultiplier *= scale;
|
||
main.startSizeYMultiplier *= scale;
|
||
main.startSizeZMultiplier *= scale;
|
||
}
|
||
else
|
||
{
|
||
main.startSizeMultiplier *= scale;
|
||
}
|
||
|
||
if (main.startRotation3D)
|
||
{
|
||
main.startRotationXMultiplier *= scale;
|
||
main.startRotationYMultiplier *= scale;
|
||
main.startRotationZMultiplier *= scale;
|
||
|
||
}
|
||
else
|
||
{
|
||
main.startRotationMultiplier *= scale;
|
||
}
|
||
main.startSpeedMultiplier *= scale;
|
||
//particle.transform.localScale *= scale;
|
||
}
|
||
if (hasParticleObj)
|
||
{
|
||
//go.transform.localScale = new Vector3(scale, scale, scale);
|
||
}
|
||
}
|
||
|
||
public static void ClearTrailRender(GameObject go)
|
||
{
|
||
if (go == null) return;
|
||
var gos = go.GetComponentsInChildren<TrailRenderer>();
|
||
for (int i = 0; i < gos.Length; i++)
|
||
{
|
||
gos[i].Clear();
|
||
}
|
||
}
|
||
|
||
#region ugui控件修改值不触发事件
|
||
static Slider.SliderEvent emptySliderEvent = new Slider.SliderEvent();
|
||
public static void SliderSet(Slider instance, float value)
|
||
{
|
||
var originalEvent = instance.onValueChanged;
|
||
instance.onValueChanged = emptySliderEvent;
|
||
instance.value = value;
|
||
instance.onValueChanged = originalEvent;
|
||
}
|
||
|
||
static Toggle.ToggleEvent emptyToggleEvent = new Toggle.ToggleEvent();
|
||
public static void ToggleSet(Toggle instance, bool value)
|
||
{
|
||
var originalEvent = instance.onValueChanged;
|
||
instance.onValueChanged = emptyToggleEvent;
|
||
instance.isOn = value;
|
||
instance.onValueChanged = originalEvent;
|
||
}
|
||
|
||
static InputField.OnChangeEvent emptyInputFieldEvent = new InputField.OnChangeEvent();
|
||
public static void InputFieldSet(InputField instance, string value)
|
||
{
|
||
var originalEvent = instance.onValueChanged;
|
||
instance.onValueChanged = emptyInputFieldEvent;
|
||
instance.text = value;
|
||
instance.onValueChanged = originalEvent;
|
||
}
|
||
|
||
static Scrollbar.ScrollEvent emptyScrollEvent = new Scrollbar.ScrollEvent();
|
||
public static void ScrollbarSet(Scrollbar instance, float value)
|
||
{
|
||
var originalEvent = instance.onValueChanged;
|
||
instance.onValueChanged = emptyScrollEvent;
|
||
instance.value = value;
|
||
instance.onValueChanged = originalEvent;
|
||
}
|
||
|
||
static Dropdown.DropdownEvent emptyDropdownEvent = new Dropdown.DropdownEvent();
|
||
public static void DropdownSet(Dropdown instance, int value)
|
||
{
|
||
var originalEvent = instance.onValueChanged;
|
||
instance.onValueChanged = emptyDropdownEvent;
|
||
instance.value = value;
|
||
instance.onValueChanged = originalEvent;
|
||
}
|
||
#endregion
|
||
|
||
public static void OpenUrl(string str)
|
||
{
|
||
Application.OpenURL(str);
|
||
}
|
||
|
||
public static void SetAudioMixer(string resName, AudioSource audioSource)
|
||
{
|
||
UnityEngine.Audio.AudioMixer mixer = App.ResMgr.LoadAsset("GameAudioMixer") as UnityEngine.Audio.AudioMixer;
|
||
if (mixer != null)
|
||
{
|
||
UnityEngine.Audio.AudioMixerGroup group = mixer.FindMatchingGroups(resName)[0];
|
||
if (group != null)
|
||
{
|
||
audioSource.outputAudioMixerGroup = group;
|
||
}
|
||
}
|
||
}
|
||
|
||
public static void AddInputField_OnValueChanged(GameObject go, LuaFunction func)
|
||
{
|
||
if (go == null || func == null) return;
|
||
|
||
go.GetComponent<InputField>().onValueChanged.AddListener(
|
||
delegate (string str)
|
||
{
|
||
func.Call(str);
|
||
}
|
||
);
|
||
}
|
||
|
||
public static void AddInputField_OnEndEdit(GameObject go, LuaFunction func)
|
||
{
|
||
if (go == null || func == null) return;
|
||
|
||
go.GetComponent<InputField>().onEndEdit.AddListener(
|
||
delegate (string str)
|
||
{
|
||
func.Call(str);
|
||
}
|
||
);
|
||
}
|
||
|
||
public static void ResetRectTransform(GameObject obj)
|
||
{
|
||
var rect = obj.GetComponent<RectTransform>();
|
||
if (rect == null)
|
||
return;
|
||
|
||
rect.offsetMin = Vector2.zero;
|
||
rect.offsetMax = Vector2.zero;
|
||
}
|
||
|
||
public static void DoLocalMove(Transform trans, float x, float y, float z, float duration)
|
||
{
|
||
var des = new Vector3(x, y, z);
|
||
trans.DOLocalMove(des, duration);
|
||
}
|
||
|
||
public static void DoLocalMoveAdd(Transform trans, float x, float y, float z, float duration)
|
||
{
|
||
Vector3 curPos = trans.localPosition;
|
||
Vector3 endPos = new Vector3(curPos.x + x, curPos.y + y, curPos.z + z);
|
||
trans.DOLocalMove(endPos, duration);
|
||
}
|
||
|
||
public static void DoMoveToTarget(Transform trans, Transform target, float x, float y, float z, float duration)
|
||
{
|
||
trans.SetParent(target);
|
||
Vector3 endPos = new Vector3(x, y, z);
|
||
trans.DOLocalMove(endPos, duration);
|
||
}
|
||
|
||
public static void DoLocalRotate(Transform trans, float x, float y, float z, float duration)
|
||
{
|
||
trans.DOLocalRotate(new Vector3(x, y, z), duration, RotateMode.LocalAxisAdd);
|
||
}
|
||
|
||
public static void DoLocalScale(Transform trans, float x, float y, float z, float duration)
|
||
{
|
||
trans.DOScale(new Vector3(x, y, z), duration);
|
||
}
|
||
|
||
public static void DoColor(Graphic graphic, Color start, Color end, float duration)
|
||
{
|
||
graphic.DOKill();
|
||
graphic.color = start;
|
||
graphic.DOColor(end, duration);
|
||
}
|
||
|
||
public static void DoColor_Alpha(Graphic graphic, float startAlpha, float endAlpha, float duration)
|
||
{
|
||
graphic.DOKill();
|
||
var startColor = graphic.color;
|
||
startColor.a = startAlpha;
|
||
|
||
var endColor = graphic.color;
|
||
endColor.a = endAlpha;
|
||
|
||
graphic.color = startColor;
|
||
graphic.DOColor(endColor, duration);
|
||
}
|
||
|
||
public static void SetColor(Graphic graphic, Color col)
|
||
{
|
||
graphic.color = col;
|
||
}
|
||
|
||
public static void SetColorAlpha_Float(Graphic graphic, float alpha)
|
||
{
|
||
var tempColor = graphic.color;
|
||
tempColor.a = alpha;
|
||
graphic.color = tempColor;
|
||
}
|
||
|
||
public static void SetColorAlpha_Int(Graphic graphic, int alpha)
|
||
{
|
||
var tempColor = graphic.color;
|
||
tempColor.a = (float)alpha / 255;
|
||
graphic.color = tempColor;
|
||
}
|
||
|
||
public static Color GetFloatColor(float r, float g, float b)
|
||
{
|
||
return new Color(r / 255, g / 255, b / 255);
|
||
}
|
||
|
||
public static void DoLoopRotate(Transform trans, float x, float y, float z, float duration)
|
||
{
|
||
trans.DOKill();
|
||
trans.DOLocalRotate(new Vector3(x, y, z), duration, RotateMode.Fast).SetLoops(-1).SetEase(Ease.Linear);
|
||
}
|
||
|
||
public static Transform[] GetChildrenTrans(Transform trans)
|
||
{
|
||
var count = trans.childCount;
|
||
var children = new Transform[count];
|
||
for (int i = 0; i < count; i++)
|
||
{
|
||
children[i] = trans.GetChild(i);
|
||
}
|
||
|
||
return children;
|
||
}
|
||
|
||
|
||
public static Sprite LoadSprite(string spriteName) {
|
||
return App.ResMgr.LoadAsset<Sprite>(spriteName);
|
||
}
|
||
|
||
public static Font LoadFont(string fontName = null)
|
||
{
|
||
if (!string.IsNullOrEmpty(fontName))
|
||
{
|
||
var go = App.ResMgr.LoadAsset<Font>(fontName);
|
||
if (go != null)
|
||
return go;
|
||
}
|
||
Font BuildInFont = Resources.GetBuiltinResource<Font>("Arial.ttf");
|
||
return BuildInFont;
|
||
}
|
||
|
||
public static void LoadSpriteAsync(string spriteName, Image image)
|
||
{
|
||
App.ResMgr.LoadAssetAsync<Sprite>(spriteName, (tmpName, sprite) => {
|
||
image.sprite = sprite;
|
||
});
|
||
}
|
||
|
||
public static void SetGray(GameObject go, bool isGray)
|
||
{
|
||
Material m = App.ResMgr.LoadAsset<Material>("UI-DefaultGray");
|
||
Material sm = App.ResMgr.LoadAsset<Material>("SkeletonGraphicDefault");
|
||
|
||
var images = go.GetComponentsInChildren<MaskableGraphic>();
|
||
for (int i = 0; i < images.Length; i++)
|
||
{
|
||
if (images[i].material == null) continue;
|
||
if (images[i].material == Image.defaultGraphicMaterial && isGray)
|
||
{
|
||
images[i].material = m;
|
||
}
|
||
else if (images[i].material == m && !isGray)
|
||
{
|
||
images[i].material = Image.defaultGraphicMaterial;
|
||
}
|
||
}
|
||
}
|
||
|
||
public static void SetSpineGray(SkeletonGraphic sg, bool isGray)
|
||
{
|
||
Material m = App.ResMgr.LoadAsset<Material>("UI-DefaultGray");
|
||
Material sm = App.ResMgr.LoadAsset<Material>("SkeletonGraphicDefault");
|
||
|
||
if (sg.material == null) return;
|
||
if (sg.material == sm && isGray)
|
||
{
|
||
sg.material = m;
|
||
}
|
||
else if (sg.material == m && !isGray)
|
||
{
|
||
sg.material = sm;
|
||
}
|
||
|
||
}
|
||
|
||
public static void SetColor(GameObject go, Color color)
|
||
{
|
||
var images = go.GetComponentsInChildren<Image>();
|
||
for (int i = 0; i < images.Length; i++)
|
||
{
|
||
images[i].color = color;
|
||
}
|
||
}
|
||
|
||
public static void SetChildrenParent(Transform from, Transform to)
|
||
{
|
||
if (from == null || to == null)
|
||
return;
|
||
|
||
var count = from.childCount;
|
||
for (int i = 0; i < count; i++)
|
||
{
|
||
from.GetChild(i).SetParent(to);
|
||
}
|
||
}
|
||
|
||
public static void SetPosition(Transform trans, float x, float y, float z)
|
||
{
|
||
trans.position = new Vector3(x, y, z);
|
||
}
|
||
|
||
public static void SetPositionX(Transform trans, float x)
|
||
{
|
||
trans.position = new Vector3(x, trans.position.y, trans.position.z);
|
||
}
|
||
|
||
public static void SetPositionY(Transform trans, float y)
|
||
{
|
||
trans.position = new Vector3(trans.position.x, y, trans.position.z);
|
||
}
|
||
|
||
public static void SetPositionZ(Transform trans, float z)
|
||
{
|
||
trans.position = new Vector3(trans.position.x, trans.position.y, z);
|
||
}
|
||
|
||
public static void SetLocalPosition(Transform trans, float x, float y, float z)
|
||
{
|
||
trans.localPosition = new Vector3(x, y, z);
|
||
}
|
||
|
||
public static void SetLocalPositionX(Transform trans, float x)
|
||
{
|
||
trans.localPosition = new Vector3(x, trans.localPosition.y, trans.localPosition.z);
|
||
}
|
||
|
||
public static void SetLocalPositionY(Transform trans, float y)
|
||
{
|
||
trans.localPosition = new Vector3(trans.localPosition.x, y, trans.localPosition.z);
|
||
}
|
||
|
||
public static void SetLocalPositionZ(Transform trans, float z)
|
||
{
|
||
trans.localPosition = new Vector3(trans.localPosition.x, trans.localPosition.y, z);
|
||
}
|
||
|
||
public static void SetEulerAngles(Transform trans, float x, float y, float z)
|
||
{
|
||
trans.eulerAngles = new Vector3(x, y, z);
|
||
}
|
||
|
||
public static void SetEulerAnglesX(Transform trans, float x)
|
||
{
|
||
trans.eulerAngles = new Vector3(x, trans.eulerAngles.y, trans.eulerAngles.z);
|
||
}
|
||
|
||
public static void SetEulerAnglesY(Transform trans, float y)
|
||
{
|
||
trans.eulerAngles = new Vector3(trans.eulerAngles.x, y, trans.eulerAngles.z);
|
||
}
|
||
|
||
public static void SetEulerAnglesZ(Transform trans, float z)
|
||
{
|
||
trans.eulerAngles = new Vector3(trans.eulerAngles.x, trans.eulerAngles.y, z);
|
||
}
|
||
|
||
public static void SetLocalEulerAngles(Transform trans, float x, float y, float z)
|
||
{
|
||
trans.localEulerAngles = new Vector3(x, y, z);
|
||
}
|
||
|
||
public static void SetLocalEulerAnglesX(Transform trans, float x)
|
||
{
|
||
trans.localEulerAngles = new Vector3(x, trans.localEulerAngles.y, trans.localEulerAngles.z);
|
||
}
|
||
|
||
public static void SetLocalEulerAnglesY(Transform trans, float y)
|
||
{
|
||
trans.localEulerAngles = new Vector3(trans.localEulerAngles.x, y, trans.localEulerAngles.z);
|
||
}
|
||
|
||
public static void SetLocalEulerAnglesZ(Transform trans, float z)
|
||
{
|
||
trans.localEulerAngles = new Vector3(trans.localEulerAngles.x, trans.localEulerAngles.y, z);
|
||
}
|
||
|
||
public static void SetLocalScale(Transform trans, float x, float y, float z)
|
||
{
|
||
trans.localScale = new Vector3(x, y, z);
|
||
}
|
||
|
||
public static void SetLocalScaleX(Transform trans, float x)
|
||
{
|
||
trans.localScale = new Vector3(x, trans.localScale.y, trans.localScale.z);
|
||
}
|
||
|
||
public static void SetLocalScaleY(Transform trans, float y)
|
||
{
|
||
trans.localScale = new Vector3(trans.localScale.x, y, trans.localScale.z);
|
||
}
|
||
|
||
public static void SetLocalScaleZ(Transform trans, float z)
|
||
{
|
||
trans.localScale = new Vector3(trans.localScale.x, trans.localScale.y, z);
|
||
}
|
||
|
||
public static void SetRotation(Transform trans, float x, float y, float z)
|
||
{
|
||
trans.rotation = Quaternion.Euler(new Vector3(x, y, z));
|
||
}
|
||
|
||
public static void SetLocalRotation(Transform trans, float x, float y, float z)
|
||
{
|
||
trans.localRotation = Quaternion.Euler(new Vector3(x, y, z));
|
||
}
|
||
|
||
public static string Base64Encode(string source)
|
||
{
|
||
string encode = string.Empty;
|
||
byte[] bytes = Encoding.UTF8.GetBytes(source);
|
||
try
|
||
{
|
||
encode = Convert.ToBase64String(bytes);
|
||
}
|
||
catch
|
||
{
|
||
encode = source;
|
||
}
|
||
return encode;
|
||
}
|
||
public static string MD5Encrypt(string str)
|
||
{
|
||
var md5 = new MD5CryptoServiceProvider();
|
||
var bytes = Encoding.ASCII.GetBytes(str);
|
||
var encoded = md5.ComputeHash(bytes);
|
||
var sb = new StringBuilder();
|
||
foreach (var c in encoded)
|
||
sb.Append(c.ToString("x2"));
|
||
return sb.ToString();
|
||
}
|
||
|
||
}
|
||
} |