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

9
回复
813
查看
打印 上一主题 下一主题
[ 复制链接 ]
排名
9397
昨日变化

7

主题

190

帖子

891

积分

Rank: 9Rank: 9Rank: 9

UID
21402
好友
5
蛮牛币
106
威望
0
注册时间
2014-4-14
在线时间
413 小时
最后登录
2019-4-18

认证开发者

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

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

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测试一下输出。


#####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>();
        }
    }
}




#####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 实现效果



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

2初来乍到
113/150
排名
16217
昨日变化

0

主题

25

帖子

113

积分

Rank: 2Rank: 2

UID
207231
好友
1
蛮牛币
7471
威望
0
注册时间
2017-2-18
在线时间
44 小时
最后登录
2019-4-10
沙发
2019-3-1 14:06:43 只看该作者
谢谢大佬的详细教学;辛苦了
2初来乍到
143/150
排名
22151
昨日变化

0

主题

86

帖子

143

积分

Rank: 2Rank: 2

UID
252110
好友
0
蛮牛币
198
威望
0
注册时间
2017-11-2
在线时间
35 小时
最后登录
2019-3-8
板凳
2019-3-1 20:56:59 只看该作者
{:106:}{:106:}
6蛮牛粉丝
1010/1500
排名
2115
昨日变化

0

主题

199

帖子

1010

积分

Rank: 6Rank: 6Rank: 6

UID
26073
好友
1
蛮牛币
3837
威望
0
注册时间
2014-5-21
在线时间
155 小时
最后登录
2019-4-18
地板
2019-3-2 08:39:01 只看该作者
这教程质量高,给赞一个!
7日久生情
1527/5000
排名
3444
昨日变化

0

主题

888

帖子

1527

积分

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

UID
210390
好友
0
蛮牛币
1846
威望
0
注册时间
2017-3-7
在线时间
205 小时
最后登录
2019-4-16
5#
2019-3-2 09:14:08 只看该作者
5熟悉之中
894/1000
排名
2967
昨日变化

0

主题

188

帖子

894

积分

Rank: 5Rank: 5

UID
264326
好友
0
蛮牛币
9779
威望
0
注册时间
2018-1-14
在线时间
208 小时
最后登录
2019-4-18
6#
2019-3-2 09:48:55 只看该作者
7日久生情
3554/5000
排名
2981
昨日变化

23

主题

2166

帖子

3554

积分

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

UID
173503
好友
3
蛮牛币
902
威望
0
注册时间
2016-10-5
在线时间
869 小时
最后登录
2019-4-18
7#
2019-3-3 08:06:37 只看该作者
我能想到的就是框架的约束了,防止少挂在脚本,做全自动本地化相关等
5熟悉之中
571/1000
排名
10816
昨日变化

2

主题

382

帖子

571

积分

Rank: 5Rank: 5

UID
310426
好友
0
蛮牛币
447
威望
0
注册时间
2019-1-2
在线时间
91 小时
最后登录
2019-4-18
8#
2019-3-5 08:52:42 只看该作者
{:104:}
7日久生情
4885/5000
排名
1669
昨日变化

0

主题

3464

帖子

4885

积分

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

UID
185339
好友
1
蛮牛币
3542
威望
0
注册时间
2016-11-20
在线时间
643 小时
最后登录
2019-4-18
9#
2019-3-5 09:05:45 只看该作者
{:92:}
4四处流浪
399/500
排名
6339
昨日变化

0

主题

44

帖子

399

积分

Rank: 4

UID
246638
好友
0
蛮牛币
267
威望
0
注册时间
2017-9-28
在线时间
141 小时
最后登录
2019-4-17
10#
2019-3-12 14:27:35 只看该作者
{:106:}{:106:}{:106:}{:106:}
您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则