在碰撞Unity3d C#上创建贴花

时间:2017-04-03 23:48:39

标签: c# unity3d unity5

以下代码来自我创建的快速游戏,用于测试Unity的功能。当检测到与另一个对象发生碰撞时,我有代码创建贴花。

问题是代码会创建贴面朝上(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);
}

1 个答案:

答案 0 :(得分:1)

这将是棘手的......

但可能。

步骤1:获取发生碰撞的网格的三角形。根据{{​​3}},我们可以通过Raycast来做到这一点。这很简单。

第2步:获取此三角形的曲面法线。

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

好的,好的。我们可以获得这些数据。据推测,我们想要的数组索引与步骤1中的RaycastHit.triangleIndex值相同。使用简单网格(立方体,平面)进行一些测试只是为了确保。

第3步:旋转。为了匹配" up"你必须稍微玩这个。预制件上的方向。如果Y +为Y +,那么将Z +设为可见面是一个很容易的错误,只是因为数学变得更简单。

步骤4:考虑整个对象的世界空间轮换。为面部旋转splat预制件(在未旋转的对象上测试步骤3),添加应用于对象的旋转。

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