【转载】Unity3D研究院transform.parent = parent坐标就乱了
昨天有朋友问我了一个问题,它将Hierarchy视图里的某个子节点下的GameObject拷贝到另外一个对象的子节点下面,他使用的方法就是 transform.parent = parent 但是拷贝过去以后坐标就全乱了。如下图所示我们搭建一个测试环境,我的目标是把a2拷贝在b2下面。
如下图所示,a0 a1 和 b0 b1作为父节点, 为了验证测试的可行性,我把它们的坐标 旋转 缩放 完全搞乱。
一 . 不改变拷贝坐标的情况下
1.直接copy 这个是最简单的
1
2
3
4
|
private void MoveGameObject(GameObject copy,Transform parent)
{
copy.transform.parent = parent;
}
|
2.先实例化一份新的,然后在copy ,重点说说这个,因为他出问题的也是在这里。
1
2
3
4
5
6
7
8
9
10
|
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));
}
|
a. GameObject go = Instantiate(copy) as GameObject;
实例化一份新的GameObject 在根目录下,此时 坐标、旋转、缩放系数取的是copy的相对坐标。那么这一步就坐标就已经乱了。。
b.go.transform.parent = parent;
仅仅是move的操作,换算到相对parent的坐标 旋转 缩放 。
c.go.transform.position = copy.transform.position;
go.transform.rotation = copy.transform.rotation;
Unity的Transform组件中看到的位置、旋转、缩放,都是相对父节点的,它并不是相对世界的。所以此时需要把 “被拷贝者” 的世界坐标系数拷贝给 “拷贝者”
d. 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
|
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
|
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是只读的,但是不能写。
复制过去的两个完全重合。。
- 本文固定链接: http://www.xuanyusong.com/archives/3151
- 转载请注明: 雨松MOMO 2014年08月22日 于 雨松MOMO程序研究院 发表
【转载】Unity3D研究院transform.parent = parent坐标就乱了的更多相关文章
- (转载)Unity3D研究院之使用 C#合成解析XML与JSON(四十一)
XML与JSON在开发中非常重要, 其实核心就是处理字符串.一个是XML的字符串一个是JSON的字符串,尤其是在处理网络请求的时候,肯定是要用的.另外现在JSON非常的流行,我写了一个简单的例子融合了 ...
- (转)Unity3D研究院之将场景导出XML或JSON或二进制并且解析还原场景
自:http://www.xuanyusong.com/archives/1919 导出Unity场景的所有游戏对象信息,一种是XML一种是JSON.本篇文章我们把游戏场景中游戏对象的.旋转.缩放.平 ...
- (转)Unity3D研究院之Assetbundle的实战(六十三)
上一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity3D研究院之Assetbundle的原理(六十一) 本篇文章我们将说说assetbundl ...
- Unity3D研究院之Jenkins的使用(七十八)
长夜漫漫无心睡眠,来一篇嘿嘿.我相信如果已经用Shell脚本完成IOS和Android打包的朋友一定需要Jenkins 怎么才能让策划打包ipa和apk?怎么才能彻底省去程序的时间,只要在同一局域网内 ...
- jQuery 中$(this).parent().parent().remove()无效。
在写文章系统的删除功能.需要删除一行数据.在删除的页面,需要jQuery 删除一hang. 局部刷新数据. $(".del").click(function(){ var id = ...
- Unity3D研究院之与Android相互传递消息
原地址:http://www.xuanyusong.com/archives/676 上一篇文章我们学习了Unity向Android发送消息,如果Android又能给Unity回馈消息那么这就玩美了. ...
- Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条
Unity3D研究院之异步加载游戏场景与异步加载游戏资源进度条 异步任务相信大家应该不会陌生,那么本章内容MOMO将带领大家学习Unity中的一些异步任务.在同步加载游戏场景的时候通常会使用方法 Ap ...
- Unity3D研究院之Assetbundle的实战(六十三)
http://www.xuanyusong.com/archives/2405 上一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity3D研究院 ...
- 【转载】Unity3D研究院之IOS自定义游戏摇杆与飞机平滑的移动
移动开发游戏中使用到的触摸游戏摇杆在iPhone上是非常普遍的,毕竟是全触摸屏手机,今天MOMO 通过一个小例子和大家讨论Unity3D 中如何自定义一个漂亮的全触摸游戏摇杆. 值得高兴 ...
随机推荐
- 使用selenium grid与BrowserMobProxyServer联合使用
背景:项目主要是做埋点数据,要使用 BrowserMobProxyServer,它相当于做一个代理,在你访问一个网页时,通过代理,获取打开网页的数据,对比你需要对比数据,所以这个工具提供获取页面请求的 ...
- Android(java)学习笔记60:继承中父类 没有无参构造
1. 继承中父类 没有无参构造: package com.himi.test1; /* 如果父类没有无参构造方法,那么子类的构造方法会出现什么现象呢? 报错. 如何解决呢? A:在父类中加一个无参构造 ...
- 第19章 通讯的基本概念—零死角玩转STM32-F429系列
第19章 通讯的基本概念 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege ...
- 如何使用MongoDB+Springboot实现分布式ID?
转载请标明出处: http://blog.csdn.net/forezp/article/details/69056017 本文出自方志朋的博客 一.背景 如何实现分布式id,搜索相关的资料,一般会给 ...
- 什么是 BIND 变量?
变量绑定会使联机事务处理过程(OLTP)系统数据库中的SQL执行速度飞快,内存效率极高:不使用绑定变量可能会使OLTP数据库不堪重负,资源被SQL解析严重耗尽,系统运行缓慢. 当一个用户与数据库建立连 ...
- Linux帮助都有哪几种,如何使用?
帮助文件有2类,内置命令和外部命令. 其中内置命令就是shell内核自带的,因为shell当中自己要进行管理,那么就需要一些命令进行管理,不同的shell肯定有不同的shell命令,我们用type命令 ...
- js | javascript实现浏览器窗口大小被改变时触发事件的方法
转载 当浏览器的窗口大小被改变时触发的事件window.onresize 为事件指定代码: 代码如下: window.onresize = function(){ } 例如: 浏览器可见区域信息: 代 ...
- IDEA搭建SSM出现的一些错误
下面是我这几天整合SpringMVC+Spring+MyBatis框架遇到的一些问题 ,在这里总结一下: 1:HTTP Status 500 - Request processing failed; ...
- JAVA / MySql 编程—— 第四章 高级查询(二)
1. EXISTS和NOT EXISTS子查询:EXISTS关键字用来检测数数据库对象是否存在. ★EXISTS和NOT EXISTS的结果只取决于是否 ...
- Eclipse搭建SpringBoot
第一种方法(不建议) 首先新建Maven工程 勾选第一个按钮,第三个是选择working set ,你可以不选 下一步,配置工程信息,注意打包为jar 打开pom.xml文件,添加spring-boo ...