我正在Unity3D中构建3D游戏,当他处于顶视图时,用户可以在地面上画图。
使用LineRenderer
组件绘制线条。
我想让用户选择他绘制的线条,以便他可以删除它们。但不幸的是,我没有找到一种好的方法。如果我使用的是3D对撞机,那么唯一适合的对象就是BoxCollider,但它太大了(我只想把对撞机放在网上)。
我不能使用2D碰撞器,因为它们仅在XY平面上工作。
我试图将线转换为网格并仅使用MeshCollider
,但线太复杂了,MeshCollider无法自动将其自身适合于线。
你知道我该怎么办吗?
P.S。
我正在使用Ray演员表选择游戏中的对象。
答案 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?