Re: [请益] Unity中prefab角度跟Instantiate不同

楼主: yichen (苍穹之下任我行)   2015-08-09 15:48:34
※ 引述《JKT48 (JKT48)》之铭言:
: 大家好
: 新手在玩Unity做一个飞机的游戏, 飞机可以射出飞弹打击目标等等
: 现在做到一个地方一直卡关, 所以上来请问前辈
: 是这样的我现在要做一个追踪型的飞弹可以直接追踪目标
: 2D游戏
: 从TOP角度来看 右边是+X 往上是+Z
: 现在有几个情况
: 飞弹模型刚从网络上抓下来的时候是横的
: o======>
: 我可以比他加入一些要素以后变成Prefab
: Prefab也可以转角度
: y转-90度可以变成这样(大概看得懂就好= =)
: ^
: i
: i
: o
: 之后从Prefab拉近萤幕角度都没问题
: 因为飞弹本来就是要往上射
: 但是我在写脚本的时候 可能角度那边一直被搞混
: 目前是在主角飞机的scripts按下一个键以后 先寻找tag=enemy的敌人
: if(target = GameObject.FindGameObjectWithTag("BossEnemy"))
: {
: Vector3 relativePosition = player_transform.position
: - target.transform.position;
: //开始生子弹
: Instantiate(rocket_transform,
: player_transform.position,
: Quaternion.LookRotation(relativePosition));
: }
: 我把元素都分行, 希望大家都看的懂
: 再配合我子弹自己的scripts:
: this.transform.Translate(new Vector3(0, 0, -speed * Time.deltaTime) );
: 到目前为止, 子弹可以生成没错, 轨迹也有自动搜寻敌人的功能
: 但是为什么子弹就是会一直横的去找敌人飞机啊Q_Q
: 就是跟一开始模型的rotation一样 不管我Prefab怎么设定都没用...
: 我试着用this.transform.rotation去改角度, 可是发现越改越乱
: 不是飞弹自己乱绕就是追踪功能不对
: 不知道有没有前辈能够指点我一下是我哪边弄错了?
: 或是我该找哪个方向的资料...
: p.s 我有试着执行游戏然后再暂停游戏 去看生成的那些子弹
: 我想我应该是
: 物体生成角度 跟 物体本身的角度 搞混了?
: 因为我看每个飞弹的角度在Y方向加90度就是我要的
: 可是不知道该在哪边改这个东西
: 新手发问
: 请见谅
在Prefabs中的Transform(position, rotation)是在instantiate时,
没有指定position与rotation的时候会采用的默认值。
当你用鼠标拉Prefab进画面来instantiate时,会指定鼠标位置给position,
但是因为没有rotation值设定,就会采用原本在Prefab的rotation。
所以用拉Prefab的方式,角度与预想的是一样的。
当今天用script来instantiate的时候,
如果你是用
Instantiate(rocket); // 没有指定position与rotation
// 相当于拉Prefab到Heirarchy中
rocket就会采用Prefab的position与rotation。
然而,当使用的是
Instantiate(rocket, player_transform, player_rotation);
的时候,rocket的position与rotation会是所指定的值。
此时rotation就是原本的方向(Quaternion.identify, 此例中是向右)再转
player_rotation
而非先转了-90度再转。
处理的方法可以像推文前辈说的,用一个GameObject来做父物件。
这个父物件的旋转就是没有被旋转过(Quaternion.identity或0度),
所以对它做方向旋转或移动都会是如预期的。
把rocket放到这个GameObject做子物件,这时把rocket转-90度,
由于子物件是相对于父物件来移动旋转的,它不会影响到父物件的旋转。
还有另一种处理方式就是,没有父物件,但是也不要对rocket手动旋转,
它是朝向右的,就直接把右边当成它的移动方向(X轴正向)。
rocket_transform.Translate(Vector3.right * speed); //
不过这时用LookRotation可能会有问题,因为LookRotation是以Z轴正向为方向,
可能要改用Mathf.Atan2()的方式。
http://docs.unity3d.com/ScriptReference/Mathf.Atan2.html
float angle = Mathf.Atan2(relativePosition.z, relativePosition.x)
* Mathf.Rad2Deg; // 以X轴正向为方向
rocket_transform.Rotate(0f, angle, 0f); // 对Y轴旋转angle角度
(如果要以Z轴正向来算角度,Mathf.Atan2中把z值放到第二个参数, x值放到
第一个参数,就以Z轴正向来找旋转角度了)
希望有解释清楚,如果有错误之处,烦请指出,谢谢!
作者: JKT48 (JKT48)   2015-08-09 23:56:00
前辈谢谢 我后来用父子物件完成了, 另外我也有玩你的游戏我也是做飞机的, 改天完成度高一点时再放上来交流一下

Links booklink

Contact Us: admin [ a t ] ucptt.com