一些常用但是想不起来的功能方法

张开发
2026/4/21 4:12:20 15 分钟阅读

分享文章

一些常用但是想不起来的功能方法
相机跟随移动并注视public Transform followTarget; public Transform lookTarget; private void LateUpdate() { if (followTarget null || lookTarget null) { return; } transform.position Vector3.Lerp(transform.position, followTarget.position,Time.deltaTime * 5.0f); transform.LookAt(lookTarget,Vector3.up); } }followTarget是跟随移动的物体lookTarget是注视的物体跟随移动的速度可以改Lerp方法最后一个参数的大小LookAt方法的第二个参数是保证相机注视时Z轴子旋转的值始终为0从全部子物体中获取单一属性并返回队列//调用 GetChildComponectSpriteRenderer(transform, ref spriteList); void GetChildComponectT(Transform t, ref ListT list) { if (t.TryGetComponentT(out var type)) { list.Add(type); } if (t.childCount 0) { for (int i 0; i t.childCount; i) { GetChildComponectT(t.GetChild(i), ref list); } } }从全部子物体中获取组件对比transform.GetComponentInChildren()的优势在于可以同时获取隐藏的物体根据边框最大值对图片进行等比缩放Vector2 maxSize new Vector2(512.0f,512.0f); void SetMaxSize(RawImage showImage) { if (showImage.texture.width / maxSize.x showImage.texture.height / maxSize.y) { showImage.rectTransform.sizeDelta new Vector2(maxSize.x, showImage.texture.height / (showImage.texture.width / maxSize.x)); } else { showImage.rectTransform.sizeDelta new Vector2(showImage.texture.width / (showImage.texture.height / maxSize.y), maxSize.y); } }maxSize作为边框最大值可以修改对方法传入的图片进行等比缩放如果是Image的话就把showImage.texture替换成image.sprite对一个材质进行完全复制Material CopyMat(Material mainMat) { Material newMat new Material(mainMat); newMat.CopyPropertiesFromMaterial(mainMat); //或者另一种方法 //Material newMat new Material(); //newMat.shader mainMat.shader; //newMat.renderQueue mainMat.renderQueue; //newMat.CopyPropertiesFromMaterial(mainMat); return newMat }可以连位图法线图各个数值参数统一复制到另一个材质上然后返回判断两个模型的网格数据是否相同public bool GetSameMesh(GameObject form,GameObject target) { Vector3 pos Vector3.zero; Vector3 size Vector3.zero; GameObject[] glist Selection.gameObjects; GetMeshMaxSizeWorldValue(form, ref pos, ref size); Vector3[] formPosList form.transform.GetComponentMeshFilter().sharedMesh.vertices; for (int i 0; i formPosList.Length; i) { formPosList[i] - pos; } GetMeshMaxSizeWorldValue(target, ref pos, ref size); Vector3[] targetPosList target.transform.GetComponentMeshFilter().sharedMesh.vertices; for (int i 0; i targetPosList.Length; i) { targetPosList[i] - pos; } if (formPosList.Length ! targetPosList.Length) { return false; } for (int i 0 ;i formPosList.Length; i) { if(Vector3.Distance(formPosList[i], targetPosList[i]) 0.1f) { return false; } } return true; } public void GetMeshMaxSizeWorldValue(GameObject g, ref Vector3 pos, ref Vector3 size) { Bounds bounds new Bounds(); foreach (MeshFilter meshFile in g.transform.GetComponentsInChildrenMeshFilter()) { foreach (var item in meshFile.sharedMesh.vertices) { bounds new Bounds(meshFile.transform.TransformPoint(item), Vector3.zero); break; } } foreach (MeshFilter meshFile in g.transform.GetComponentsInChildrenMeshFilter()) { foreach (var item in meshFile.sharedMesh.vertices) { bounds.Encapsulate(meshFile.transform.TransformPoint(item)); } } Vector3 center bounds.center - g.transform.position; pos center; size bounds.size; }在GetSameMesh方法中传入带有MeshRender组件的两个模型方法会对比网格属性是否相同这个属于寻找相同模型比较靠谱的方式哪怕两个模型的Transform属性不一样名字不一样中心点不一样但是网格数据如果没有改变的话一定是一样的。判断两个模型的材质是否相同public bool GetSameMat(GameObject form, GameObject target) { Material[] formMatList form.GetComponentMeshRenderer().sharedMaterials; Material[] targetMatList target.GetComponentMeshRenderer().sharedMaterials; if (formMatList.Length ! targetMatList.Length) { return false; } for(int i 0; i formMatList.Length; i) { if (formMatList[i].name ! targetMatList[i].name) { return false; } if (formMatList[i].GetTexture(_MainTex) ! null formMatList[i].GetTexture(_MainTex) null) { return false; } if (formMatList[i].GetTexture(_MainTex) null formMatList[i].GetTexture(_MainTex) ! null) { return false; } if (formMatList[i].GetTexture(_MainTex) null formMatList[i].GetTexture(_MainTex) null) { continue; } if (formMatList[i].GetTexture(_MainTex).name ! targetMatList[i].GetTexture(_MainTex).name) { return false; } } return true; }先判断网格数据网格数据相同的情况下再判断材质是否相同只是判断了一下材质的数量名字位图名字是否对应判断准确度有限相对于计算更偏向于验算。从指定路径下筛选指定后缀名的文件并将路径全部返回//键名不带路径键值带路径 public static Dictionarystring, string GetAllFillPathAndLocalName(string path, string find, Dictionarystring, string getFile) { string[] allFile Directory.GetFiles(path); string[] allDir Directory.GetDirectories(path); foreach (string str in allFile) { if (str.ToLower().Contains(find.ToLower()) !str.Contains(.meta)) { string name str; name name.Replace(\\, /); path path.Replace(\\, /); name name.Replace(path /, ); name name.ToLower().Replace(find.ToLower(), ); getFile.Add(name, str); } } foreach (string str in allDir) { GetAllFillPathAndLocalName(str, find, getFile); } return getFile; }根据后缀名从指定路径下筛选全部对应类型的文件路径并返回第一个参数为想要寻找的根路径第二个参数为想要筛选的后缀名如“.png”最后传一个空元素字典在方法中使用。返回值为一个字典字典的Key为文件名没有路径和后缀名字典的Value为从盘符开始的完整的路径和文件名称以及文件的后缀名。UnityWebRequest通过Put指令向服务器发送数据IEnumerator PutNetValueCoroutine(string url, string putValue,Action action) { UnityWebRequest webRequest UnityWebRequest.Put(url, putValue); webRequest.SetRequestHeader(Content-Type, application/json); yield return webRequest.SendWebRequest(); action(); if (webRequest.result ! UnityWebRequest.Result.Success) { Debug.LogWarning(LinkNetValue向地址:\n url \n发送数据出现错误); yield break; } if (webRequest.downloadHandler.text.Contains(操作失败)) { Debug.LogWarning(LinkNetValue向地址:\n url \n发送\n putValue \n结果为:\n webRequest.downloadHandler.text); } else { Debug.Log(LinkNetValue向地址:\n url \n发送\n putValue \n结果为:\n webRequest.downloadHandler.text); } }在参数中传入发送的地址和发送的内容以及发送消息成功后的回调不需要回调的时候可以把参数三和执行回调的语句删掉不影响方法执行UnityWebRequest通过Post指令向服务器发送数据IEnumerator PostNetValueCoroutine(string url, string putValue, Action action) { UnityWebRequest webRequest UnityWebRequest.Post(url, putValue); webRequest.SetRequestHeader(Content-Type, application/json;charsetutf-8); byte[] bodyRaw Encoding.UTF8.GetBytes(putValue); webRequest.uploadHandler new UploadHandlerRaw(bodyRaw); yield return webRequest.SendWebRequest(); action(); if (webRequest.result ! UnityWebRequest.Result.Success) { Debug.Log(LinkNetValue向地址:\n url \n发送数据出现错误); yield break; } if (webRequest.downloadHandler.text.Contains(操作失败)) { Debug.Log(LinkNetValue向地址:\n url \n发送\n putValue \n结果为:\n webRequest.downloadHandler.text); } else { Debug.Log(LinkNetValue向地址:\n url \n发送\n putValue \n结果为:\n webRequest.downloadHandler.text); } }SetRequestHeader方法是用于在使用Post指令发送数据时由于数据格式问题会引发的错误在参数中传入发送的地址和发送的内容以及发送消息成功后的回调不需要回调的时候可以把参数三和执行回调的语句删掉不影响方法执行UnityWebRequest通过Get指令获取地址下的数据IEnumerator LoadNetValueCoroutine(string url,Actionstring action) { UnityWebRequest webRequest UnityWebRequest.Get(url); yield return webRequest.SendWebRequest(); if(webRequest.result ! UnityWebRequest.Result.Success) { Debug.Log(从 url 中读取数据出现错误); yield break; } string readText webRequest.downloadHandler.text; Debug.Log(LinkNetValue获取\n url \n中数据为:\n readText); action(readText); }在参数中传入获取的地址和处理数据信息的回调方法UnityWebRequest通过GetTexture指令获取地址下的图片IEnumerator DonwLoadTexture(string url, ActionTexture2D action) { UnityWebRequest webrequest UnityWebRequestTexture.GetTexture(url); yield return webrequest.SendWebRequest(); if (webrequest.result ! UnityWebRequest.Result.Success) { yield break; } action(DownloadHandlerTexture.GetContent(webrequest)); }在参数中传入获取的地址和处理图片的回调方法如果想获取Sprite精灵图的话可以稍微改一下把回调改成精灵版本IEnumerator DonwLoadSprite(string url, ActionSprite action) { UnityWebRequest webrequest UnityWebRequestTexture.GetTexture(url); yield return webrequest.SendWebRequest(); if (webrequest.result ! UnityWebRequest.Result.Success) { yield break; } Texture2D texture DownloadHandlerTexture.GetContent(webrequest); action(Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f))); }

更多文章