2017-11-11 215 views
1

您可以使用Transform属性旋转Unity中的任何可视对象。 LineRenderer是一个例外。您无法使用transform属性移动或旋转它。移动并旋转具有变换属性的LineRenderer

LineRendererSetPositionSetPositions功能移动,所以我managed,使其可移动通过变换位置属性,但我不能让让它转动了。

下面是我使用它来移动的代码。

public Vector3 beginPos = new Vector3(-1.0f, -1.0f, 0); 
public Vector3 endPos = new Vector3(1.0f, 1.0f, 0); 

Vector3 beginPosOffset; 
Vector3 endPosOffset; 

LineRenderer diagLine; 

void Start() 
{ 

    diagLine = gameObject.AddComponent<LineRenderer>(); 
    diagLine.material = new Material(Shader.Find("Sprites/Default")); 
    diagLine.startColor = diagLine.endColor = Color.green; 
    diagLine.startWidth = diagLine.endWidth = 0.15f; 

    diagLine.SetPosition(0, beginPos); 
    diagLine.SetPosition(1, endPos); 

    //Get offset 
    beginPosOffset = transform.position - diagLine.GetPosition(0); 
    endPosOffset = transform.position - diagLine.GetPosition(1); 
} 

void Update() 
{ 
    //Calculate new postion with offset 
    Vector3 newBeginPos = transform.position + beginPosOffset; 
    Vector3 newEndPos = transform.position + endPosOffset; 

    //Apply new position with offset 
    diagLine.SetPosition(0, newBeginPos); 
    diagLine.SetPosition(1, newEndPos); 
} 

我试图用我所用,使之能够旋转的 - 同样的方法,但我被困在得到补偿,因为没有办法访问旋转变量LineRenderer的第一步,但有一个用于访问位置GetPosition

我怎样才能得到LineRenderer旋转或我怎样才能使LineRenderer从转换属性旋转?

下面是一个图像,显示LineRenderer的行为与上述脚本和没有脚本。现在位置正在启用上面的脚本,但旋转不是。

+0

我不熟悉的团结,但人们会认为像'newBeginPos = transform.rotation * newBeginPos'? –

+0

不是。有一个'GetPosition'函数,我现在正在寻找'GetRotation'函数,该函数不存在。至于你的建议,它不应该工作,因为你需要旋转LineRenderer和它所附加的GameObject以获得旋转的偏移量。现在,你只是乘上这个GameObject的位置和旋转。我也试过了,它只让LineRenderer消失。 – Programmer

+0

我可以想到的一些方式,但可能无法正常工作的是有2个空的gameobjects(linerenderer的子节点),一个在线渲染器的每一端,使用线渲染器的变换旋转旋转这些对象,然后将这些gameobjects位置应用到线渲染器结束。 – Lestat

回答

1

您可以使用变换的localToWorldMatrix

void Start() 
{  
    diagLine = gameObject.AddComponent<LineRenderer>(); 
    diagLine.material = new Material(Shader.Find("Sprites/Default")); 
    diagLine.startColor = diagLine.endColor = Color.green; 
    diagLine.startWidth = diagLine.endWidth = 0.15f; 

    diagLine.SetPosition(0, beginPos); 
    diagLine.SetPosition(1, endPos); 
} 

void Update() 
{ 
    //Calculate new postion 
    Vector3 newBeginPos = transform.localToWorldMatrix * new Vector4(beginPos.x, beginPos.y, beginPos.z, 1); 
    Vector3 newEndPos = transform.localToWorldMatrix * new Vector4(endPos.x, endPos.y, endPos.z, 1); 

    //Apply new position 
    diagLine.SetPosition(0, newBeginPos); 
    diagLine.SetPosition(1, newEndPos); 
} 
+0

这似乎是工作,我知道'localToWorldMatrix'转换本地到世界空间。你能解释一下你在答案中做了什么吗? – Programmer

+1

@编程器矩阵乘法将变换的平移,旋转,缩放应用于矢量(女巫正是你想要的)。还有'transform.TransformPoint(Vector3 position)',几乎完成了同样的事情。或者,您可以将线条渲染器的“使用世界空间”设置为false。 – Pluto