关于坐标转化出现偏差的问题

member和singleMember是同一个组件,list和single有共同的父级root,member是list中的元素,根据list会自动排列位置,现在想把singleMember的位置设置的和list中的某个元素一样的位置,但是坐标转化后总是出现偏移。而且偏移的值随着list中的元素个数变化重排后会出现变化。
 
方式一:得到member相对于父级的相对位置,再把这个值设置给member
Vector2 pos = member.TransformPoint(Vector2.zero, root) //root是list和外面的单一元素共同共同父级    
singleMember.SetXY(pos.x, pos.y);
方式二:得到member的屏幕坐标,然后转逻辑坐标,再把位置设置给singleMember。
Vecter2 pos = member.LocalToGlobal(Vector2.zero)
Vecter2 logicPos = GRoot.inst.GlobalToLocal(pos);
singleMember.SetXY(logicPos.x, logicPos.y);
两种方式都不能得到正确的位置,总会出现偏差

微信截图_20190604123345.png

 
底下是编辑器中的设置


微信截图_20190604123233.png


微信截图_20190604123252.png


微信截图_20190604123553.png

 
 补充说明:

大概发现了问题出在哪里,观察了一下unity中物体的坐标,发现位置确实两个物体是一样的,但是他们的子集发生了偏移,猜想可能和list重排有关。
微信截图_20190604150700.png

这里面内外两个组件,坐标是正确的,所以设置位置的代码是正确的,但是我观察他们的子物体,位置都发生了相同的偏移。

微信截图_20190604151019.png

这是list在重排前和重排后内外两个组件的子物体位置(GObject的position属性)的变化。
已邀请:

谷主

赞同来自:

第一种方式是对的。第二种方式是错的,应该是父组件.GlobalToLocal。
至于为什么得不到正确,要自己debug,光凭这样描述不知道你还做了什么。另外,root是GObject的属性,不要混淆。

谷主

赞同来自:

列表重排的时间点看看教程。

要回复问题请先登录注册