1.眨眼效果
/// <summary>
/// 眨眼效果
/// </summary>
/// <param name="eyeMaskRenserer">眼遮罩</param>
/// <param name="blinkTime">眨眼时间</param>
/// <param name="callback">眨眼后回调</param>
/// <returns></returns>
public static IEnumerator IEBlinkEye(SpriteRenderer eyeMaskRenserer, float blinkTime, Action callback)
{
SetTrs(eyeMaskRenserer.transform, true);
var startColor = Color.clear;
var targetColor = Color.black;
var startTime = Time.time;
var needTime = 1f;
eyeMaskRenserer.color = startColor;
while (eyeMaskRenserer.color.a < 0.99f)
{
eyeMaskRenserer.color = Color.Lerp(startColor, targetColor, (Time.time - startTime) * needTime);
yield return null;
}
eyeMaskRenserer.color = targetColor;
if (blinkTime > 2f)
{
yield return new WaitForSeconds(blinkTime - 2f);
callback?.Invoke();
}
startColor = Color.black;
targetColor = Color.clear;
startTime = Time.time;
eyeMaskRenserer.color = startColor;
while (eyeMaskRenserer.color.a > 0.01f)
{
eyeMaskRenserer.color = Color.Lerp(startColor, targetColor, (Time.time - startTime) * needTime);
yield return null;
}
eyeMaskRenserer.color = targetColor;
SetTrs(eyeMaskRenserer.transform, false);
}
/// <summary>
/// 变化眼睛颜色
/// </summary>
public void ChangEyeColor2(Color startColor, Color endColor, float changeTime, Action ChangeCall = null)
{
eyeImg.color = startColor;
eyeImg.DOColor(endColor, changeTime).OnComplete(() =>
{
if (ChangeCall != null)
{
ChangeCall.Invoke();
}
});
}
2.计算两点的距离
/// <summary>
/// 计算两点的距离
/// </summary>
/// <param name="point1"></param>
/// <param name="point2"></param>
/// <returns></returns>
public static float CalculateTwoPointDistance(Vector3 point1, Vector3 point2)
{
//根据勾股定理(a²+b²=c²)求出支撑杆长度,开c的平方根得到弦的长度
float c = Vector3.Distance(point2, point1);
float a = Mathf.Abs(point2.y - point1.y);
return Mathf.Sqrt(Mathf.Pow(c, 2) - Mathf.Pow(a, 2));
}
3.Texture 相关函数
#region Texture2D
/// <summary>
/// 将Base64String转换成Texture
/// </summary>
/// <param name="base64Str"></param>
/// <returns></returns>
public static Texture2D Base64StringToTexture2D(string base64Str)
{
try
{
//将base64头部信息替换
base64Str = base64Str.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "")
.Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", "");
byte[] bytes = Convert.FromBase64String(base64Str);
Texture2D texture = new Texture2D(784, 800);
texture.LoadImage(bytes);
return texture;
}
catch (Exception ex)
{
Debug.LogError("转换异常" + ex);
return null;
}
}
/// <summary>
/// 编辑器模式下Texture转换成Texture2D
/// </summary>
/// <param name="texture"></param>
/// <returns></returns>
public static Texture2D TextureToTexture2D_Editor(Texture texture)
{
Texture2D texture2d = texture as Texture2D;
#if UNITY_EDITOR
UnityEditor.TextureImporter ti = (UnityEditor.TextureImporter)UnityEditor.TextureImporter.GetAtPath(UnityEditor.AssetDatabase.GetAssetPath(texture2d));
//图片Read/Write Enable的开关
ti.isReadable = true;
UnityEditor.AssetDatabase.ImportAsset(UnityEditor.AssetDatabase.GetAssetPath(texture2d));
#endif
return texture2d;
}
/// <summary>
/// 运行模式下Texture转换成Texture2D
/// </summary>
/// <param name="texture"></param>
/// <returns></returns>
public static Texture2D TextureToTexture2D(Texture texture, int width = 0, int height = 0)
{
if (width.Equals(0)) width = texture.width;
if (height.Equals(0)) height = texture.height;
Texture2D texture2D = new Texture2D(width, height, TextureFormat.RGBA32, false);
RenderTexture currentRT = RenderTexture.active;
RenderTexture renderTexture = RenderTexture.GetTemporary(width, height, 32);
Graphics.Blit(texture, renderTexture);
RenderTexture.active = renderTexture;
texture2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
texture2D.Apply();
RenderTexture.active = currentRT;
RenderTexture.ReleaseTemporary(renderTexture);
return texture2D;
}
#endregion
4.设置物体的材质球
/// <summary>
/// 设置物体上所有材质球[简单粗暴版]
/// </summary>
/// <param name="trs"></param>
/// <param name="isActive"></param>
public static void SetMaterials(Transform trs, Material material)
{
Material[] materials = trs.GetComponent<MeshRenderer>().materials;
for (int i = 0; i < materials.Length; i++)
{
materials[i] = material;
}
trs.GetComponent<MeshRenderer>().materials = materials;
}
/// <summary>
/// 设置物体上所有材质球[升级版]
/// </summary>
/// <param name="trs"></param>
/// <param name="isActive"></param>
public void SetMaterials(Transform trs, params Material[] p_mat)
{
Material[] materials = trs.GetComponent<MeshRenderer>().materials;
int length = p_mat.Length > materials.Length ? p_mat.Length : materials.Length;
Material[] mats = new Material[length];
for (int i = 0; i < length; i++)
{
if (i >= p_mat.Length)
{
mats[i] = materials[i];
continue;
}
mats[i] = p_mat[i];
}
//materials = mats;
trs.GetComponent<MeshRenderer>().materials = mats;
}
5.设置物体高亮
/// <summary>
/// 物体高亮
/// </summary>
/// <param name="obj"></param>
/// <param name="flag"></param>
/// <param name="endColor"></param>
/// <param name="startColor"></param>
public static void HightLightController(GameObject obj, bool flag, Color endColor = new Color(), Color startColor = new Color())
{
if (obj != null)
{
FlashingController flashing = obj.gameObject.GetComponent<FlashingController>();
if (flag)
{
if (!flashing)
flashing = obj.gameObject.AddComponent<FlashingController>();
flashing.flashingStartColor = startColor;
flashing.flashingEndColor = endColor;
flashing.flashingDelay = 0f;
flashing.flashingFrequency = 1f;
flashing.enabled = true;
}
else
{
if (flashing)
{
UnityEngine.Object.Destroy(flashing);
Highlighter high = obj.GetComponent<Highlighter>();
if (high)
UnityEngine.Object.Destroy(high);
}
}
}
}
/// <summary>
/// 设置高亮
/// </summary>
/// <param name="obj"></param>
/// <param name="active"></param>
public static void OutlineController(Transform obj, bool active)
{
if (active)
{
if (obj.GetComponent<Outline>() == null)
{
var controller = obj.gameObject.AddComponent<Outline>();
controller.OutlineColor = Color.red;
controller.OutlineWidth = 3f;
controller.Flashfrequency = 4f;
controller.PrecomputeOutline = true;
controller.Needflash = true;
controller.enabled = true;
}
else
{
obj.GetComponent<Outline>().enabled = true;
}
}
else
{
if (obj.GetComponent<Outline>() != null)
{
obj.GetComponent<Outline>().enabled = false;
}
}
}
6.延时方法
/// <summary>
/// 协程延时
/// </summary>
/// <param name="time"></param>
/// <param name="action"></param>
/// <returns></returns>
public static IEnumerator _WaitTime(float wait,Action _func)
{
yield return new WaitForSeconds(wait);
if (null != _func)
_func();
}
/// <summary>
/// 延迟一段时间执行回调
/// </summary>
/// <param name="delay"></param>
/// <param name="action"></param>
/// <returns></returns>
public static void DelayByDOTween(float delay, Action action)
{
var timer = 0f;
DOTween.To(() => timer, x => timer = x, 1f, delay).OnComplete(() => { action.Invoke(); });
}
7.通过名称查找子物体
/// <summary>
/// 通过名称查找未知层级子物体
/// </summary>
/// <param name="parentTF"></param>
/// <param name="childName"></param>
/// <returns></returns>
public static Transform GetChild(Transform parentTF, string childName)
{
//在子物体中查找名为childName 的子物体,如果有就返回,如果没有就开始递归
Transform childTF = parentTF.Find(childName);
if (childTF != null) return childTF;
//将问题交由子物体
int count = parentTF.childCount;
for (int i = 0; i < count; i++)
{
childTF = GetChild(parentTF.GetChild(i), childName);
if (childTF != null)
{
return childTF;
}
}
return null;
}
8.动态创建Tag
/// <summary>
/// 检查tag列表中是否有tag,没有该tag添加此tag
/// </summary>
/// <param name="tag">所要设设置的tag</param>
public static void SetGameObjectTag(GameObject gameObject, string tag)
{
#if UNITY_EDITOR
if (!UnityEditorInternal.InternalEditorUtility.tags.Equals(tag)) //如果tag列表中没有这个tag
{
UnityEditorInternal.InternalEditorUtility.AddTag(tag); //在tag列表中添加这个tag
}
#endif
gameObject.tag = tag;
}
9.对子物体进行排序
private void Sort(Transform root)
{
foreach (Transform item in GetTransforms(root))
{
item.SetAsLastSibling();//从小到大排序
//item.SetAsFirstSibling();//从大到小排序
}
}
/// <summary>
/// 返回 children transforms, 根据名称排列 .
/// </summary>
public Transform[] GetTransforms(Transform parentGameObject)
{
if (parentGameObject != null)
{
List<Component> components = new List<Component>(parentGameObject.GetComponentsInChildren(typeof(Transform)));
List<Transform> transforms = components.ConvertAll(c => (Transform)c);
transforms.Remove(parentGameObject.transform);
transforms.Sort(delegate (Transform a, Transform b)
{
return a.name.CompareTo(b.name);
});
return transforms.ToArray();
}
return null;
}
10.设置材质球的自发光_EMISSION属性
/// <summary>
/// 设置材质球的自发光_EMISSION属性
/// </summary>
/// <param name="trs"></param>
/// <param name="isActive"></param>
public static void SetMaterialsEmission(Transform trs, bool isActive)
{
Renderer[] rds = trs.GetComponentsInChildren<Renderer>();
//逐一遍历他的子物体中的Renderer
foreach (Renderer render in rds)
{
Material[] materials = render.GetComponent<MeshRenderer>().materials;
for (int i = 0; i < materials.Length; i++)
{
if (isActive)
materials[i].EnableKeyword("_EMISSION");
else
materials[i].DisableKeyword("_EMISSION");
}
}
}
11、颜色作为参数传参
/// <summary>
/// 默认设置
/// </summary>
/// <param name="trs"></param>
/// <param name="isActive"></param>
public static void SetTrsOutline(Transform trs, bool isActive)
{
SetTrsOutline(trs, isActive, Color.green);
}
/// <summary>
/// 更改颜色设置
/// </summary>
/// <param name="trs"></param>
/// <param name="isActive"></param>
/// <param name="color"></param>
public static void SetTrsOutline(Transform trs, bool isActive, Color color)
{
if (isActive)
{
if (trs.GetComponent<Outline>() == null)
{
var controller = trs.gameObject.AddComponent<Outline>();
controller.OutlineColor = color;
controller.OutlineWidth = 5f;
controller.Flashfrequency = 5f;
controller.PrecomputeOutline = true;
controller.Needflash = true;
controller.enabled = true;
}
else
{
trs.GetComponent<Outline>().enabled = true;
}
}
else
{
if (trs.GetComponent<Outline>() != null)
{
trs.GetComponent<Outline>().enabled = false;
}
}
}
12、设置物体碰撞体
/// <summary>
/// 开启或添加碰撞
/// </summary>
/// <param name="obj"></param>
private void OnEnableCollider(GameObject obj)
{
List<Collider> allColliders = new List<Collider>(); //物体所有的碰撞体
List<Collider> objColliders = new List<Collider>(); //当前物体要执行的碰撞体
allColliders.AddRange(obj.GetComponentsInChildren<Collider>());
//如果当前物体(包含子物体)没有碰撞 查找到第一个子物体的网格添加碰撞
if (allColliders.Count == 0 || allColliders == null)
{
var mesh = obj.GetComponentInChildren<MeshRenderer>().gameObject;
var bc = mesh.AddComponent<BoxCollider>();
objColliders.Add(bc);
}
else //若存在碰撞 查找到第一个碰撞所在位置 获取该物体(仅自身)上的所有碰撞
{
GameObject collider_OBJ = allColliders[0].gameObject;
objColliders.AddRange(collider_OBJ.GetComponentsInChildren<Collider>());
}
foreach (var collider in objColliders)
{
collider.enabled = true;
collider.isTrigger = true;
}
}
/// <summary>
/// 关闭碰撞
/// </summary>
/// <param name="obj"></param>
private void OnDisableCollider(GameObject obj)
{
List<Collider> colliders = new List<Collider>(); //物体所有的碰撞体
colliders.AddRange(obj.GetComponentsInChildren<Collider>());
foreach (var collider in colliders)
{
collider.enabled = false;
collider.isTrigger = false;
}
}
13、获取一个父级节点下子节点的索引
在 Unity 中,要获取一个父级节点下子节点的索引,可以使用 Transform.GetChild()
方法结合循环来遍历子节点,并找到目标子节点在父级节点中的索引位置。下面是一个示例代码,演示如何获取一个父级节点下特定子节点的索引:
using UnityEngine;
public class GetChildIndex : MonoBehaviour
{
public Transform parentObject; // 引用到父级节点
public Transform targetChild; // 引用到目标子节点
void Start()
{
int targetIndex = GetChildIndexInParent(parentObject, targetChild);
Debug.Log("Target Child Index: " + targetIndex);
}
int GetChildIndexInParent(Transform parent, Transform target)
{
for (int i = 0; i < parent.childCount; i++)
{
if (parent.GetChild(i) == target)
{
return i;
}
}
return -1; // 如果未找到目标子节点,返回-1
}
}
14、 对子节点按照名称排序
在 Unity 中,你可以使用 Transform
中的 GetComponentsInChildren
方法来快速获取父级节点下的所有子节点,并使用 LINQ(Language Integrated Query)语法来对子节点进行排序。以下是一个快速对子节点按照字母顺序排序的示例代码:
/// <summary>
/// 对子节点进行名称排序
/// </summary>
/// <param name="parent"></param>
private void OrderChild(Transform parent)
{
// 获取父级节点下所有子节点
Transform[] children = parent.GetComponentsInChildren<Transform>(true)
.Where(t => t.parent == parent && t != parent) // 筛选出直接子节点
.OrderBy(t => t.name) // 按照子节点名称排序
.ToArray();
// 重新设置排序后的子节点的顺序
for (int i = 0; i < children.Length; i++)
{
children[i].SetSiblingIndex(i);
}
}