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