找回密码
 立即注册
查看: 295|回复: 0

[简易教程] Unity拖拽的默认不是image控件,还有重设size

[复制链接]
发表于 2021-10-14 16:51 | 显示全部楼层 |阅读模式
写在前面
  • 拼UI时会用到多个Image,一般操作是:①新建一个Image,②拖入Image用到的图片,③SetNativeSize,④关闭不必要的raycastTarget 。为了能尽快拼完UI,我写了个工具替我完成以上①②③④步。因为原先Unity就有拖动图片到对象上自动生成对应Sprite的操作,这个工具覆盖了这个操作,现在拖动图片会生成对应Image,自动SetNativeSize,自动关闭raycastTarget
  • 本工具脚本名为CreateImage.cs,不一定要放在Editor文件夹下。
完整代码
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEditor;
  5. using UnityEngine;
  6. using UnityEngine.UI;
  7. using Object = UnityEngine.Object;

  8. /// <summary>
  9. /// 从Project窗口拖动图片到Canvas下任意层级,自动生成对应Image
  10. /// 会覆盖原生成Sprite操作
  11. /// </summary>
  12. public class CreateImage
  13. {
  14.     /// <summary>
  15.     /// 总开关
  16.     /// </summary>
  17.     public static bool Switch = true;

  18.     private static bool isTrigger = false;

  19.     [InitializeOnLoadMethod]
  20.     private static void Init()
  21.     {
  22.         if (!Switch)
  23.         {
  24.             return;
  25.         }
  26.         EditorApplication.projectWindowItemOnGUI += ProjectWindowItemOnGui;
  27.         EditorApplication.hierarchyWindowChanged += HierarchyWindowChanged;

  28.     }

  29.     private static void ProjectWindowItemOnGui(string guid, Rect selectionRect)
  30.     {
  31.         if (!Switch)
  32.         {
  33.             return;
  34.         }
  35.         // 拖动图片出Project窗口时
  36.         if (Event.current.type == EventType.DragPerform || Event.current.type == EventType.DragUpdated || Event.current.type == EventType.DragExited)
  37.         {
  38.             isTrigger = true;
  39.         }
  40.       
  41.     }

  42.     private static void HierarchyWindowChanged()
  43.     {
  44.         if (!Switch)
  45.         {
  46.             return;
  47.         }
  48.         if (!isTrigger)
  49.         {
  50.             return;
  51.         }
  52.         // 此时Unity会默认创建Sprite并定位到该GameObject上
  53.         GameObject go = Selection.activeGameObject;        if (go == null)        {            return;        }
  54.         SpriteRenderer spriteRenderer = go.GetComponent<SpriteRenderer>();
  55.         if (spriteRenderer == null)
  56.         {
  57.             return;
  58.         }
  59.         go.name = "Image";
  60.         RectTransform rt = go.AddComponent<RectTransform>();
  61.         rt.localPosition = Vector3.zero;
  62.         rt.localScale = Vector3.one;
  63.         Image image = go.AddComponent<Image>();
  64.         image.raycastTarget = false;
  65.         image.sprite = spriteRenderer.sprite;
  66.         Object.DestroyImmediate(spriteRenderer);
  67.         image.SetNativeSize();

  68.         isTrigger = false;

  69.     }


  70. }
复制代码


懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-4 10:19 , Processed in 0.120136 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表