我正在开发一款游戏,用户可以使用input.touch
绘制一条线(使该部分正常工作)。我想要发生的是让BoxCollider2D
以正确的旋转在线段的中心产生以匹配线。
我想我可以弄清楚如何在线段的中心产生它,但我不明白的是以正确的旋转产生它。
以下是我用来计算核心功能的测试脚本:
#pragma strict
var lastDotPosition : Vector3;
var lastPointExists : boolean = false;
var c1 : Color = Color.yellow;
var c2 : Color = Color.red;
var lengthOfLineRenderer : int = 2;
function Start() {
var lineRenderer : LineRenderer = gameObject.AddComponent.<LineRenderer>();
lineRenderer.material = new Material (Shader.Find("Particles/Additive"));
lineRenderer.SetColors(c1, c2);
lineRenderer.SetWidth(0.01,0.01);
lineRenderer.SetVertexCount(lengthOfLineRenderer);
}
function Update()
{
if (Input.GetMouseButton(0))
{
var lineRenderer : GameObject = new GameObject("Line");
lineRenderer.AddComponent.<LineRenderer>();
var newLine : LineRenderer = lineRenderer.GetComponent.<LineRenderer>();
newLine.SetColors(c1, c2);
newLine.SetWidth(0.1,0.1);
newLine.SetVertexCount(lengthOfLineRenderer);
var mouse : Vector2 = Camera.main.ScreenToWorldPoint(Input.mousePosition);
var mouseRay : Ray2D = new Ray2D(mouse, Vector2.zero);
var newDotPosition : Vector2 = mouseRay.origin;
lineRenderer.AddComponent.<BoxCollider2D>();
var newCol : BoxCollider2D = lineRenderer.GetComponent.<BoxCollider2D>();
if (newDotPosition != lastDotPosition)
{
var pos : Vector3 = Vector3(lastDotPosition.x,lastDotPosition.y, 0);
newLine.SetPosition(0, pos);
var pos2 : Vector3 = Vector3(newDotPosition.x, newDotPosition.y, 0);
newLine.SetPosition(1, pos2);
newCol.size = Vector2(1, .1);
var colAngle : float = Vector3.Dot(pos,pos2);
colAngle = colAngle/(pos.magnitude*pos2.magnitude);
colAngle = Mathf.Acos(colAngle);
colAngle = colAngle*180/Mathf.PI;
Debug.Log("Col angle: " + colAngle);
lineRenderer.transform.Rotate(Vector3(0, 0, colAngle+17.28));
Debug.Log("Rotation: " + lineRenderer.transform.rotation.z);
lastDotPosition = newDotPosition;
}
}
}
我想出了如何计算代表线段端点的两个矢量之间的角度; pos
(点开始)和pos2
(点结束)。我没有得到的是让游戏对象/对撞机旋转到那个程度。两个向量之间的角度是var colAngle
。如果我正确计算角度,请告诉我。如果是,那我该如何让BoxCollider2D
旋转到正确的旋转?
要测试它,只需将此脚本附加到新的空游戏对象并运行它。