2017-04-03 78 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),添加应用于该物体的旋转。

请注意,本身就是其他对象的子对象的对象可能会应用多个旋转和缩放层(因此强调世界空间值),所有这些都可能轻易抛弃结果。从简单的案例开始,一次添加一个步骤。也许你可以跳过检查比例尺,因为你总是会在场景中使用统一缩放的对象。