找回密码
 注册帐号

扫一扫,访问微社区

Y-miku 一键删除场景中的空引用

2
回复
908
查看
[ 复制链接 ]
排名
510
昨日变化

46

主题

385

帖子

5180

积分

Rank: 9Rank: 9Rank: 9

UID
26484
好友
17
蛮牛币
12894
威望
0
注册时间
2014-5-24
在线时间
2780 小时
最后登录
2019-3-23

游戏蛮牛QQ群会员VIP

QQ
2018-7-7 23:04:06 显示全部楼层 阅读模式

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

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

x
在项目中,有时会把不用的脚本删除,但是这样就会导致原有挂载此脚本的物体上有空引用,每次进场景都会有警告。
如果项目小,可以自己手动删,但项目大的话可能会删几千次,很麻烦

解决办法是先将gameobject转为SerializedObject
找到空组件的index后根据index去删除SerializedObject中对应的component
[AppleScript] 纯文本查看 复制代码
Transform[] s = prefab.GetComponentsInChildren<Transform>(true);
        for (int i = 0; i < s.Length; i++)
        {
            var components = s[i].gameObject.GetComponents<Component>();
            var serializedObject = new SerializedObject(s[i].gameObject);
            var prop = serializedObject.FindProperty("m_Component");
            int r = 0;
            for (int j = 0; j < components.Length; j++)
            {
                if (components[j] == null)
                {
                    prop.DeleteArrayElementAtIndex(j - r);
                    r++;
                }
            }
            serializedObject.ApplyModifiedProperties();
        }



但是有一个问题,删除之后切换场景时unity会崩溃
可能是由于其他地方也有gameobj的SerializedObject形式
如果我们在自己的SerializedObject上删除组件并实施到gamobj上,会导致其他地方的SerializedObject丢失对gameobj上组件的引用,造成野指针
解决方法是:
先将物体作为一个Prefab,之后修改prefab,最后再实例化出来,就不会崩溃了
[AppleScript] 纯文本查看 复制代码
GameObject prefab = PrefabUtility.CreatePrefab("Assets" + "/"+prefabName+".prefab", Root);


回复

使用道具 举报

5熟悉之中
876/1000
排名
2503
昨日变化

0

主题

66

帖子

876

积分

Rank: 5Rank: 5

UID
231194
好友
0
蛮牛币
2843
威望
0
注册时间
2017-7-10
在线时间
226 小时
最后登录
2019-3-12
2018-7-17 09:55:30 显示全部楼层
把预制体拖至场景内,空引用还是存在,而且先前场景物体的空应用莫名恢复了
回复 支持 反对

使用道具 举报

5熟悉之中
851/1000
排名
5083
昨日变化

4

主题

323

帖子

851

积分

Rank: 5Rank: 5

UID
191995
好友
1
蛮牛币
1691
威望
0
注册时间
2016-12-13
在线时间
230 小时
最后登录
2019-3-21
2018-8-2 10:39:02 显示全部楼层
试试看下效果
回复

使用道具 举报

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

本版积分规则