《Unity3D之transform.docx》由会员分享,可在线阅读,更多相关《Unity3D之transform.docx(4页珍藏版)》请在三一办公上搜索。
1、Unity3D之transformUnity3D之transform.parent 昨天有朋友问我了一个问题,它将Hierarchy视图里的某个子节点下的GameObject拷贝到另外一个对象的子节点下面,他使用的方法就是 transform.parent = parent 但是拷贝过去以后坐标就全乱了。如下图所示我们搭建一个测试环境,我的目标是把a2拷贝在b2下面。 如下图所示,a0 a1 和 b0 b1作为父节点, 为了验证测试的可行性,我把它们的坐标 旋转 缩放 完全搞乱。 一 . 不改变拷贝坐标的情况下 1.直接copy 这个是最简单的 private void MoveGameObj
2、ect(GameObject copy,Transform parent) copy.transform.parent = parent; 2.先实例化一份新的,然后在copy ,重点说说这个,因为他出问题的也是在这里。 private void CopyGameObject(GameObject copy,Transform parent) GameObject go = Instantiate(copy) as GameObject; go.transform.parent = parent; go.transform.position = copy.transform.position;
3、 go.transform.rotation = copy.transform.rotation; Vector3 pLoss = copy.transform.lossyScale; Vector3 panelLoss = parent.lossyScale; go.transform.localScale = new Vector3(pLoss.x/panelLoss.x),(pLoss.y/panelLoss.y),(pLoss.z/panelLoss.z); 1. GameObject go = Instantiate(copy) as GameObject; 实例化一份新的GameO
4、bject 在根目录下,此时 坐标、旋转、缩放系数取的是copy的相对坐标。那么这一步就坐标就已经乱了。文章出处狗刨学习网 2.go.transform.parent = parent; 仅仅是move的操作,换算到相对parent的坐标 旋转 缩放 。 3.go.transform.position = copy.transform.position; go.transform.rotation = copy.transform.rotation; Unity的Transform组件中看到的位置、旋转、缩放,都是相对父节点的,它并不是相对世界的。所以此时需要把 “被拷贝者” 的世界坐标系数拷
5、贝给 “拷贝者” 4. Vector3 pLoss = copy.transform.lossyScale; Vector3 panelLoss = parent.lossyScale; go.transform.localScale = new Vector3(pLoss.x/panelLoss.x),(pLoss.y/panelLoss.y), 因为Unity不能直接设置世界缩放系数,只能设置相对缩放系数。所以这里我利用lossyScale来换算了一下相对坐标,lossyScale是一个只读的属性,就是只读某个对象的世界缩放系数。 二 . 改变拷贝坐标的情况下 这种情况一般都是从Resou
6、rces.Load后实例化的。实例化完毕后把Prefab里面预先设置的拷贝给Instiate后的对象。 private void LoadPrefab(string name,Transform parent) GameObject prefab = Resources.Load(name); GameObject go = Instantiate(prefab) as GameObject; go.transform.parent = parent; go.transform.localPosition = prefab.transform.position; go.transform.lo
7、calRotation = prefab.transform.rotation; go.transform.localScale = prefab.transform.localScale; 其实大多数情况下 都用 localPostion:000 localRotation:000 localScale:111。 private void LoadPrefab(string name,Transform parent) GameObject prefab = Resources.Load(name); GameObject go = Instantiate(prefab) as GameOb
8、ject; go.transform.parent = parent; go.transform.localPosition = Vector3.zero; go.transform.localRotation = Quaternion.Euler(Vector3.zero); go.transform.localScale = Vector3.one 相对坐标、旋转 localPosition localRotation 世界坐标、旋转 position rotation 只有localScale比较特殊,它的世界缩放系数lossyScale是只读的,但是不能写。 复制过去的两个完全重合。