XZ平面上的2D对撞机

时间:2019-11-21 08:26:16

标签: c# unity3d

我正在Unity3D中构建3D游戏,当他处于顶视图时,用户可以在地面上画图。

使用LineRenderer组件绘制线条。

我想让用户选择他绘制的线条,以便他可以删除它们。但不幸的是,我没有找到一种好的方法。如果我使用的是3D对撞机,那么唯一适合的对象就是BoxCollider,但它太大了(我只想把对撞机放在网上)。

我不能使用2D碰撞器,因为它们仅在XY平面上工作。

我试图将线转换为网格并仅使用MeshCollider,但线太复杂了,MeshCollider无法自动将其自身适合于线。

你知道我该怎么办吗?

P.S。

我正在使用Ray演员表选择游戏中的对象。

1 个答案:

答案 0 :(得分:0)

如果MeshCollider太复杂,但是BoxCollider不够精确,请尝试在线段上使用多个BoxColliders

可以在此处找到实现:

https://answers.unity.com/questions/1546512/detect-mouse-click-on-line-renderer.html

如果链接中断,则代码如下:

 using UnityEngine;
 using System.Collections;
 using System.Collections.Generic;

 [RequireComponent(typeof(LineRenderer))]
 public class LineCollider : MonoBehaviour
 {
     LineRenderer line;
     public void Start() {
         AddCollider(6); //Increase the count of parts(6) if you want to get more detailed collider
     }
     public void AddCollider(int part)
     {
         try
         {
             line = GetComponent<LineRenderer>();
             var start = line.GetPosition(0);
             var end = line.GetPosition(line.positionCount - 1);
             var a = (line.positionCount - 1) / part;
             for (int i = 1; i<=part; i++)
             {
                 if (i == 1)
                     AddColliderToLine(start, line.GetPosition(Mathf.CeilToInt(a * 1)));
                 else if (i == part)
                     AddColliderToLine(line.GetPosition(Mathf.CeilToInt(a * (i - 1))), end);
                 else
                     AddColliderToLine(line.GetPosition(Mathf.CeilToInt(a * (i - 1))), line.GetPosition(Mathf.CeilToInt(a * i)));
             }            
         }
         catch
         {
             Destroy(gameObject);
         }
     }

     private void AddColliderToLine(Vector3 start, Vector3 end)
     {
         var startPos = start;
         var endPos = end;
         BoxCollider col = new GameObject("Collider").AddComponent<BoxCollider>();
         col.transform.parent = line.transform;
         float lineLength = Vector3.Distance(startPos, endPos);
         col.size = new Vector3(lineLength, 0.175f, 0.25f);
         Vector3 midPoint = (startPos + endPos) / 2;
         col.transform.position = midPoint;
         float angle = (Mathf.Abs(startPos.y - endPos.y) / Mathf.Abs(startPos.x - endPos.x));
         if ((startPos.y < endPos.y && startPos.x > endPos.x) || (endPos.y < startPos.y && endPos.x > startPos.x))
         {
             angle *= -1;
         }
         angle = Mathf.Rad2Deg * Mathf.Atan(angle);
         col.transform.Rotate(0, 0, angle);
     }
 }

作为替代方案,性能更高但更难实施:将线条写成纹理,并对您单击的像素进行采样-每行应具有不同的颜色。这也可以确保在绘制重叠线时具有z顺序。

在这里查看我的答案以了解一下:How does Java / OS detect click co-ordinates on a viewport?