在球体之间绘制保持相同尺寸的圆柱以产生对撞机

时间:2019-05-17 14:55:14

标签: c# unity3d

我有点卡住了。我试图在两个球体之间绘制一个圆柱体,同时在Game View中保持其在Z轴上的大小始终相同。目的是通过关闭圆柱体的“网格渲染器”(Mesh Renderer)使其不可见,从而使围绕小控件线的碰撞器成为可能。用LineRenderer替换Gizmos线也很好,但我总是需要它的大小与两侧的球体相同。

enter image description here

这是我的代码:

GameObject newSphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
// currentPosPoint = mouse click
newSphere.transform.position = currentPosPoint; 
// this way all the spheres appear of the same size even if in a different position on the Z axis
newSphere.transform.localScale = Vector3.one * ((new Plane(cam.transform.forward, 
                                                           cam.transform.position).GetDistanceToPoint(
                                                           newSphere.transform.position)) / radiusPoint);
// if the sphere is not the first
if (count > 1) {
    Vector3 start = posSphere1;
    Vector3 end = posSphere2;
    GameObject newCyl = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
    // I find the central position between the two spheres
    Vector3 pos = Vector3.Lerp(start, end, 0.5f);
    newCyl.transform.position = pos;
    // I find the rotation of the cylinder
    Vector3 dirV = Vector3.Normalize(end - start);
    Vector3 cylDefaultOrientation = new Vector3(0,1,0);
    Vector3 rotAxisV = dirV + cylDefaultOrientation;
    rotAxisV = Vector3.Normalize(rotAxisV);
    newCyl.transform.rotation = new Quaternion(rotAxisV.x, rotAxisV.y, rotAxisV.z, 0);
    float dist = Vector3.Distance(end, start);
    // it is from this point that I cannot get out of it
    // I resize the cylinder like the sphere
    newCyl.transform.localScale = Vector3.one * ((new Plane(cam.transform.forward, 
                                                            cam.transform.position).GetDistanceToPoint(
                                                            newCyl.transform.position)) / radiusPoint);
    // I assign the length of the cylinder to join its two ends to the spheres
    Vector3 newScale = newCyl.transform.localScale;
    newScale.y= dist/2;
    newCyl.transform.localScale = newScale;      
}

如您所见,只有在X轴上定向圆柱体时,圆柱体才与球体相同。

您对始终获得相同尺寸的气瓶有什么建议吗? 正如我说过的,不需要使用圆柱体,目标是在Gizmos线周围放置一个对撞机,任何更改都将是很好的。

1 个答案:

答案 0 :(得分:1)

将对象与LineRenderer一起使用,并根据开始和结束位置设置开始/结束宽度。

GameObject go = new GameObject("LineRenderer Object")
LineRenderer lr = go.AddComponent<LineRenderer>() as LineRenderer;

Vector3 start = posSphere1;
Vector3 end = posSphere2;

Plane camPlane = new Plane(cam.transform.forward, cam.transform.position)

float startWidth = camPlane.GetDistanceToPoint(start)) / radiusPoint);
float endWidth = camPlane.GetDistanceToPoint(end)) / radiusPoint);

// Make sure line renderer width curve is linear
lr.widthCurve = AnimationCurve.Linear(0f, startWidth , 1f, endWidth);

确保将GameObject放在数组中的某个位置,以便可以Destroy