unity 教程Unity3D之UI设置⽗⼦关系setParent坑
写在前⾯:
在做项⽬的时候,难免会碰到UI很多的情况,⽽动态加载UI就是⼀个很重要的问题。⽽动态加载UI就需要考虑到设置UI的⽗⼦关系。通常我们会使⽤transform.setparent(transform)来设置⽗⼦关系。到这⾥都还是没⽑病。但是偏偏UI在设置⽗⼦关系的时候需要考虑到第⼆个参数。对于初学者往往会遇到UI加载出来,设置⼦物体后发现UI不见了,但是明明直接拖到UI层次中⼜是对的。这个问题就和第⼆个参数相关。worldPositionStays。所以这也是⼀个需要思考的问题。
UI设置⽗物体的原因分析
在加载UI中,这个加载步骤其实是⾸先将UI实例加载到场景的根路径中,然后再设置到⽗物体中。这个过程可以⽤⼿⼯实现,先加UI拖到场景根路径中,然后在拖到⽗物体下,此时显⽰的效果就是最后的效果。
原因:在从根路径拖到⽗物体这个过程中,就发⽣了坐标的转化。具体分析和解决⽅法看下⽂。
setparent()
这⾥⾸先对这个函数进⾏分析。这个函数有两个重载:
public void  SetParent( parent);
public void  SetParent( parent, bool worldPositionStays);
第⼀个是我们常⽤的只有⼀个参数的函数,第⼆个是加了⼀个是否保持世界坐标系的布尔型变量。
官⽅解释⼤意是:如果为真,那么就保持之前的位置、旋转量、缩放值。⽽为否,的时候则保持局部坐标的位置、旋转、缩放。
直接可能不太能理解这个参数的意思,所以就往后看。
由此引发的问题
通常我们在设置⽗⼦关系的时候,我们希望设置完后,⼦物体要保持原来的样⼦。如果变了样,那么就会对游戏的交互产⽣较为严重的影响。3D物体相对还好,UI在设置⽗物体如果没有设置好会出现很严重的变形。
worldPositionStays
下⾯对这个参数带来的影响做了对⽐试验:
测试场景:
球体作为⽗物体,⽅块作为⼦物体,分别的参数:
选择⽅块作为⼦物体能够看出变化。
⾸先参数为true。
效果保持不变。球体和⽅块的局部坐标值分别为:
可以看到在效果上保证了⽅块不随球体的变化⽽变化,但是其局部坐标值发⽣了变化,以球体为中⼼,但在效果上仍然是之前的相对位置。其次参数为false
从效果上,可以看出⽅块的旋转和缩放值已经发⽣了变化,不在保存原来的世界坐标系中的位置。球体和⽅块的局部坐标值分别为:
从参数上可以看出,⽅块在局部数值上保证了和之前全局坐标系中的数值相同。
可以看出产⽣的影响还是较⼤的。
对于UI
对于UI来说,我们是希望保留这种位置关系还是不保留呢?答案很明显,我们在做UI预设时是在UI的⽗物体下完成,保存到预设中的值也是UI局部坐标系中的值。
⾸先加载到场景根路径时,此时UI将之前局部坐标系的值换成全局坐标系。
要保证和之前UI⼀样,我们需要将这种位置关系带到UI⽗物体中。
于是应该设置为false。
测试效果://UI来源蛮⽜教程
设为true:
设为false:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。