2017-04-03 81 views
1

下面的代碼來自我創建的用於測試Unity功能的快速遊戲。當它檢測到與另一個對象的碰撞時,我有代碼創建一個貼花。在碰撞Unity3d時創建貼圖C#

問題是代碼創建面朝上的貼花(Y方向)。我已經嘗試了一些解決方案,但無法讓它旋轉以面對與它所撞擊的對象相同的方向。

示例:一個物體碰到面向玩家的牆,顯然我們希望貼花面臨玩家產卵。我的問題是,他們都臉朝上。

我看了一些老問題,發佈了類似的問題,但不能得到它的合作,所以任何幫助將是偉大的。

更新:也忘了提及,因爲「Splat」是一個預製和GameObject類型的平面。還爲上下文添加了問題的照片。

Issue

else 
{ 
    Debug.Log ("collision detected"); 

    //Instantiate (splat, transform.position, Quaternion.Euler(collision.gameObject.transform.forward)); 
    Instantiate (splat, transform.position, Quaternion.LookRotation(collision.gameObject.transform.forward, collision.gameObject.transform.transform.up)); 

    //destroy gameObject, timer seconds 
    Destroy(this.gameObject); 
} 
+0

在你的腳本中,我看到「splat」,我認爲這是你想要產生的'Prefab'。這是你作爲'Prefab'製作的'GameObject'還是它導入的3D模型(fbx,skp等等)? – Hristo

+0

對不起,忘了提及,它是一個有顏色的預製飛機物體。飛機總是面朝上(如果想想2D,Y方向)。 – Phillipv20

+0

難道這可能是因爲你正在用'collision.gameObject.transform.transform.up'的roation產生它? –

回答

1

這將是棘手的...

但可能。

第1步:獲取發生碰撞的網格三角形。根據this answer,我們可以通過Raycast做到這一點。這非常簡單。

第2步:獲得這個三角形的表面法線。

Mesh mesh = meshCollider.sharedMesh; 
Vector3[] normals = mesh.normals; 

好的,很好。我們可以得到這些數據。大概我們需要的這個數組的索引與步驟1中的RaycastHit.triangleIndex值相同。使用簡單的網格(立方體,平面)進行一些測試就可以確定。

第3步:旋轉。爲了與預製中的「向上」方向相匹配,您必須稍微玩一下。如果它是Y +,使Z +你的圖示可見面只是爲了使數學變得更簡單,那將是一個容易的錯誤。

第4步:帳戶爲世界空間作爲一個整體對象的旋轉。一旦甩干預制物旋轉了臉部(未旋轉物體上的測試步驟3),添加應用於該物體的旋轉。

請注意,本身就是其他對象的子對象的對象可能會應用多個旋轉和縮放層(因此強調世界空間值),所有這些都可能輕易拋棄結果。從簡單的案例開始,一次添加一個步驟。也許你可以跳過檢查比例尺,因爲你總是會在場景中使用統一縮放的對象。