Unity3D研究院transform.parent = parent坐标就乱了

发布时间:2025-04-13 10:48

了解市场需求:在转行前,研究目标行业的就业趋势和热门职位。 #生活知识# #生活指南# #职场建议# #职业转型#

昨天有朋友问我了一个问题,它将Hierarchy视图里的某个子节点下的GameObject拷贝到另外一个对象的子节点下面,他使用的方法就是 transform.parent = parent 但是拷贝过去以后坐标就全乱了。如下图所示我们搭建一个测试环境,我的目标是把a2拷贝在b2下面。

Unity3D研究院transform.parent = parent坐标就乱了 - 雨松MOMO程序研究院 - 1 如下图所示,a0 a1 和 b0 b1作为父节点, 为了验证测试的可行性,我把它们的坐标 旋转 缩放 完全搞乱。

Unity3D研究院transform.parent = parent坐标就乱了 - 雨松MOMO程序研究院 - 2

一 . 不改变拷贝坐标的情况下

1.直接copy 这个是最简单的

1

2

3

4

5

6

private void MoveGameObject(GameObject copy,Transform parent)

{

copy.transform.parent = parent;

}

2.先实例化一份新的,然后在copy ,重点说说这个,因为他出问题的也是在这里。

1

2

3

4

5

6

7

8

9

10

11

12

private void CopyGameObject(GameObject copy,Transform parent)

{

GameObject go = Instantiate(copy) as GameObject;

go.transform.parent = parent;

go.transform.position = copy.transform.position;

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;

实例化一份新的GameObject 在根目录下,此时 坐标、旋转、缩放系数取的是copy的相对坐标。那么这一步就坐标就已经乱了。。

2.go.transform.parent = parent;

仅仅是move的操作,换算到相对parent的坐标 旋转 缩放 。

3.go.transform.position = copy.transform.position;

go.transform.rotation = copy.transform.rotation;

Unity的Transform组件中看到的位置、旋转、缩放,都是相对父节点的,它并不是相对世界的。所以此时需要把 “被拷贝者” 的世界坐标系数拷贝给 “拷贝者”

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是一个只读的属性,就是只读某个对象的世界缩放系数。

二 . 改变拷贝坐标的情况下

这种情况一般都是从Resources.Load后实例化的。实例化完毕后把Prefab里面预先设置的拷贝给Instiate()后的对象。

1

2

3

4

5

6

7

8

9

10

11

private void LoadPrefab(string name,Transform parent)

{

GameObject prefab = Resources.Load<GameObject>(name);

GameObject go = Instantiate(prefab) as GameObject;

go.transform.parent = parent;

go.transform.localPosition = prefab.transform.position;

go.transform.localRotation = prefab.transform.rotation;

go.transform.localScale = prefab.transform.localScale;

}

其实大多数情况下 都用 localPostion:000 localRotation:000 localScale:111。

1

2

3

4

5

6

7

8

9

10

11

private void LoadPrefab(string name,Transform parent)

{

GameObject prefab = Resources.Load<GameObject>(name);

GameObject go = Instantiate(prefab) as GameObject;

go.transform.parent = parent;

go.transform.localPosition = Vector3.zero;

go.transform.localRotation = Quaternion.Euler(Vector3.zero);

go.transform.localScale = Vector3.one

}

相对坐标、旋转 localPosition localRotation (可以在Transform组件中看到)

世界坐标、旋转 position rotation(不能在编辑器中看到, 可以通过代码输出出来)

只有localScale比较特殊,它的世界缩放系数lossyScale是只读的,但是不能写。

复制过去的两个完全重合。。

Unity3D研究院transform.parent = parent坐标就乱了 - 雨松MOMO程序研究院 - 3

本文固定链接: https://www.xuanyusong.com/archives/3151 转载请注明: 雨松MOMO 2014年08月22日 于 雨松MOMO程序研究院 发表

最后编辑:2014-08-23

作者:雨松MOMO

专注移动互联网,Unity3D游戏开发

捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

网址:Unity3D研究院transform.parent = parent坐标就乱了 https://www.yuejiaxmz.com/news/view/863290

相关内容

Plant Parent植物养护
Windows Plant Parent 植物养护
微软亚洲研究院压力管理
生活研究院
中国家用电器研究院
摆脱久坐,健康就在运动中
北京大学研究生院
我校人工智能研究院揭牌
“健康照明”沙龙在中科院建筑设计研究院举行
e家洁生活研究院发布《收纳人群特征报告》

随便看看