2017-11-11 160 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