Unity 3D Intantiate过程中Transform 空物体和本体之间的关系
想当年刚学Unity的时候,这个问题困扰了我好几天,因此来分享一下当初解决问题的思路.
我们通过Unity构建场景的过程中,经常发现一个现象,就是物体在拖进场景中后,我们会发现物体是反的,通过改变物体的rotation属性后,得到了正确的方向,可物体的坐标系又变得和默认坐标系(右上角系统自带的坐标系)不一样了,这样就给后续的脚本工作(通常是控制(Transform)脚本和生成(Intantiate)脚本)带来了困扰,因为脚本写作的过程中是按照世界坐标系来的,物体自己的坐标系和系统坐标系不一样了就会出现诸如按W向下 按S向上 按A向右 按D向左的现象.
其实,在游戏场景的创建过程中,不仅仅是物体的方向,一个游戏物体的坐标 方向 大小,都可能和我的的预期,或者是我们希望的样子有很大的区别,为了得到我们想要的样子,势必要改变该物体,那么这时为了不出现上一段出现的问题,我们就需要借助于Unity中的空物体,我们通过实例试验来得出结论(很多时候,为了记忆深刻,自己在Unity里试验一遍是个非常好的方法).

如上图,我通过互联网找到了一个飞机和一个炮弹的模型,我要实现一个飞机发射炮弹的demo, 要求是通过WSAD控制飞机的上下左右,按下空格键发射炮弹, 炮弹发射的位置是飞机前面的卡槽.
通过上图可以看出: 飞机和炮弹的比例很不协调 而且炮弹的方向也是反的 这里我们暂时不管这些问题 下面我们来一步一步地达到我们的要求
首先给飞机起名字叫player 炮弹起名字叫zidan
先给player写控制脚本
void float m_speed=3.0f;
void Update () {
//移动量
float movex = , movez = ;
//前
if (Input .GetKey(KeyCode.W))
{
movez += m_speed * Time.deltaTime;
}
//后
if (Input.GetKey(KeyCode.S))
{
movez -= m_speed * Time.deltaTime;
}
//左
if (Input.GetKey(KeyCode.A))
{
movex -= m_speed * Time.deltaTime;
}
//右
if (Input.GetKey(KeyCode.D))
{
movex += m_speed * Time.deltaTime;
}
//变换
this.transform.Translate(new Vector3(movex, , movez));
}
此时 把脚本挂在player上面 可以实现飞机的前后左右移动了.
然后 给炮弹写移动脚本
//子弹移动速度
public float m_speed = 3.0f;
//子弹生存时间
public float livetime = 3.0f; void Update () {
//生存时间递减
livetime -= Time.deltaTime;
//生存时间结束后销毁物体
if (livetime <=)
{
Destroy(this.gameObject);
}
//实现移动
this.transform.Translate(Vector3.forward * m_speed * Time.deltaTime); }
挂在zidan上面 此时可以实现子弹基于自身坐标系向前(forward)的移动了
要把飞机和炮弹结合在一起 这里需要在player的脚本里加上Instantiate(生成/实例化)命令 并且把zidan拖到project面板里的prefabs文件夹里形成预制体
//移动速度
public float m_speed = 3.0f;
//生成的子弹
public Transform playerRocket;
//子弹生成速率
public float m_rate = 1.0f; //子弹生成函数
void Fire()
{
Instantiate(playerRocket,this.transform.position,Quaternion.identity);
}
// Use this for initialization
void Start () { //按空格键发射炮弹 if (Input.GetKey(KeyCode.Space))
{
InvokeRepeating("Fire", , m_rate);
} } // Update is called once per frame
void Update () {
//移动量
float movex = , movez = ;
//前
if (Input .GetKey(KeyCode.W))
{
movez += m_speed * Time.deltaTime;
}
//后
if (Input.GetKey(KeyCode.S))
{
movez -= m_speed * Time.deltaTime;
}
//左
if (Input.GetKey(KeyCode.A))
{
movex -= m_speed * Time.deltaTime;
}
//右
if (Input.GetKey(KeyCode.D))
{
movex += m_speed * Time.deltaTime;
}
//变换
this.transform.Translate(new Vector3(movex, , movez)); }

我们发现这时是这个样子的 炮弹偏大而且方向是反的
这个问题很好解决 我们把zidan的预制体调小到了合适的大小 方向也通过改rotation调整到了合适的方向 再次运行 发现是这个样子的

炮弹从飞机的后方发射出来了 为什么呢 因为此时炮弹自身的坐标的向前(forward)就是飞机的后方 脚本是没有错了 错就错在子弹的朝向和它自身坐标的forward的朝向不一致
怎么解决这个问题呢 这就需要空物体了 给zidan创建一个空物体 把子弹拖进去 给空物体而不是子弹挂脚本 这时你子弹怎么变换已经与空物体无关了 因为子弹是空物体的子类 影响不到空物体 于是我们把外面包裹着空物体的子弹做成预制体并且调好大小方向和飞机关联 再次运行

实现目标
总结,创建场景过程中,如果遇到模型和自己预期的不一致的时候,通过为模型创建父级空物体并把脚本挂到空物体上,可以实现脚本内容和模型transform的分离 从而更加灵活的调节我们需要的效果

Unity 3D Intantiate过程中Transform 空物体和本体之间的关系的更多相关文章
- storm中worker、executor、task之间的关系
这里做一些补充: worker是一个进程,由supervisor启动,并只负责处理一个topology,所以不会同时处理多个topology. executor是一个线程,由worker启动,是运行t ...
- Android进阶笔记08:Android 中Activity、Window和View之间的关系
1. Android 中Activity.Window和View之间的关系(比喻): Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图) LayoutI ...
- C++中 0 与 NULL 与 nullptr之间的关系,nullptr_t 的实现
C++中 0 与 NULL 与 nullptr之间的关系,nullptr_t 的实现 来源 http://blog.csdn.net/Virtual_Func/article/details/4975 ...
- FFMPEG中最要害的结构体之间的关系
FFMPEG中最关键的结构体之间的关系 http://www.myexception.cn/program/1404591.html FFMPEG中结构体很多.最关键的结构体可以分成以下几类: a) ...
- Zstack中任务,事件,消息之间的关系
Zstack是Zigbee协议的具体实现,在实现的过程中为了能够更好的对各个模块和功能进行管理,所以加入了OSAL(Operating System Abstraction Layer 操作系统抽象层 ...
- Android中的APK,TASK,PROCESS,USERID之间的关系
开发Android已经有一段时间了,今天接触到底层的东西,所以对于进程,用户的id以及Android中的Task,Apk之间的关系,要做一个研究,下面就是研究结果: apk一般占一个dalvik,一个 ...
- python中,ascii,unicode,utf8,gbk之间的关系梳理
在计算机中,经常遇到编码问题,本节主要梳理下ascii,unicode,utf8,gbk 这几种编码之间的关系. ASCII 计算机中,所有数据都以0和1来表示.在一开始的时候,要表示的内容比较少,人 ...
- js中prototype,__proto__,constructor之间的关系
首先,我们需要了解三点: 1. 只要创建一个任意新函数,就会根据一个prototype属性,该属性指向函数的原型对象: 2. 每一个原型对象都会自动获得一个constructor属性,该属性只想pro ...
- Java中接口与接口和类之间的关系
接口和接口之间的关系 继承关系 可以多继承,并且可以多层继承 注意: 1.如果多个父接口中有同名的抽象方法,那么子接口只需要实现一次即可 2.如果多个父接口中有同名的默认方法,那么子接口必须重写默认方 ...
随机推荐
- [原创]软件质量保证圈QQ群:197915314
[原创]软件质量保证圈QQ群:197915314 软件质量保证圈QQ群:197915314,讨论软件工程.软件过程改进.软件质量保证等(非测试群)! 欢迎各位同学来,来时请自报家门,名片修改格式:sh ...
- P2P的原理和常见的实现方式(为libjingle开路)
参考原文 为了项目的IM应用,最近在研究libjingle,中间看了也收集了很多资料,感慨网上很多资料要么太过于纠结协议(如STUN.ICE等)实现细节,要么中间有很多纰漏.最后去伪存真,归纳总结了一 ...
- c#之第一课入门
这几天看到微软的build大会,感觉微软不甘落后他人,曾经的巨头难道又要重新崛起,不管了,为了以后的饭碗,还是简单学习一些c#吧,有时这种紧张感不错的,现在由于这种紧张感,我已经掌握的java(主要弄 ...
- A Xamarin.Forms Infinite Scrolling ListView
from:http://www.codenutz.com/lac09-xamarin-forms-infinite-scrolling-listview/ The last few months ha ...
- 奇怪吸引子---Sakarya
奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...
- 2014 Hangjs 见闻流水账第一天
前言 6月21日~6月22日, 第一次跑远门去参加一个大会(广州 -> 杭州),本来打算,在火车的回来的路上,把这两天的东西记录一下,不过,火车上的环境实在恶劣,同时也高估了自己的专注力,所以, ...
- 寻找倒数第K个结点
#include<stdio.h> #include<iostream> using namespace std; /** * 找到链表中的倒数第k个节点 */ //定义结构体 ...
- IIS网站属性中没有ASP.NET选项
打开IIS6,右击属性,居然没有发现ASP.NET的配置选项,虽然好久没搞这个了,但是印象中绝对是有一个ASP.NET选项卡的.我很奇怪,我以为是.net framework 2.0没安装,下载下来安 ...
- Python的Descriptor和Property混用
一句话,把Property和Descriptor作用在同一个名字上,就只有Property好使.
- SQL Server 几种锁的区别
NOLOCK(不加锁) 此选项被选中时,SQL Server 在读取或修改数据时不加任何锁. 在这种情况下,用户有可能读取到未完成事务(Uncommited Transaction)或回 ...