使用 Transform 属性移动和旋转 LineRenderer

Pro*_*mer 4 c# unity-game-engine

您可以使用 Transform 属性在 Unity 中旋转任何可视对象。一个例外是LineRenderer. 您不能使用 transform 属性移动或旋转它。

LineRendererSetPositionorSetPositions函数一起移动,因此我设法通过变换位置属性使其可移动,但我也无法使其旋转。

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

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);
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用与以前相同的方法使其能够旋转,但我陷入了获取偏移量的第一步,因为无法访问旋转变量 forLineRenderer但有一个用于访问位置GetPosition

如何获得LineRenderer旋转或如何LineRenderer从 Transform 属性进行旋转?

下图显示了LineRenderer使用和不使用上述脚本时的行为。位置现在可以使用上面的脚本启用但旋转不是。

Plu*_*uto 5

您可以使用转换的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);
}
Run Code Online (Sandbox Code Playgroud)