如何在Unity中修改最终位置LineRenderer?

时间:2019-11-20 13:59:19

标签: c# unity3d augmented-reality vuforia

我在具有 Unity + Vuforia 的AR项目中使用了LineRenderer。这个想法是用节点及其conexions(使用LineRenderer)创建MindMap。我已经做到了。但是我不能这样做,子节点在拖动时会改变最终位置。

我尝试禁用检查Use World Space,并且它与父节点配合使用,因为当我将其拖动到“线”时,它也会移动。

例如,如果我移动节点1,一切都会移动,因为它是父节点,但是如果我移动节点2,则LineRenderer 2不会跟随。这是我不想发生的事情。

Draw nodes

这是我用于绘制 LineRenderer

的代码
public class DrawLineScript : MonoBehaviour
{
    public GameObject obj;

    public void DrawLine(GameObject parent, GameObject child){
        if(parent.name != "Spawner"){
            GameObject newLineGen = Instantiate(obj);   
            newLineGen.transform.SetParent(GameObject.Find(parent.name).transform);
            LineRenderer line = newLineGen.GetComponent<LineRenderer>();

            line.name = "Line " + child.name;

            line.positionCount = 2;
            line.SetPosition(0, parent.transform.position);
            line.SetPosition(1, child.transform.position); 
        }   
    }
}

这是我的代码,用于拖动节点

public class DragScript : MonoBehaviour
{
    private Vector3 mOffset;
    private float mZCoord;

    public GameObject nodo;

    void OnMouseDown()
    {
        mZCoord = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
        mOffset = gameObject.transform.position - GetMouseAsWorldPoint();
    }

    private Vector3 GetMouseAsWorldPoint()
    {
        // Pixel coordinates of mouse (x,y)
        Vector3 mousePoint = Input.mousePosition;

        // z coordinate of game object on screen
        mousePoint.z = mZCoord;

        // Convert it to world points
        return Camera.main.ScreenToWorldPoint(mousePoint);
    }

    void OnMouseDrag()
    {
        transform.position = GetMouseAsWorldPoint() + mOffset;
    } 
}

我假设将Update()与事件一起使用,该事件允许更新与子节点关联的LineRenderer的最终位置。我试图将GameScript LineRenderer的下一个脚本放进去:

public class UpdateLineScript : MonoBehaviour
{
    public GameObject obj;
    private Vector3 beginPosOffset;
    private Vector3 endPosOffset;   
    private Transform dentiny;
    private LineRenderer line;

    void Start() 
    {
        line = obj.GetComponent<LineRenderer>();

        Vector3[] pos = new Vector3[line.positionCount];
        line.GetPositions(pos);

        //Get offset
        beginPosOffset = transform.position - pos[0];
        endPosOffset = transform.position - pos[1];
    }

    void Update()
    {
        Vector3 newBeginPos = transform.position + beginPosOffset;
        Vector3 newEndPos = transform.position + endPosOffset;

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

但是这些行出现在任何地方。

Update LineRenderer

带有项目的仓库github(分支开发):MindMap Repository

1 个答案:

答案 0 :(得分:2)

我只是将其保留在public static void main(String[] args) { int num1 = 1; while(num1 <= 10){ System.out.println(num1); num1 += 1; } } 上,然后将此组件与Use World Space放在同一对象上:

LineRenderer

然后,无论您在何处产生新行,都使用两个public class UpdateLineScript : MonoBehaviour { [SerializeField] LineRenderer line; private Transform _parentTransform; private Transform _childTransform; private Vector3[] positions = new Vector3[2]; public void Initialize (Transform parentTransform, Transform childTransform, string newName) { name = newName; if(!line) line = GetComponent<LineRenderer>(); _parentTransform = parentTransform; _childTransform = childTransform; line.positionCount = 2; } private void Update() { positions[0] = parentTransform.position; positions[1] = childTransform.position; line.SetPositions(positions); } } 引用Initialize。从那里可以简单地获得相应的位置

Transform

现在,如何移动节点都无关紧要。第一个脚本只是不断地复制两个节点对象的绝对世界位置。


在智能手机上输入文字,但我希望这个想法能弄清楚