unity 小笔记

这篇博客汇总了Unity开发中的多个实用技巧,包括滑动列表的自动扩充排列、通过transform.Find寻找子物体、字符串转义字符处理、自定义Editor菜单、UI交互、协程的使用与停止、碰撞体检测等,是Unity开发者不可多得的参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.滑动列表,竖排内容,自动扩充排列。
在Scroll View 下找到 Content ,为其添加组件
Vertical Layout GroupContent Size Fitter
(横向列表同理)

2.在特定物体下寻找已知名字的子物体。
transform.Find(“name”);
其中transform属于特定物体。

3.使用下面的语句从数据库中读出的字符串格式进行转换,使Unity能够正确处理转义字符。
content = System.Text.RegularExpressions.Regex.Unescape(param);

4.拖动鼠标水平移动视角
注:该脚本一定要放在UI或者collider上

Camera m_camera;
Vector3 lastPos;
Vector3 offset;
void OnMouseDown()
{
    lastPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);   
}
void OnMouseDrag()
{
    offset = lastPos - Camera.main.ScreenToWorldPoint(Input.mousePosition);
    m_camera.transform.position += offset;
}

5.自建Eidtor菜单,根目录建立“Editor”文件夹,创建脚本如下

using UnityEditor;
public class MyMenu : MonoBehaviour
{
    [MenuItem("MyMenu/Function")]
    static void Function()
    {

    }
}

6.编辑模式下运行脚本函数

[ContextMenu("Function")]
    static void Function()
    {

    }

7.unity2019.3以上的版本,打开后发现Console报空错误,此时需要更新.Net到4.8,才能继续正常使用

8.只有把StartCoroutine赋予变量,才能用StopCoroutine(string CoroutineName)准确停用该协程。

public Coroutine coroutine;
coroutine = StartCoroutine(CoroutineName());
StopCoroutine(coroutine);

9.Inspector界面常用编辑方法

[Header("显示类型名称")]

10.无法buildi安卓包?
在unity unity 2018.3.1中,选中“使用旧版SDK工具”(Publishing Settings >> Use legacy SDK tools)。

11.得到范围内的碰撞体
Physics2D.Overlap....

12.改变角度,朝向目标(2D)

            Vector3 v_rela = Target.transform.position - transform.position;           
            float angle = Vector3.Angle(Vector3.right, v_rela);
            Vector3 normal = Vector3.Cross(Vector3.right, v_rela);
            angle *= Mathf.Sign(Vector3.Dot(normal, Vector3.forward));
            transform.eulerAngles = new Vector3(0, 0, angle);

13.transform.eulerAngles.z 有180,-180会自动变成180。

14.给UI添加Canvas组件,可以调整其渲染优先级,如果要实现拖动UI等功能,还需添加Graphic Raycaster组件。

15.判断字符串为空格的
(1)str==" ";
如果字符串为一个空格就返回true;它只能判断为一个空格的情况下,所以不太常用,也不太好用。
(2)string.IsNullOrWhiteSpace( str );
如果字符串为一个或者多个空格还有空null的情况下都会返回true;它不仅能判断为一个空格,多个空格的情况也是适用的。一般用的就是这个。

16 Text.preferredHeight 可获得Text的适应高度

17.Text空格自动换行的问题
public static readonly string no_breaking_space = “\u00A0”;
text.text = text.text.Replace(" ", no_breaking_space);

18.Scrollbar.value 的值
等于 scrollview头部未显示的部分 除以 scrollview所有未显示的部分。

19.使用和停止协程
IEnumerator coroutine = Test();
StartCoroutine(coroutine );
StopCoroutine(coroutine);

IEnumerator Test() {}

18.获取子物体

        for (int i = 0; i < transform.childCount; i++)
        {
            Debug.Log(transform.GetChild(i).name);
        }

19.鼠标获取UI

using UnityEngine.EventSystems;
       public GameObject GetOverUI(GameObject canvas)
       {
           PointerEventData pointerEventData = new PointerEventData(EventSystem.current);
           pointerEventData.position = Input.mousePosition;
           GraphicRaycaster gr = canvas.GetComponent<GraphicRaycaster>();
           List<RaycastResult> results = new List<RaycastResult>();
           gr.Raycast(pointerEventData, results);
           if (results.Count != 0)
           {
               return results[0].gameObject;
           }
           return null;
       }

20.鼠标点击获取2d碰撞体

        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit2D[] hits = Physics2D.RaycastAll(new Vector2(ray.origin.x, ray.origin.y), Vector2.zero);
            for (int i = 0; i < hits.Length; i++)
            {
                if (hits[i].collider)
                {
                    Debug.Log(hits[i].collider);
                }
            }

21.检测是否点击到UI

using UnityEngine.EventSystems;
    public bool IsClickDownOverUI()
    {
        if (EventSystem.current.IsPointerOverGameObject())
        {
            return true;
        }
        return false;
    }

22.unity3d编辑器模式下运行
添加代码:[ExecuteInEditMode]
转自:unity3d编辑器模式下运行

using UnityEngine;
[ExecuteInEditMode]
public class MyEditorScript : MonoBehaviour
{
}

23. Inspector 中的值被修改时调用方法

void OnValidate() 
{
	Debug.Log("OnValidate");
}

24. 获取Text内容长度

    private float CalcTextWidth(Text text)
    {
        TextGenerator tg = text.cachedTextGeneratorForLayout;
        TextGenerationSettings setting = text.GetGenerationSettings(Vector2.zero);
        float width = tg.GetPreferredWidth(text.text, setting) / text.pixelsPerUnit;
        return width;
    }

25.scroll view中,可通过调整Viewport的Pivot来调整滑动条特定的位置。
26.Unity的UI阻挡点击检测

using UnityEngine.EventSystems;
using UnityEngine.UI;

    public GraphicRaycaster The_Caster;
    public bool Check_Click_On_Window()
    {       
        PointerEventData ped = new PointerEventData(EventSystem.current);
        ped.position = Input.mousePosition;

        List<RaycastResult> results = new List<RaycastResult>();
        The_Caster.Raycast(ped, results);

        if (results.Count > 0)
            for (int i = 0; i < results.Count; i++)
            {
                if (results[i].gameObject.layer == 8)  //** 8为要检测的UI的Layer id
                {
                    return true;
                }                   
            }
        return false;
    }

26.卸载未占用的asset资源
Resources.UnloadUnusedAssets();
System.GC.Collect();
21.使用 VerticalLayoutGroup 时,注意对齐anchor,以免改变子物体大小时,发生错位
22.创建Texture2D时,mipChain选false可以避免边缘模糊

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值