Unity不常用技巧

4 篇文章 0 订阅

本文地址: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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值