使用Transform属性移动和旋转LineRenderer

5
您可以使用Transform属性在Unity中旋转任何可视对象。唯一的例外是LineRenderer。您无法使用Transform属性移动或旋转它。 LineRenderer是使用SetPositionSetPositions函数移动的,因此我设法通过Transform位置属性使其可移动,但我无法使其旋转。
以下是我用来使其可移动的代码。
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旋转角度或如何通过Transform属性旋转LineRenderer
下面是一个展示有/没有上面脚本时LineRenderer行为的图像。启用上面的脚本后,位置正在工作,但旋转没有。


我不熟悉Unity,但是人们会认为像newBeginPos = transform.rotation * newBeginPos这样的东西吧? - Mike Mat
不行。我使用了一个GetPosition函数来获取位置,现在我正在寻找不存在的GetRotation函数。至于你的建议,它不应该起作用,因为你需要LineRenderer和它所附加到的GameObject的旋转才能得到旋转的偏移量。现在,你只是在乘以这个GameObject的位置和旋转。我也尝试过那样做,但只会使LineRenderer消失。 - Programmer
我能想到的一种方法,但可能行不通的是,在线渲染器的两端各有一个空游戏对象(作为其子对象),通过使用线渲染器的变换旋转这些对象,然后将这些游戏对象的位置应用于线渲染器的端点。 - Daahrien
好的建议。我会试一试。 - Programmer
2个回答

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);
}

这似乎是有效的,我知道localToWorldMatrix将本地空间转换为世界空间。您能解释一下您在答案中具体做了什么吗? - Programmer
1
@程序员 矩阵乘法将变换的平移、旋转、缩放应用于向量(这正是您想要的)。还有transform.TransformPoint(Vector3 position),它几乎做了同样的事情。或者您可以将线渲染器的“使用世界空间”设置为false。 - Pluto

3

至少尝试包括链接摘要。答案应该独立成篇。请注意,下面的答案仅供参考,具体翻译可能因上下文而异。尽量包括链接摘要。 至少尝试包括链接摘要。答案应该独立成篇。 - mx0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接