找回密码
 注册帐号

扫一扫,访问微社区

志远 【UGUI】组件创建时添加指定脚本

10
回复
1330
查看
[ 复制链接 ]
排名
9398
昨日变化

12

主题

211

帖子

1006

积分

Rank: 9Rank: 9Rank: 9

UID
21402
好友
16
蛮牛币
29
威望
0
注册时间
2014-4-14
在线时间
502 小时
最后登录
2019-7-22

认证开发者

2019-3-1 12:06:21 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
#0x001 需求
当UGUI的某些组件 如:Text Button 创建的时候,自动为该组件添加指定的脚本。

#0x002 分析
可否直接为Text组件编写编辑器扩展脚本。
引用momo大神文章地址:[研究院编辑器之不影响原有布局拓展Inspector](https://www.xuanyusong.com/archives/3931)
经过测试这在UGUI的某些组件中不生效,原因未知。
解决办法:我们可以为 RectTransform 编写编辑器扩展,因为只要是UGUI组件肯定会有 RectTransform 的。

#0x003 实现步骤
#####1.  实现编辑器脚本 AutoAddScript.cs
第一想到的是我能不能直接集成RectTransformEditor  ----- 答案是不能的(访问级别问题)。
其次想到可不可以直接集成Editor ----- 答案是可以,但是会破坏原有的Inspector样式。
那么结合上文分析我给出最佳实现方案,套用momo大神文章在不影响原有布局的前提下。
-首先我们要去文章处把DecoratorEditor这个类copy回来。
-然后新建一个AutoAddScript类继承自DecoratorEditor
-实现空构造函数并且base("RectTransformEditor")
-书写OnEnable方法 在方法内部实现我们的监控
[C#] 纯文本查看 复制代码
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(RectTransform))]
public class AutoAddScript : DecoratorEditor
{
    public AutoAddScript() : base("RectTransformEditor") { }
    public void OnEnable()
    {
        //这里的target 是在Editor中的变量 也就是当前对象 要里式转换一下
        Debug.Log(target as RectTransform);     
    }
}

我们把这个代码连同DecoratorEditor.cs一起放到Editor目录下,然后我们创建几个UI测试一下输出。
11.gif

#####2.  实现自动添加脚本
- 我们随便编写一个继承于MonoBehaviour的脚本,我暂且命名为Test
- 在AutoAddScript 编辑器扩展中的OnEnable方法里判断是添加了什么UI
- 如果是我们想要的UI组件,那么就添加Test脚本

- 如果已经有了脚本就不要再次添加了
[C#] 纯文本查看 复制代码
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;

[CustomEditor(typeof(RectTransform))]
public class AutoAddScript : DecoratorEditor
{
    public AutoAddScript() : base("RectTransformEditor") { }
    public void OnEnable()
    {
        //这里的target 是在Editor中的变量 也就是当前对象 要里式转换一下
        RectTransform rectTransform = target as RectTransform;
        //这里要引用UnityEngine.UI
        Text text = rectTransform.GetComponent<Text>();
        if (text!=null && rectTransform.GetComponent<Test>()==null)
        {
            rectTransform.gameObject.AddComponent<Test>();
        }
    }
}


22.gif

#####3.  实现当Text被移除的时候Test也要被移除
- 因为我们是用的OnEnable生命周期,他在编译器中的话每次状态改变都会调用一下
- 所以移除Text的时候也会调用一次,那么我们可以直接在里面编写
- 判断当前Text是否存在,不存在的话也要移除Test
- 注意这里的移除组件必须为立即移除 也就是说Object.Destroy在这里是不能用的

- 因为Object.Destroy是下一帧移除,我们可以用Object.DestroyImmediate这个方法立即移除组件
[C#] 纯文本查看 复制代码
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;

[CustomEditor(typeof(RectTransform))]
public class AutoAddScript : DecoratorEditor
{
    public AutoAddScript() : base("RectTransformEditor") { }
    public void OnEnable()
    {
        //这里的target 是在Editor中的变量 也就是当前对象 要里式转换一下
        RectTransform rectTransform = target as RectTransform;
        //这里要引用UnityEngine.UI
        Text text = rectTransform.GetComponent<Text>();
        Test test = rectTransform.GetComponent<Test>();
        if (text!=null && test == null)
        {
            rectTransform.gameObject.AddComponent<Test>();
        }else if (text == null && test != null)
        {
            //注意这里必须是立即移除
            Object.DestroyImmediate(test);
        }

    }
}




#0x004 实现效果
33.gif


#0x005 后记
那么你要问了,这个可以拿来做什么 我能想到的就是框架的约束了,防止少挂在脚本,做全自动本地化相关等。

回复

使用道具 举报

2初来乍到
117/150
排名
16219
昨日变化

0

主题

26

帖子

117

积分

Rank: 2Rank: 2

UID
207231
好友
1
蛮牛币
7490
威望
0
注册时间
2017-2-18
在线时间
47 小时
最后登录
2019-6-5
2019-3-1 14:06:43 显示全部楼层
谢谢大佬的详细教学;辛苦了
回复 支持 反对

使用道具 举报

2初来乍到
146/150
排名
22153
昨日变化

0

主题

86

帖子

146

积分

Rank: 2Rank: 2

UID
252110
好友
0
蛮牛币
204
威望
0
注册时间
2017-11-2
在线时间
38 小时
最后登录
2019-7-10
2019-3-1 20:56:59 显示全部楼层
{:106:}{:106:}
回复

使用道具 举报

6蛮牛粉丝
1125/1500
排名
2066
昨日变化

0

主题

241

帖子

1125

积分

Rank: 6Rank: 6Rank: 6

UID
26073
好友
1
蛮牛币
4277
威望
0
注册时间
2014-5-21
在线时间
216 小时
最后登录
2019-7-22
2019-3-2 08:39:01 显示全部楼层
这教程质量高,给赞一个!
回复 支持 反对

使用道具 举报

7日久生情
1535/5000
排名
3443
昨日变化

0

主题

895

帖子

1535

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
210390
好友
0
蛮牛币
1835
威望
0
注册时间
2017-3-7
在线时间
206 小时
最后登录
2019-5-23
2019-3-2 09:14:08 显示全部楼层
回复

使用道具 举报

5熟悉之中
922/1000
排名
2966
昨日变化

0

主题

194

帖子

922

积分

Rank: 5Rank: 5

UID
264326
好友
0
蛮牛币
9815
威望
0
注册时间
2018-1-14
在线时间
230 小时
最后登录
2019-7-19
2019-3-2 09:48:55 显示全部楼层
回复

使用道具 举报

7日久生情
3699/5000
排名
2980
昨日变化

26

主题

2239

帖子

3699

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
173503
好友
3
蛮牛币
1055
威望
0
注册时间
2016-10-5
在线时间
938 小时
最后登录
2019-7-21
2019-3-3 08:06:37 显示全部楼层
我能想到的就是框架的约束了,防止少挂在脚本,做全自动本地化相关等
回复 支持 反对

使用道具 举报

5熟悉之中
968/1000
排名
10817
昨日变化

3

主题

709

帖子

968

积分

Rank: 5Rank: 5

UID
310426
好友
0
蛮牛币
1208
威望
0
注册时间
2019-1-2
在线时间
160 小时
最后登录
2019-7-22
2019-3-5 08:52:42 显示全部楼层
{:104:}
回复

使用道具 举报

8常驻蛮牛
5439/10000
排名
1669
昨日变化

0

主题

3887

帖子

5439

积分

Rank: 8Rank: 8

UID
185339
好友
1
蛮牛币
3562
威望
0
注册时间
2016-11-20
在线时间
774 小时
最后登录
2019-7-22
2019-3-5 09:05:45 显示全部楼层
{:92:}
回复

使用道具 举报

4四处流浪
413/500
排名
6340
昨日变化

0

主题

46

帖子

413

积分

Rank: 4

UID
246638
好友
0
蛮牛币
274
威望
0
注册时间
2017-9-28
在线时间
153 小时
最后登录
2019-6-28
2019-3-12 14:27:35 显示全部楼层
{:106:}{:106:}{:106:}{:106:}
回复 支持 反对

使用道具 举报

5熟悉之中
820/1000
排名
4310
昨日变化

10

主题

254

帖子

820

积分

Rank: 5Rank: 5

UID
164720
好友
0
蛮牛币
4403
威望
0
注册时间
2016-11-17
在线时间
224 小时
最后登录
2019-7-22
QQ
2019-4-25 14:09:19 显示全部楼层
谢谢大佬的详细教学;辛苦了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则