当前位置: 首页 > news >正文

点击unity资源文件自动展开左侧的文件路径

背景:

最近从cocos那边转过来的unity同事总是吐糟我们unity选中一个资源后都无法清晰的看到他的文件路径,这给他的工作带来了很多的烦恼,于是我想到昨天刚看到一个unity编辑器下的简易协程实现,通过2个接口Selection.activeObject = selectedObject; EditorGUIUtility.PingObject(selectedObject); 可以实现选中一个目标资源并且跳转到该资源,于是我们可以先选中文件的文件夹,然后协程等待一帧然后选中并跳转到选中文件。这样就实现了2边都展开的问题了。所以有时候有个同事问你问题真的是非常好,往往他们能让你产生很多有趣的想法。
               

运行结果:

1.之前的结果:

2.打开开关后运行结果 可以看到整个左侧的文件路径都暂开了,这样对于ui工作很频繁的同学

就很友好拉,可以节省一点点时间。

前置知识:

unity编辑器下的简易协程EditorCoroutine.cs 下方有代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System;

public class EditorCoroutine
{
    readonly EditorYieldInstruction mRoutine;

    public EditorCoroutine(EditorYieldInstruction pRoutine)
    {
        mRoutine = pRoutine;
    }

    static public EditorCoroutine StartCoroutine(EditorYieldInstruction pRoutine)
    {
        var tRoutine = new EditorCoroutine(pRoutine);
        tRoutine.Start();
        return tRoutine;
    }

    static public void StopCoroutine(EditorCoroutine pCoroutine)
    {
        if (pCoroutine != null) pCoroutine.Stop();
    }

    void Start()
    {
        EditorApplication.update -= Update;
        EditorApplication.update += Update;
    }

    void Stop()
    {
        EditorApplication.update -= Update;
    }

    void Update()
    {
        if (mRoutine != null && !mRoutine.MoveNext())
        {
            Stop();
        }
    }
}

public abstract class EditorYieldInstruction : IEnumerator
{
    public abstract object Current { get; }

    public abstract bool MoveNext();

    public abstract void Reset();
}

public class EditorWaitForSeconds : EditorYieldInstruction
{
    readonly long mTicks;
    readonly float mSeconds;
    readonly Action mCallBack;

    public EditorWaitForSeconds(float pSeconds, Action pCallBack)
    {
        mSeconds = pSeconds;
        mCallBack = pCallBack;
        mTicks = DateTime.Now.AddSeconds(pSeconds).Ticks;
    }

    public override object Current { get { return null; } }

    public override bool MoveNext()
    {
        if (DateTime.Now.Ticks >= mTicks)
        {
            if (mCallBack != null) mCallBack();
            return false;
        }
        return true;
    }

    public override void Reset()
    {
    }
}

高亮接口:


using UnityEditor;
using UnityEngine;

[InitializeOnLoad]

public class SelectionTools
{
    static SelectionTools()
    {
        // 监听 Selection 变化事件
        Selection.selectionChanged += OnSelectionChanged;
    }

    private static void OnSelectionChanged()
    {

 // 开关 如果你不想使用这个功能应该可以关闭 
        if (!EditorPrefs.GetBool("SelectionTools", true))
        {
            return;
        }

        // 获取当前选中的资源
        var selectedObject = Selection.activeObject;
        if (selectedObject == null)
            return;

        // 获取资源的路径
        string path = AssetDatabase.GetAssetPath(selectedObject);
        //目录不要这种操作
        if (string.IsNullOrEmpty(path) || System.IO.Directory.Exists(path))
            return;

        // 获取资源所在的目录
        string folderPath = System.IO.Path.GetDirectoryName(path);
        var folder = AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(folderPath);
        if (folder != null)
        {
            // 将焦点切换到 Project 窗口
            //EditorUtility.FocusProjectWindow();
            Selection.activeObject = folder;
            EditorGUIUtility.PingObject(folder);
            //unity编辑下模拟协程 
            EditorCoroutine.StartCoroutine(new EditorWaitForSeconds(0.00001f, () =>
            {
                Selection.activeObject = selectedObject;
                EditorGUIUtility.PingObject(selectedObject);
            }));
            // Ping 目录(高亮显示但不会选中它)

        }
    }
}
 

相关文章:

  • StableDiffusion学习笔记——4、模型下载和学习
  • 算法系列之搜索算法-广度优先搜索BFS
  • 提示工程(Prompt Engineering)的进阶策略与实践指南
  • 关于uniApp的面试题及其答案解析
  • 【Python】yield函数
  • 遥感与GIS在滑坡、泥石流风险普查中的实践技术应用
  • 【Linux AnolisOS】配置Linux固定ip地址。然后在Windows上连接使用linux中docker容器里的redis和nacos。
  • acm培训 part 7
  • 写轮眼按钮特效:打造炫酷网页按钮
  • 【期末复习】微信小程序复习大纲
  • React useState 和 useEffect 使用坑点注意总结
  • Flutter开发如何高效布局
  • ToDesk云电脑、顺网云、网易云、易腾云、极云普惠云横测对比:探寻电竞最佳拍档
  • vite调试node_modules下面插件
  • Sklearn常用算法及建模流程总结
  • JetBrains 2024开发者生态报告 -你尝试过用VR头戴设备编程吗
  • 什么是Dubbo?Dubbo框架知识点,面试题总结
  • spring微服务+dubbo框架,某一服务启动时提示多个bean存在
  • springboot使用webSocket
  • 网络通信-最大传输单元-MTU,网络安全零基础入门到精通实战教程!
  • 上海与世界|黄菊与上海建设中国式全球城市
  • 今年4月上海一二手房成交面积同比增21%,二手房成交2.07万套
  • 解放日报:让算力像“水电煤”赋能千行百业
  • 全国人大常委会关于授权国务院在中国(新疆)自由贸易试验区暂时调整适用《中华人民共和国种子法》有关规定的决定
  • 两部门预拨4000万元支持山西、广西、陕西做好抗旱救灾工作
  • 人物|德国新外长关键词:总理忠实盟友、外交防务专家、大西洋主义者