游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

问答求助

关注:561

当前位置:游戏蛮牛 技术专区 问答求助

_____________________________________________________________________________________________________________
问答求助版块规则:

  1、问题尽量描述清楚
      2、代码要放在代码块里
      3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
      4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
      5、问题得到解决,请选择最佳答案。
      6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 446|回复: 9

[脚本] 为什么场景切换时保留的物体身上的脚本又重新执行了一次?

[复制链接]  [移动端链接]
3偶尔光临
251/300
排名
46538
昨日变化
92

16

主题

71

帖子

251

积分

Rank: 3Rank: 3Rank: 3

UID
182535
好友
0
蛮牛币
65
威望
0
注册时间
2016-11-10
在线时间
163 小时
最后登录
2018-9-27
发表于 2018-6-26 09:34:07 | 显示全部楼层 |阅读模式
5蛮牛币
场景切换后,部分物体保留,再切回来原有的场景时,我会做一个判断,就是场景中是否已经存在保留的物体了,有的话就销毁物体的生成,如此避免场景中又多出一组保留的物体。但这时会出现一个状况,就是保留的UI身上的脚本又被执行了一次,导致我的UI发生了不必要的变化。不知道要如何避免这种情况呢?
[发帖际遇]: mn小天 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

3偶尔光临
215/300
排名
11720
昨日变化
10

0

主题

69

帖子

215

积分

Rank: 3Rank: 3Rank: 3

UID
163693
好友
0
蛮牛币
382
威望
0
注册时间
2016-8-23
在线时间
65 小时
最后登录
2018-7-29
发表于 2018-6-26 09:34:08 | 显示全部楼层
因为你没有用代码做‘加载’这个事情
你把UI放在了场景中,每次加载这个场景,必然执行所有对象身上脚本的 Awake和Start
你可以把所有东西都通过代码加载,也就是,你的UI被实例化是代码控制的,而不是通过场景控制,这样你在DontDestory之后,再回到尝尽,只需要有一个变量判断是否是第一次进入,就可以不用再次实例化这个UI了。
上面这个是解决你问题的最快最简单办法

终极版,其实你应该这样做,涉及到一定框架
在你的第一个场景的前面再加一个场景,场景里只有一个对象,对象上有一个脚本。这个脚本就是所有程序的入口。所有东西都从这里衍生出来。比如,你在入口的Start中 创建游戏中需要的常驻UI 也就是从游戏开始到关闭都不会消失的UI。
因为这个场景应当只被加载一次,所以,这段代码只会执行一次,所以你根本都不需要考虑他会再次生成出来。你也可以把游戏里只整个生命周期里只需要执行一次的代码放在这里。

出现你说的问题,其实是你对数据的循环和代码理解不够,那个多余的UI对象其实就不应该再次被实例化出来,而不是出现了再删除他。从根源上消除它,很爽的哦

点评

我发现我用destroy销毁物体时物体并不会马上销毁,所以后面有些代码还是会被执行到。用了destroyimmediate就没问题了,但其实还是应该用你说的方法好  发表于 2018-6-26 21:30

回复

使用道具 举报

3偶尔光临
159/300
排名
12443
昨日变化
11

0

主题

34

帖子

159

积分

Rank: 3Rank: 3Rank: 3

UID
285839
好友
0
蛮牛币
320
威望
0
注册时间
2018-6-14
在线时间
57 小时
最后登录
2018-10-29
发表于 2018-6-26 10:26:18 | 显示全部楼层
GameObject. DontDestroyOnLoad了解一下。

回复

使用道具 举报

3偶尔光临
251/300
排名
46538
昨日变化
92

16

主题

71

帖子

251

积分

Rank: 3Rank: 3Rank: 3

UID
182535
好友
0
蛮牛币
65
威望
0
注册时间
2016-11-10
在线时间
163 小时
最后登录
2018-9-27
 楼主| 发表于 2018-6-26 10:43:05 | 显示全部楼层
zuoqifu 发表于 2018-6-26 10:26
GameObject. DontDestroyOnLoad了解一下。

我切换场景保留物体时就是用这个方法,现在的问题是切换场景时脚本里的start()函数又执行了一次。不知道要如何避免这个?

回复

使用道具 举报

7日久生情
2762/5000
排名
858
昨日变化

49

主题

726

帖子

2762

积分

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

UID
69941
好友
1
蛮牛币
7820
威望
0
注册时间
2015-1-20
在线时间
847 小时
最后登录
2018-11-15
发表于 2018-6-26 10:55:56 | 显示全部楼层
这个判断是放在哪里的呢?——"我会做一个判断,就是场景中是否已经存在保留的物体了,有的话就销毁物体的生成"
我觉得可以参考单例的实现方法,在对象的Awake/Start里面判断,if(instance==this)则执行本来要执行的内容,else{Destory(gameObject);}
这样如果是重复的对象,就销毁,否则才执行

回复

使用道具 举报

5熟悉之中
967/1000
排名
4049
昨日变化
33

5

主题

275

帖子

967

积分

Rank: 5Rank: 5

UID
234410
好友
2
蛮牛币
842
威望
0
注册时间
2017-7-26
在线时间
327 小时
最后登录
2018-11-15
发表于 2018-6-26 11:05:55 | 显示全部楼层
UI 框架中的 Push 操作改成实例化一个界面在Push
要不就 GameObject. DontDestroyOnLoad 直接不用

回复

使用道具 举报

5熟悉之中
573/1000
排名
4548
昨日变化
47

1

主题

42

帖子

573

积分

Rank: 5Rank: 5

UID
253196
好友
3
蛮牛币
1887
威望
0
注册时间
2017-11-8
在线时间
212 小时
最后登录
2018-11-15
发表于 2018-6-26 18:25:43 | 显示全部楼层
你可以把你想保留的物体做成预制体,然后添加GameObject. DontDestroyOnLoad,在第一个场景查找物体如果有的话就不生成,没有就生成一下。保留的物体最好在同一个物体下。
[发帖际遇]: jwh1108 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
626/1000
排名
6938
昨日变化
7

11

主题

241

帖子

626

积分

Rank: 5Rank: 5

UID
245178
好友
0
蛮牛币
886
威望
0
注册时间
2017-9-21
在线时间
192 小时
最后登录
2018-10-25
发表于 2018-7-2 13:47:58 | 显示全部楼层
新手路过 学习下 顺便灌个水!

回复

使用道具 举报

4四处流浪
378/500
排名
8689
昨日变化
8

0

主题

102

帖子

378

积分

Rank: 4

UID
10107
好友
3
蛮牛币
265
威望
0
注册时间
2013-12-11
在线时间
148 小时
最后登录
2018-10-17
QQ
发表于 2018-7-2 20:06:43 | 显示全部楼层
先弄个例子测试下,切换场景 ,Start函数会被重新调用吗?

回复

使用道具 举报

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

本版积分规则

关闭

站长推荐 上一条 /1 下一条

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