本文地址:https://blog.csdn.net/t163361/article/details/105235951
有时候一些常用技巧想不起来,但是用百度去搜怎么也搜不到~写个blog记录吧
官方的API调用对话框
EditorUtility.DisplayDialog()
打开某个文件夹
Application.OpenURL("file:///" + Application.dataPath);
设置物体在Hierarchy里面的状态,
GameObject go = (GameObject)obj;
if (isLocked)
{
go.hideFlags |= HideFlags.NotEditable;
}
else
{
go.hideFlags &= ~HideFlags.NotEditable;
}
获取AnimationClip的Curve
[MenuItem("Tools/Convert")]
static public void Convert()
{
var obj = Selection.activeObject;
if (obj.GetType() != typeof(AnimationClip))
return;
var clip = obj as AnimationClip;
if (clip != null)
{
foreach (var binding in AnimationUtility.GetCurveBindings(clip))
{
AnimationCurve curve = AnimationUtility.GetEditorCurve(clip, binding);
Debug.Log(binding.path + "/" + binding.propertyName + ", Keys: " + curve.keys.Length);
for (int i = 0; i < curve.length; i++)
{
Debug.Log("Keys" + i + ":" + curve[i].value);
}
}
}
Debug.Log(obj);
}
调整后台加载线程优先级
Application.backgroundLoadingPriority = ThreadPriority.High;
约束组件
约束组件将游戏对象的位置、旋转或缩放与另一个游戏对象关联。受约束的游戏对象像关联到的游戏对象一样移动、旋转或缩放。
烘焙Mesh 使用Physics.BakeMesh() 优化Mesh.Bake.PhysX.CollisionData问题 Unity 2019.3版本添加
using UnityEngine;
public class MinimalTest : MonoBehaviour
{
public Mesh mesh;
private MeshCollider collider;
private void OnEnable()
{
// Bake this Mesh to use later.
Physics.BakeMesh(mesh.GetInstanceID(), false);
}
public void FixedUpdate()
{
// If the collider wasn't yet created - create it now.
if (collider == null)
{
// No mesh baking will happen here because the mesh was pre-baked, making instantiation faster.
collider = new GameObject().AddComponent<MeshCollider>();
collider.sharedMesh = mesh;
}
}
}
如何获取使用正交相机拍摄物体的屏幕坐标
var pos = 物体.position - topCameras.transform.position;
pos = pos * (Screen.currentResolution.height / (topCameras.orthographicSize * 2));
这样获得的pos的X,Z可以理解为对应的屏幕坐标位置
加载Unity标准模型
public static GameObject CreatePrimitive(PrimitiveType type)
{
var go = CreateGameObject(type.ToString(), typeof(MeshFilter), typeof(MeshRenderer));
go.SetActive(false);
switch (type)
{
case PrimitiveType.Sphere:
go.GetComponent<MeshFilter>().sharedMesh = Resources.GetBuiltinResource<Mesh>("New-Sphere.fbx");
AddComponent<SphereCollider>(go);
break;
case PrimitiveType.Capsule:
go.GetComponent<MeshFilter>().sharedMesh = Resources.GetBuiltinResource<Mesh>("New-Capsule.fbx");
AddComponent<CapsuleCollider>(go);
break;
case PrimitiveType.Cylinder:
go.GetComponent<MeshFilter>().sharedMesh = Resources.GetBuiltinResource<Mesh>("New-Cylinder.fbx");
AddComponent<CapsuleCollider>(go);
break;
case PrimitiveType.Cube:
go.GetComponent<MeshFilter>().sharedMesh = Resources.GetBuiltinResource<Mesh>("Cube.fbx");
AddComponent<BoxCollider>(go);
break;
case PrimitiveType.Plane:
go.GetComponent<MeshFilter>().sharedMesh = Resources.GetBuiltinResource<Mesh>("New-Plane.fbx");
AddComponent<MeshCollider>(go);
break;
case PrimitiveType.Quad:
go.GetComponent<MeshFilter>().sharedMesh = Resources.GetBuiltinResource<Mesh>("Quad.fbx");
AddComponent<MeshCollider>(go);
break;
}
var renderer = go.GetComponent<Renderer>();
renderer.material = Material.GetDefaultMaterial();
go.SetActive(true);
return go;
}
多屏幕判断鼠标是否在屏幕上
Display.RelativeMouseAt(new Vector3(mp.x, mp.y));
官方查看Assetbundle结构的工具 WebExtract 参考文档
编译相关的一些文件
gmcs
link
smcs.rsp
添加预编译选项
-define:UNITY_DEBUG
-unsafe
csc.rsp
忽略警告
-nowarn:0642
-nowarn:0414
判断鼠标是否点在物体上
EventSystem.current.IsPointerOverGameObject()
为true 点击在UI 为false 没有点在UI上.
不用反射访问编辑器内部方法
UnityEditor.dll中有一些友元程序集(使用了InternalsVisibleTo特性标记),那么我们就找一个不会用上的特殊程序集使用,来访问内部方法。
转载他人示例
Unity在非激活场景中创建物体
使用下面的接口设置,具体看这篇文章
GameObjectEditorSceneManager.SetTargetSceneForNewGameObjects()
Unity编辑器多语言文件
最新的Unity编辑器支持中文了,对应的文件在如下路径,文件后缀是.po,简体中文文件是zh-cn.po
Unity安装目录\Editor\Data\Localization
UGUI大小变化
RectTransform的大小改变时有一个回调函数:OnRectTransformDimensionsChange。当ContentSizeFitter来自动调整RectTransform的大小时并不能立马生效,而是需要到下一帧才能得到正确的大小,此时该回调便有用武之地了。然而该回调的触发确有点奇怪会被触发多次且有时触发的次数还不同,另一解决办法是在获取RectTransform的size时调用LayoutRebuilder.ForceRebuildLayoutImmediate(rectTransform);不过该接口要5.x版本才能用…
出处
UGUI判断鼠标所处于的UI控件
//判断当前点击的哪个UI
public GameObject IsPointerUIObj()
{
var point = Input.mousePosition;
PointerEventData eventData = new PointerEventData(EventSystem.current);
eventData.pressPosition = point;
eventData.position = point;
List<RaycastResult> list = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventData, list);
return list[0].gameObject;
}
NavMesh拿到寻路类型的信息
var defaultBuildSettings = NavMesh.GetSettingsByID(0);
C# 字符和转义字符转换
System.Text.RegularExpressions.Regex.Unescape(s)
System.Text.RegularExpressions.Regex.Escape(s)