项目场景:
版本:unity2019
背包系统或者ui界面需要显示各种组件时将组件打包为预制体,使用Instantiate在游戏运行的时候实例化显示
问题描述
一开始还算正常但是当我把屏幕尺寸改变的时候发现生成的预制体大小不会自适应屏幕大小。下图是正常情况下的效果
但是改变界面大小之后问题就出现了:
显示的一塌糊涂,缩小之后显得大了,扩大之后显得小了。
检查了canvas的设置似乎没有太大问题
原因分析:
直觉告诉我这个可能是关于世界坐标系和屏幕坐标系的差异导致的(后来发现好象也不是这个原因),但是我又找不到哪里出了问题,搜索的时候甚至不知道怎么描述。
之后无意间看到一个帖子刚好描述的就是类似的问题,他说这种情况的原因就是
实例化物体后 又用到 SetParent 方法
我自己分析了一下(仅个人猜测没有查阅准确的资料,如果有说的不对的欢迎指正)预制体在设置的时候会有它自己的scale值,实例化的时候就会将预制体完整的复制下来,不改变任何参数,当实例化后再去设置它的父节点就会以当前的尺寸显示出来不受屏幕自适应的约束,而如果在实例化的时候直接设置它的父节点就能让它参与到屏幕的自适应中。
其实这种问题和GtidLayoutGroup
组件没有必然联系
解决方案:
之后解决起来就很简单了只需要将原来的实例化改过来就好了
这是原来的代码:
GameObject temp = Instantiate(instance.skillImagePerfab);
temp.GetComponent<SkillSlot>().UpdateSlot(skill);
temp.transform.SetParent(instance.learnedPanel.transform);
改为:
GameObject temp = Instantiate(instance.skillImagePerfab,instance.learnedPanel.transform);
temp.GetComponent<SkillSlot>().UpdateSlot(skill);