【问题标题】:Move and Rotate LineRenderer with Transform property使用 Transform 属性移动和旋转 LineRenderer
【发布时间】:2017-11-11 04:33:34
【问题描述】:

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

LineRenderer 使用SetPositionSetPositions 函数移动,所以我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 从 Transform 属性中旋转?

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

【问题讨论】:

  • 我对 Unity 不熟悉,但有人会想到类似 newBeginPos = transform.rotation * newBeginPos?
  • 不。有一个GetPosition 函数我曾经获得该职位现在我正在寻找不存在的GetRotation 函数。至于您的建议,它不应该起作用,因为您需要 LineRenderer 的旋转和它所附加的 GameObject 以获得旋转的偏移量。现在,您只是将这个 GameObject 的位置和旋转相乘。我也试过了,它只会让 LineRenderer 消失。
  • 我能想到但可能行不通的方法是拥有 2 个空游戏对象(linerenderer 的子对象),在线渲染器的每一端各一个,使用线渲染器的变换旋转旋转这些对象,然后然后将这些游戏对象位置应用到线渲染器末端。
  • 好建议。我会试试看的。

标签: c# unity3d


【解决方案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);
}

【讨论】:

  • 这似乎有效,我知道 localToWorldMatrix 将本地空间转换为世界空间。你能解释一下你在回答中具体做了什么吗?
  • @Programmer 矩阵乘法将变换的平移、旋转、缩放应用于向量(witch 正是你想要的)。还有transform.TransformPoint(Vector3 position) 做几乎相同的事情。或者您可以将 linerenderer 的 Use World Space 设置为 false。
【解决方案2】:

你可以将LineRenderer的useWorldSpace属性设置为false,然后LineRenderer就可以通过它的transform组件来控制了。

https://answers.unity.com/questions/39391/line-renderer-position.html

【讨论】:

  • 至少尝试包含链接摘要。答案应该是独立的。
猜你喜欢
  • 1970-01-01
  • 2016-12-06
  • 2017-04-26
  • 2021-07-31
  • 2019-05-13
  • 2021-11-28
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
相关资源
最近更新 更多