我有点卡住了。我试图在两个球体之间绘制一个圆柱体,同时在Game View中保持其在Z轴上的大小始终相同。目的是通过关闭圆柱体的“网格渲染器”(Mesh Renderer)使其不可见,从而使围绕小控件线的碰撞器成为可能。用LineRenderer替换Gizmos线也很好,但我总是需要它的大小与两侧的球体相同。
这是我的代码:
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线周围放置一个对撞机,任何更改都将是很好的。
答案 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
。