TH1/Unity/Assets/Plugins/Assisstant/UnityAssisstant.cs
2025-08-20 02:24:48 +08:00

1356 lines
35 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using UnityEngine;
public class GameObjectKeyName
{
public static readonly string Level = "level";
public static readonly string LevelLiving = "level_living";
public static readonly string LevelDead = "level_dead";
//
public static readonly string FadeOut = "FadeOut";
//
public static readonly string LOD = "LOD_";
public static readonly string LOD_HEIGHT = "LOD_H";
public static readonly string LOD_LOW = "LOD_L";
//
public static readonly string BODY_LOW = "BodyLow";
}
public static class UnityComponentList<T>
where T : Component
{
public static int Count
{ get { return _list.Count; } }
public static List<T> List
{ get { return _list; } }
public static void Begin(GameObject obj)
{
Begin(obj, false);
}
public static void Begin(GameObject obj, bool includeInactive)
{
_list.Clear();
if (obj != null)
{
obj.GetComponentsInChildren<T>(includeInactive, _list);
}
}
public static void End()
{
_list.Clear();
}
private static List<T> _list = new List<T>();
}
public static class UnityAssisstant
{
public static readonly string GROUP_PRO = "pro";
public static readonly string GROUP_VIB = "vib";
public static readonly string GROUP_RES = "pro";
public static readonly string GROUP_BUNDLE = "bundle";
public static readonly string GROUP_PATCH = "patch";
public static Quaternion CameraRotation = Quaternion.identity;
public static float CameraYaw = 0.0f;
public static void SetActive(GameObject obj, bool value)
{
if (obj != null)
{
obj.SetActive(value);
}
}
public static void Dispose<T>(ref T obj) where T : IDisposable
{
if (obj == null)
{
return;
}
obj.Dispose();
obj = default; // 这里和null本质上没有区别
}
public static void DelayDispose<T>(float delay, ref T obj) where T : IDisposable
{
if (obj == null)
{
return;
}
var tempObj = obj;
obj = default;
// 这里计时器不需要持有因为tempObj就算被其他地方销毁了也不会报错
ViTimerInstance.SetTime(new ViTimeNode1(), delay, node => Dispose(ref tempObj));
}
//
public static void Dispose<T>(ref List<T> list) where T : IDisposable
{
if (list == null)
{
return;
}
//
foreach (var obj in list)
{
obj.Dispose();
}
list.Clear();
}
//
public static void Dispose<T1,T2>(ref Dictionary<T1,T2> dictionary) where T2 : IDisposable
{
if (dictionary == null)
{
return;
}
//
foreach (var obj in dictionary.Values)
{
obj.Dispose();
}
dictionary.Clear();
}
//
public static void Dispose<T1,T2>(ref Dictionary<T1, List<T2>> dictionary) where T2 : IDisposable
{
if (dictionary == null)
{
return;
}
//
foreach (var obj in dictionary.Values)
{
var list = obj;
Dispose(ref list);
}
dictionary.Clear();
}
public static void Destroy<T>(ref T obj) where T : UnityEngine.Object
{
if (obj == null)
{
return;
}
UnityEngine.GameObject gameObj = obj as UnityEngine.GameObject;
if (gameObj != null)
{
gameObj.SetActive(false);
gameObj.transform.parent = null;
}
UnityEngine.Object.Destroy(obj);
obj = null;
}
public static void Destroy(ref UnityEngine.GameObject obj)
{
if (obj == null)
{
return;
}
obj.transform.SetParent(null);
obj.SetActive(false);
UnityEngine.Object.Destroy(obj);
obj = null;
}
public static void Destroy(List<UnityEngine.Object> objList)
{
if (objList == null)
{
return;
}
for (int iter = 0; iter < objList.Count; ++iter)
{
UnityEngine.Object iterObj = objList[iter];
Destroy(ref iterObj);
}
objList.Clear();
}
public static void Destroy(List<UnityEngine.GameObject> objList)
{
if (objList == null)
{
return;
}
for (int iter = 0; iter < objList.Count; ++iter)
{
UnityEngine.GameObject iterObj = objList[iter];
Destroy(ref iterObj);
}
objList.Clear();
}
/*
public static GameObject InstantiateScene(GameObject gameObj)
{
GameObject newObj = UnityEngine.Object.Instantiate(gameObj);
newObj.transform.localPosition = Vector3.zero;
newObj.transform.localRotation = Quaternion.identity;
newObj.transform.localScale = Vector3.one;
newObj.SetActive(true);
if (Application.isEditor)
{
SceneConfig sceneConfig = newObj.GetComponent<SceneConfig>();
if (sceneConfig.Skybox != null)
{
Int32 renderQueue = sceneConfig.Skybox.renderQueue;
Shader shader = Shader.Find(sceneConfig.Skybox.shader.name);
if (shader != null)
{
sceneConfig.Skybox.shader = shader;
//sceneConfig.Skybox.renderQueue = renderQueue;
}
}
//
ReplaceMaterialShader(newObj);
}
return newObj;
}
*/
public static GameObject Instantiate(GameObject gameObj, Vector3 position, Quaternion rotation)
{
if (gameObj == null)
{
return null;
}
GameObject newObj = UnityEngine.Object.Instantiate(gameObj, position, rotation) as GameObject;
newObj.SetActive(true);
if (Application.isEditor)
{
ReplaceMaterialShader(newObj);
}
return newObj;
}
public static GameObject Instantiate(GameObject gameObj)
{
if (gameObj == null)
{
return null;
}
GameObject newObj = UnityEngine.Object.Instantiate(gameObj);
newObj.SetActive(true);
if (Application.isEditor)
{
ReplaceMaterialShader(newObj);
}
return newObj;
}
public static GameObject InstantiateAsChild(GameObject gameObj, Transform tran, bool worldPosStays)
{
if (gameObj == null)
{
return null;
}
return InstantiateAsChild(gameObj, tran, Vector3.zero, true, worldPosStays);
}
public static GameObject InstantiateAsChild(GameObject gameObj, Transform tran)
{
if (gameObj == null)
{
return null;
}
return InstantiateAsChild(gameObj, tran, Vector3.zero, true);
}
public static GameObject InstantiateAsChild(GameObject gameObj, Transform tran, Vector3 offset, bool inheritScale, bool worldPosStays = true)
{
if (gameObj == null)
{
return null;
}
Vector3 position = Vector3.zero;
Quaternion rotation = Quaternion.identity;
if (tran != null)
{
position = tran.position + offset;
rotation = tran.rotation;
}
GameObject newObj = UnityEngine.Object.Instantiate(gameObj, position, rotation) as GameObject;
if (!inheritScale)
{
newObj.transform.localScale = Vector3.one;
}
newObj.SetActive(true);
if (tran != null)
{
newObj.transform.SetParent(tran, worldPosStays);
}
if (inheritScale)
{
newObj.transform.localScale = Vector3.one;
}
if (Application.isEditor)
{
ReplaceMaterialShader(newObj);
}
return newObj;
}
public static void SetLossyScale(Transform tran, float value)
{
Transform parent = tran.parent;
Vector3 scale = Vector3.one * value;
if (parent != null)
{
Vector3 parentScale = parent.lossyScale;
scale.x /= parentScale.x;
scale.y /= parentScale.y;
scale.z /= parentScale.z;
}
tran.localScale = scale;
}
public static void SetStaticRecursively(UnityEngine.GameObject obj, bool value)
{
_SetStaticRecursively(obj, value);
}
private static void _SetStaticRecursively(UnityEngine.GameObject obj, bool value)
{
obj.isStatic = value;
for (int iter = 0; iter < obj.transform.childCount; ++iter)
{
Transform iterTran = obj.transform.GetChild(iter);
_SetStaticRecursively(iterTran.gameObject, value);
}
}
public static void SetLayerRecursively(UnityEngine.GameObject obj, int value)
{
_SeLayerRecursively(obj, value);
}
private static void _SeLayerRecursively(UnityEngine.GameObject obj, int value)
{
obj.layer = value;
for (int iter = 0; iter < obj.transform.childCount; ++iter)
{
Transform iterTran = obj.transform.GetChild(iter);
_SeLayerRecursively(iterTran.gameObject, value);
}
}
public static Transform GetChildRecursively(this Transform root, string name)
{
return GetChildRecursively(root, name, null);
}
public static Transform GetChildRecursively(this Transform root, string name, Transform defaultTranform)
{
Transform tran = _GetChildRecursively(root, name, false);
if (tran == null)
{
tran = _GetChildRecursively(root, name, true);
}
if (tran == null)
{
tran = defaultTranform;
}
return tran;
}
private static Transform _GetChildRecursively(Transform root, string name, bool ignoreDeactive)
{
if (!ignoreDeactive && !root.gameObject.activeSelf)
{
return null;
}
if (root.gameObject.name == name)
{
return root;
}
for (int iter = 0; iter < root.childCount; ++iter)
{
Transform iterTran = root.GetChild(iter);
Transform iterTarget = _GetChildRecursively(iterTran, name, ignoreDeactive);
if (iterTarget != null)
{
return iterTarget;
}
}
return null;
}
public static string GetTranFullHierarchy(GameObject go)
{
if (go == null)
{
return string.Empty;
}
Transform current = go.transform;
string path = current.name;
while (current.parent != null)
{
current = current.parent;
path = current.name + "/" + path;
}
return path;
}
public static void GetChildren(this GameObject parent, string name, List<GameObject> objList)
{
for (int iter = 0; iter < parent.transform.childCount; ++iter)
{
GameObject iterObject = parent.transform.GetChild(iter).gameObject;
if (iterObject.name == name)
{
objList.Add(iterObject);
}
}
}
public static GameObject GetChild(this GameObject parent, string name)
{
Transform childTransform = parent.transform.Find(name);
if (childTransform != null)
{
return childTransform.gameObject;
}
else
{
return null;
}
}
public static void SetChildStateRecursively(Transform root, string name, bool value)
{
Transform child = GetChildRecursively(root, name, null);
if (child != null)
{
child.gameObject.SetActive(value);
}
}
public static void UpdateSoundVolume(GameObject obj, float volume)
{
if (obj == null)
{
return;
}
//
UnityComponentList<AudioSource>.Begin(obj);
for (int iter = 0; iter < UnityComponentList<AudioSource>.List.Count; ++iter)
{
AudioSource iterComponent = UnityComponentList<AudioSource>.List[iter];
iterComponent.volume = volume;
}
UnityComponentList<AudioSource>.End();
}
public static void SetSoundLoop(GameObject obj, bool value)
{
if (obj == null)
{
return;
}
//
UnityComponentList<AudioSource>.Begin(obj);
for (int iter = 0; iter < UnityComponentList<AudioSource>.List.Count; ++iter)
{
AudioSource iterComponent = UnityComponentList<AudioSource>.List[iter];
iterComponent.loop = value;
}
UnityComponentList<AudioSource>.End();
}
public static T GetChildComponent<T>(GameObject parent, string name) where T : Component
{
Transform childTransform = parent.transform.Find(name);
if (childTransform != null)
{
return childTransform.gameObject.GetComponent<T>();
}
else
{
return null;
}
}
public static T GetComponentRecursively<T>(GameObject obj)
where T : Component
{
if (obj == null)
{
return null;
}
T component = obj.GetComponent<T>();
if (component != null)
{
return component;
}
return obj.GetComponentInChildren<T>();
}
public static void GetComponentRecursively<T>(GameObject obj, List<T> list)
where T : Component
{
list.Clear();
if (obj == null)
{
return;
}
obj.GetComponentsInChildren<T>(list);
//T component = obj.GetComponent<T>();
//if (component != null)
//{
// list.Add(component);
//}
}
public static Animation GetAvatarAnimation(GameObject obj)
{
if (obj == null)
{
return null;
}
Animation animation = obj.GetComponentInChildren<Animation>();
if (animation != null)
{
return animation;
}
//UnityComponentList<Animation>.Begin()
//Animation[] animationList = obj.GetComponentsInChildren<Animation>();
//for (int iter = 0; iter < animationList.Length; ++iter)
//{
// Animation iterAnim = animationList[iter];
// if (iterAnim["Idle"] != null)
// {
// return iterAnim;
// }
//}
//if (animationList.Length > 0)
//{
// return animationList[0];
//}
return null;
}
public static void JionTransform(Transform parent, Transform child)
{
Quaternion oldQuat = child.transform.localRotation;
if (parent != null)
{
child.parent = parent;
}
child.localPosition = Vector3.zero;
child.localRotation = oldQuat;
}
public static void JionTransform(GameObject parent, GameObject child)
{
Quaternion oldQuat = child.transform.localRotation;
if (parent != null)
{
child.transform.parent = parent.transform;
}
child.transform.localPosition = Vector3.zero;
child.transform.localRotation = oldQuat;
}
public static void JionTransform(Transform parent, Transform child, Vector3 offset, Quaternion rot)
{
if (parent != null)
{
child.parent = parent;
}
child.localPosition = offset;
child.localRotation = rot;
}
public static void JionTransform(GameObject parent, GameObject child, Vector3 offset, Quaternion rot)
{
if (parent != null)
{
child.transform.parent = parent.transform;
}
child.transform.localPosition = offset;
child.transform.localRotation = rot;
}
public static void SetScale(GameObject obj, float scale)
{
SetScale(obj, new Vector3(scale, scale, scale));
}
public static void SetScale(GameObject obj, Vector3 scale)
{
if (obj != null)
{
obj.transform.localScale = scale;
Transform parent = obj.transform.parent;
if (parent != null)
{
Vector3 parentScale = parent.lossyScale;
scale.x /= parentScale.x;
scale.y /= parentScale.y;
scale.z /= parentScale.z;
obj.transform.localScale = scale;
}
else
{
obj.transform.localScale = scale;
}
}
}
public static GameObject CreateChild(Transform root, string name, bool force)
{
Transform child = root.Find(name);
if (child != null && !force)
{
return child.gameObject;
}
GameObject newObj = new GameObject(name);
JionTransform(root, newObj.transform);
return newObj;
}
public static T CreateComponent<T>(GameObject obj) where T : Component
{
T component = obj.GetComponent<T>();
if (component == null)
{
component = obj.AddComponent<T>();
}
return component;
}
public static void DelComponent<T>(GameObject obj) where T : Component
{
T component = obj.GetComponent<T>();
if (component != null)
{
UnityEngine.Object.Destroy(component);
}
}
public static void SetComponentState<T>(GameObject obj, bool active) where T : Behaviour
{
T component = obj.GetComponent<T>();
if (component != null)
{
component.enabled = active;
}
}
public static void SetComponentsState<T>(GameObject obj, bool active) where T : Behaviour
{
UnityComponentList<T>.Begin(obj, true);
for (int iter = 0; iter < UnityComponentList<T>.Count; ++iter)
{
T iterComponent = UnityComponentList<T>.List[iter];
iterComponent.enabled = active;
}
UnityComponentList<T>.End();
}
#region UI
public static Vector3 WorldToNGUIPixel(Camera camera, Vector3 pos)
{
Vector3 screenPos = camera.WorldToScreenPoint(pos);
float x = screenPos.x - Screen.width * 0.5f;
float y = screenPos.y - Screen.height * 0.5f;
return new Vector3(x, y, 0.0f);
}
public static Vector3 WorldToNGUIScale(Camera camera, Vector3 pos)
{
Vector3 screenPos = camera.WorldToScreenPoint(pos);
float horizScale = (float)Screen.width / (float)Screen.height;
float x = (1.0f + (screenPos.x - Screen.width) / Screen.width * 2) * horizScale;
float y = 1.0f + (screenPos.y - Screen.height) / Screen.height * 2;
return new Vector3(x, y, 0.0f);
}
public static Vector3 ScreenToNGUIScale(Vector3 screenPos)
{
float horizScale = (float)Screen.width / (float)Screen.height;
float x = (1.0f + (screenPos.x - Screen.width) / Screen.width * 2) * horizScale;
float y = 1.0f + (screenPos.y - Screen.height) / Screen.height * 2;
return new Vector3(x, y, 0.0f);
}
#endregion UI
#region Gree&Angle
public static float Translate360To2Pi(float value)
{
return (180.0f - value) * 3.14f / 180.0f;
}
public static float Translate2PiTo360(float value)
{
return 180.0f - value / 3.14f * 180.0f;
}
#endregion Gree&Angle
//public static void SetColor(Renderer renderer, Color color)
//{
// Material[] materials = renderer.materials;
// for (int iter = 0; iter < materials.Length; ++iter)
// {
// Material material = materials[iter];
// material.color = color;
// }
//}
#region Color
public static void SetColor(Renderer renderer, Color color, Dictionary<Int32, Color> oldColors)
{
Material[] materials = renderer.materials;
for (int iter = 0; iter < materials.Length; ++iter)
{
Material material = materials[iter];
if (!material.HasProperty("_Color"))
{
continue;
}
if (oldColors != null)
{
oldColors[material.GetInstanceID()] = material.color;
}
material.color = color;
}
}
public static void SetColor(List<Renderer> renderers, Color color, Dictionary<Int32, Color> oldColors)
{
for (int iter = 0; iter < renderers.Count; ++iter)
{
SetColor(renderers[iter], color, oldColors);
}
}
public static void SetColor(Renderer renderer, Dictionary<Int32, Color> colors)
{
Material[] materials = renderer.materials;
for (int iter = 0; iter < materials.Length; ++iter)
{
Material material = materials[iter];
if (!material.HasProperty("_Color"))
{
continue;
}
Color color;
if (colors.TryGetValue(material.GetInstanceID(), out color))
{
material.color = color;
}
}
}
public static void SetColor(List<Renderer> renderers, Dictionary<Int32, Color> colors)
{
for (int iter = 0; iter < renderers.Count; ++iter)
{
SetColor(renderers[iter], colors);
}
}
public static void SetColor(GameObject obj, Color color)
{
UnityComponentList<Renderer>.Begin(obj);
SetColor(UnityComponentList<Renderer>.List, null);
UnityComponentList<Renderer>.End();
}
public static void SetColor(GameObject obj, Color color, Dictionary<Int32, Color> oldColors)
{
UnityComponentList<Renderer>.Begin(obj);
SetColor(UnityComponentList<Renderer>.List, color, oldColors);
UnityComponentList<Renderer>.End();
}
public static void SetColor(GameObject obj, Dictionary<Int32, Color> colors)
{
UnityComponentList<Renderer>.Begin(obj);
SetColor(UnityComponentList<Renderer>.List, colors);
UnityComponentList<Renderer>.End();
}
#endregion Color
public static void Rewind(GameObject obj)
{
UnityComponentList<Animation>.Begin(obj);
for (int iter = 0; iter < UnityComponentList<Animation>.List.Count; ++iter)
{
Animation iterComponent = UnityComponentList<Animation>.List[iter];
iterComponent.Rewind();
}
UnityComponentList<Animation>.End();
//
UnityComponentList<Animator>.Begin(obj);
for (int iter = 0; iter < UnityComponentList<Animator>.List.Count; ++iter)
{
Animator iterComponent = UnityComponentList<Animator>.List[iter];
iterComponent.StopPlayback();
}
UnityComponentList<Animator>.End();
//
UnityComponentList<ParticleSystem>.Begin(obj);
for (int iter = 0; iter < UnityComponentList<ParticleSystem>.List.Count; ++iter)
{
ParticleSystem iterComponent = UnityComponentList<ParticleSystem>.List[iter];
iterComponent.time = 0.0f;
iterComponent.Play();
}
UnityComponentList<ParticleSystem>.End();
//
}
//
public static void ReplaceMaterialShader(Material material)
{
if (material == null)
{
return;
}
//
Int32 renderQueue = material.renderQueue;
Shader shader = Shader.Find(material.shader.name);
if (shader != null)
{
#if UNITY_EDITOR
if (!material.isVariant)
{
material.shader = shader;
}
#else
material.shader = shader;
#endif
material.renderQueue = renderQueue;
}
}
public static void ReplaceMaterialShader(Renderer renderer)
{
for (int iter = 0; iter < renderer.sharedMaterials.Length; ++iter)
{
Material iterMaterial = renderer.sharedMaterials[iter];
if (iterMaterial != null)
{
ReplaceMaterialShader(iterMaterial);
}
}
}
public static void ReplaceMaterialShader(GameObject gameobject)
{
UnityComponentList<Renderer>.Begin(gameobject, true);
for (int iter = 0; iter < UnityComponentList<Renderer>.List.Count; ++iter)
{
ReplaceMaterialShader(UnityComponentList<Renderer>.List[iter]);
}
UnityComponentList<Renderer>.End();
}
public static SkinnedMeshRenderer GetMainSkin(GameObject obj)
{
SkinnedMeshRenderer skin = obj.GetComponent<SkinnedMeshRenderer>();
if (skin != null)
{
return skin;
}
//
float maxBody = 0.0f;
UnityComponentList<SkinnedMeshRenderer>.Begin(obj);
for (int iter = 0; iter < UnityComponentList<SkinnedMeshRenderer>.List.Count; ++iter)
{
SkinnedMeshRenderer iterComponent = UnityComponentList<SkinnedMeshRenderer>.List[iter];
Vector3 iterSize = iterComponent.bounds.size;
float iterBody = iterSize.x * iterSize.y * iterSize.z;
if (iterBody >= maxBody)
{
maxBody = iterBody;
skin = iterComponent;
}
}
UnityComponentList<SkinnedMeshRenderer>.End();
return skin;
}
public static void SetParticleLightEnable(GameObject obj, bool paritcalLight)
{
if (!paritcalLight)
{
return;
}
//
UnityComponentList<Light>.Begin(obj);
for (int iter = 0; iter < UnityComponentList<Light>.List.Count; ++iter)
{
Light iterComponent = UnityComponentList<Light>.List[iter];
iterComponent.enabled = true;
}
UnityComponentList<Light>.End();
}
public delegate Material GhostMaterialReplace(Material old, Material newTemplate);
public static GameObject CreateGhostAvatar(GameObject root, SkinnedMeshRenderer renderer, Material material, GhostMaterialReplace materialReplace, List<UnityEngine.Object> ownMeshList)
{
if (renderer.sharedMesh == null)
{
return null;
}
GameObject newObj = UnityAssisstant.CreateChild(root.transform, renderer.gameObject.name, false);
SkinnedMeshRenderer mesh = UnityAssisstant.CreateComponent<SkinnedMeshRenderer>(newObj);
mesh.sharedMesh = (UnityEngine.Mesh)UnityEngine.Object.Instantiate(renderer.sharedMesh);
mesh.bones = renderer.bones;
Material newMaterial = material;
int materialSize = renderer.materials.Length;
UnityEngine.Material[] materials = new UnityEngine.Material[materialSize];
for (int iter = 0; iter < materialSize; ++iter)
{
if (materialReplace != null)
{
newMaterial = materialReplace(renderer.materials[iter], material);
}
//
materials[iter] = newMaterial;
}
mesh.material = newMaterial;
mesh.materials = materials;
mesh.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
mesh.receiveShadows = false;
if (ownMeshList != null)
{
ownMeshList.Add(mesh.sharedMesh);
}
return newObj;
}
public static GameObject CreateGhostAvatar(GameObject root, MeshRenderer renderer, Material material, GhostMaterialReplace materialReplace, List<UnityEngine.Object> ownMeshList)
{
GameObject newObj = UnityAssisstant.CreateChild(root.transform, renderer.gameObject.name, false);
SkinnedMeshRenderer mesh = UnityAssisstant.CreateComponent<SkinnedMeshRenderer>(newObj);
mesh.sharedMesh = (UnityEngine.Mesh)UnityEngine.Object.Instantiate(renderer.additionalVertexStreams);
Material newMaterial = material;
if (materialReplace != null)
{
newMaterial = materialReplace(mesh.material, material);
}
int materialSize = renderer.materials.Length;
UnityEngine.Material[] materials = new UnityEngine.Material[materialSize];
for (int iter = 0; iter < materialSize; ++iter)
{
materials[iter] = newMaterial;
}
mesh.material = newMaterial;
mesh.materials = materials;
mesh.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
mesh.receiveShadows = false;
if (ownMeshList != null)
{
ownMeshList.Add(mesh.sharedMesh);
}
return newObj;
}
public static GameObject BakeMesh(GameObject gameobject, Material replaceMaterial)
{
if (gameobject == null)
{
return null;
}
//
GameObject shadowRoot = new GameObject();
shadowRoot.name = gameobject.name + "_shadowRoot";
//
UnityComponentList<SkinnedMeshRenderer>.Begin(gameobject);
for (int iter = 0; iter < UnityComponentList<SkinnedMeshRenderer>.List.Count; ++iter)
{
SkinnedMeshRenderer iterSkinrenderer = UnityComponentList<SkinnedMeshRenderer>.List[iter];
if (iterSkinrenderer == null)
{
continue;
}
//
Mesh mesh = new Mesh();
iterSkinrenderer.BakeMesh(mesh);
//
GameObject iterChildrenobj = CreatMeshGameObject(mesh, iterSkinrenderer, replaceMaterial);
//
iterChildrenobj.transform.position = iterSkinrenderer.gameObject.transform.position - gameobject.transform.position;
iterChildrenobj.transform.rotation = iterSkinrenderer.gameObject.transform.rotation;
iterChildrenobj.transform.parent = shadowRoot.transform;
}
UnityComponentList<SkinnedMeshRenderer>.End();
//
UnityComponentList<MeshFilter>.Begin(gameobject);
for (int iter = 0; iter < UnityComponentList<MeshFilter>.List.Count; ++iter)
{
MeshFilter iterMeshFilter = UnityComponentList<MeshFilter>.List[iter];
if (!iterMeshFilter.gameObject.name.StartsWith("Wp"))
{
continue;
}
MeshRenderer iterMeshrenderer = iterMeshFilter.gameObject.GetComponent<MeshRenderer>();
if (iterMeshFilter == null || iterMeshrenderer == null) continue;
//
Mesh mesh = UnityEngine.Object.Instantiate(iterMeshFilter.mesh);
//
GameObject childrenobj = CreatMeshGameObject(mesh, iterMeshrenderer, replaceMaterial);
//
childrenobj.transform.position = iterMeshrenderer.gameObject.transform.position - gameobject.transform.position;
childrenobj.transform.rotation = iterMeshrenderer.gameObject.transform.rotation;
childrenobj.transform.localScale = iterMeshrenderer.gameObject.transform.lossyScale;
childrenobj.transform.parent = shadowRoot.transform;
}
UnityComponentList<MeshFilter>.End();
//
shadowRoot.transform.position = gameobject.transform.position;
StaticBatchingUtility.Combine(shadowRoot);
return shadowRoot;
}
public static GameObject CreatMeshGameObject(Mesh mesh, Renderer render, Material replaceMaterial)
{
GameObject childrenobj = new GameObject();
MeshFilter meshfilter = childrenobj.AddComponent<MeshFilter>();
MeshRenderer meshrender = childrenobj.AddComponent<MeshRenderer>();
meshfilter.mesh = mesh;
//
if (replaceMaterial)
{
Material[] materials = new Material[render.materials.Length];
for (int iter = 0; iter < materials.Length; ++iter)
{
materials[iter] = replaceMaterial;
}
meshrender.materials = materials;
}
else
{
meshrender.materials = render.materials;
}
//
meshrender.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
meshrender.receiveShadows = false;
meshrender.lightProbeUsage = UnityEngine.Rendering.LightProbeUsage.Off;
//
return childrenobj;
}
public static Material MaterialTextureAlphaReplace(Material oldMaterial, Material newMaterialTemplate)
{
if (newMaterialTemplate.HasProperty("_OriginalTex"))
{
Material newMaterial = new Material(newMaterialTemplate.shader);
newMaterial.CopyPropertiesFromMaterial(newMaterialTemplate);
Texture meshMainTexture = null;
if (oldMaterial.HasProperty("_MainTex"))
{
meshMainTexture = oldMaterial.GetTexture("_MainTex");
}
if (meshMainTexture != null)
{
newMaterial.SetTexture("_OriginalTex", meshMainTexture);
}
else
{
Texture2D texture = new Texture2D(1, 1, TextureFormat.ARGB32, false);
texture.SetPixel(0, 0, Color.black);
newMaterial.SetTexture("_OriginalTex", texture);
newMaterial.SetColor("_RimColor", Color.black);
}
return newMaterial;
}
else
{
return newMaterialTemplate;
}
}
public static Material MaterialToonShaderTextureReplace(Material oldMaterial, Material newMaterialTemplate)
{
if (newMaterialTemplate.HasProperty("_MainTex"))
{
Material newMaterial = new Material(newMaterialTemplate.shader);
newMaterial.CopyPropertiesFromMaterial(newMaterialTemplate);
Texture meshMainTexture = null;
if (oldMaterial.HasProperty("_MainTex"))
{
meshMainTexture = oldMaterial.GetTexture("_MainTex");
newMaterial.SetTexture("_MainTex", meshMainTexture);
}
if (oldMaterial.HasProperty("_Ramp"))
{
newMaterial.SetTexture("_Ramp", oldMaterial.GetTexture("_Ramp"));
}
if (oldMaterial.HasProperty("_SpecColor"))
{
newMaterial.SetColor("_SpecColor", oldMaterial.GetColor("_SpecColor"));
}
if (oldMaterial.HasProperty("_Shininess"))
{
newMaterial.SetFloat("_Shininess", oldMaterial.GetFloat("_Shininess"));
}
if (oldMaterial.HasProperty("_Color"))
{
newMaterial.SetColor("_Color", oldMaterial.GetColor("_Color"));
}
if (oldMaterial.HasProperty("_SColor"))
{
newMaterial.SetColor("_SColor", oldMaterial.GetColor("_SColor"));
}
if (oldMaterial.HasProperty("_Outline"))
{
newMaterial.SetFloat("_Outline", oldMaterial.GetFloat("_Outline"));
}
if (oldMaterial.HasProperty("_OutlineColor"))
{
newMaterial.SetColor("_OutlineColor", oldMaterial.GetColor("_OutlineColor"));
}
if (oldMaterial.HasProperty("_Emission"))
{
newMaterial.SetColor("_Emission", oldMaterial.GetColor("_Emission"));
}
//
return newMaterial;
}
else
{
return newMaterialTemplate;
}
}
public static Material MaterialMatCapTextureAddReplace(Material oldMaterial, Material newMaterialTemplate)
{
if (newMaterialTemplate.HasProperty("_MainTex"))
{
Material newMaterial = new Material(newMaterialTemplate.shader);
newMaterial.CopyPropertiesFromMaterial(newMaterialTemplate);
Texture meshMainTexture = null;
if (oldMaterial.HasProperty("_MainTex"))
{
meshMainTexture = oldMaterial.GetTexture("_MainTex");
newMaterial.SetTexture("_MainTex", meshMainTexture);
}
if (oldMaterial.HasProperty("_MatCap"))
{
newMaterial.SetTexture("_MatCap", oldMaterial.GetTexture("_MatCap"));
}
//
return newMaterial;
}
else
{
return newMaterialTemplate;
}
}
public static Material CharacterShaderReplace(Material oldMaterial, Material newMaterialTemplate)
{
if (newMaterialTemplate.HasProperty("_MainTex"))
{
Material newMaterial = new Material(newMaterialTemplate.shader);
newMaterial.CopyPropertiesFromMaterial(newMaterialTemplate);
Texture meshMainTexture = null;
if (oldMaterial.HasProperty("_MainTex"))
{
meshMainTexture = oldMaterial.GetTexture("_MainTex");
newMaterial.SetTexture("_MainTex", meshMainTexture);
}
if (oldMaterial.HasProperty("_MatTex"))
{
newMaterial.SetTexture("_MatTex", oldMaterial.GetTexture("_MatTex"));
}
if (oldMaterial.HasProperty("_DiffuseRampTex"))
{
newMaterial.SetTexture("_DiffuseRampTex", oldMaterial.GetTexture("_DiffuseRampTex"));
}
if (oldMaterial.HasProperty("_SpecRampTex"))
{
newMaterial.SetTexture("_SpecRampTex", oldMaterial.GetTexture("_SpecRampTex"));
}
if (oldMaterial.HasProperty("_OutlineWidth"))
{
newMaterial.SetFloat("_OutlineWidth", oldMaterial.GetFloat("_OutlineWidth"));
}
if (oldMaterial.HasProperty("_EdgeColor"))
{
newMaterial.SetColor("_EdgeColor", oldMaterial.GetColor("_EdgeColor"));
}
if (oldMaterial.HasProperty("_LightParams"))
{
newMaterial.SetVector("_LightParams", oldMaterial.GetVector("_LightParams"));
}
if (oldMaterial.HasProperty("_LightParamsHDR"))
{
newMaterial.SetVector("_LightParamsHDR", oldMaterial.GetVector("_LightParamsHDR"));
}
if (oldMaterial.HasProperty("_HairParams"))
{
newMaterial.SetVector("_HairParams", oldMaterial.GetVector("_HairParams"));
}
if (oldMaterial.HasProperty("_AnimeEnvTex"))
{
newMaterial.SetTexture("_AnimeEnvTex", oldMaterial.GetTexture("_AnimeEnvTex"));
}
if (oldMaterial.HasProperty("_EnvParams"))
{
newMaterial.SetVector("_EnvParams", oldMaterial.GetVector("_EnvParams"));
}
if (oldMaterial.HasProperty("_SceneEnvTex"))
{
newMaterial.SetTexture("_SceneEnvTex", oldMaterial.GetTexture("_SceneEnvTex"));
}
//
return newMaterial;
}
else
{
return newMaterialTemplate;
}
}
public static void SelectShareMaterial(GameObject obj, Dictionary<Int32, Material[]> materialList)
{
UnityComponentList<Renderer>.Begin(obj);
SelectShareMaterial(UnityComponentList<Renderer>.List, materialList);
UnityComponentList<Renderer>.End();
}
public static void SelectShareMaterial(List<Renderer> rendererList, Dictionary<Int32, Material[]> materialList)
{
for (int iter = 0; iter < rendererList.Count; ++iter)
{
SelectShareMaterial(rendererList[iter], materialList);
}
}
public static void SelectShareMaterial(Renderer renderer, Dictionary<Int32, Material[]> materialList)
{
materialList[renderer.GetInstanceID()] = renderer.sharedMaterials;
}
public static void RevertShareMaterial(GameObject obj, Dictionary<Int32, Material[]> materialList)
{
UnityComponentList<Renderer>.Begin(obj);
RevertShareMaterial(UnityComponentList<Renderer>.List, materialList);
UnityComponentList<Renderer>.End();
}
public static void RevertShareMaterial(List<Renderer> rendererList, Dictionary<Int32, Material[]> materialList)
{
for (int iter = 0; iter < rendererList.Count; ++iter)
{
RevertShareMaterial(rendererList[iter], materialList);
}
}
public static void RevertShareMaterial(Renderer renderer, Dictionary<Int32, Material[]> materialList)
{
Material[] materials;
if (materialList.TryGetValue(renderer.GetInstanceID(), out materials))
{
renderer.materials = materials;
}
}
private static Vector3 Pick(Vector3 pos, float radius, Vector3 direction, float distance, int layerMask, int reserveCount)
{
RaycastHit hitResult;
if (Physics.SphereCast(pos, radius, direction, out hitResult, distance, layerMask))
{
float newDistance = Math.Max(hitResult.distance - 0.01f, 0.0f);
Vector3 newPos = pos + direction * newDistance;
//
if (reserveCount > 1)
{
float cutedDistance = distance - newDistance;
Vector3 cutedValue = direction * cutedDistance;
Vector3 normal = -hitResult.normal;
Vector3 normalValue = Vector3.Dot(cutedValue, normal) * normal;
Vector3 slideValue = cutedValue - normalValue;
Vector3 slideDir = slideValue.normalized;
float slideDistance = slideValue.magnitude;
return Pick(newPos, radius, slideDir, slideDistance, layerMask, reserveCount - 1);
}
else
{
return newPos;
}
}
else
{
return pos + direction * distance;
}
}
public static Vector3 ViewportCenterPos = new Vector3(0.5f, 0.5f, 0.0f);
public static Vector3 WorldToViewportPoint(Camera camera, Vector3 worldPos, float frontDistance)
{
Ray ray = camera.ViewportPointToRay(ViewportCenterPos);
Vector3 diff = worldPos - ray.origin;
diff -= Vector3.Dot(diff, ray.direction) * ray.direction;
worldPos = ray.origin + diff + frontDistance * ray.direction;
return camera.WorldToViewportPoint(worldPos);
}
public static Vector3 ViewportRoundPoint(Vector3 viewPortPos)
{
Vector3 viewPortDiff = viewPortPos - ViewportCenterPos;
viewPortDiff /= (2.0f * ViMathDefine.Max(ViMathDefine.Abs(viewPortDiff.x), ViMathDefine.Abs(viewPortDiff.y)));
return ViewportCenterPos + viewPortDiff;
}
public static bool WorldPointInViewport(Camera camera, Vector3 worldPos)
{
Vector3 viewPos = camera.WorldToViewportPoint(worldPos);
if (0.0f < viewPos.x && viewPos.x < 1.0f && 0.0f < viewPos.y && viewPos.y < 1.0f)
{
return true;
}
else
{
return false;
}
}
//
public static string GetDeviceId()
{
const string key = "device_id";
if (PlayerPrefs.HasKey(key))
{
return PlayerPrefs.GetString(key);
}
string newId = System.Guid.NewGuid().ToString();
PlayerPrefs.SetString(key, newId);
PlayerPrefs.Save();
return newId;
}
}