簡體   English   中英

使用 Line Renderer 在運行時在兩點之間繪制線

[英]Draw line between two points at runtime using Line Renderer

我不熟悉編碼並嘗試制作一個物體出現在牆上的游戲,玩家將通過一條線連接 2 個匹配項(這個游戲感覺是 2D 但實際上是 3D)。

我的第一步只是能夠在兩點之間畫一條線。 稍后我會嘗試弄清楚是否使用布爾值、觸發器或碰撞器或什么來確定玩家是否連接了正確的對象。

我在這方面遇到了很多麻煩。 我想單擊屏幕一次以確定起點,然后第二次確定直線渲染器的終點。 然后用新的一行重復這一切。

這個腳本幾乎可以正常工作,但出於某種原因,我的第一個點總是設置為 (0, 0, 0),我不知道為什么。 這是我當前的腳本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DrawLine_2PT : MonoBehaviour


{
    // Apply these values in the editor
    public LineRenderer Line;
    public GameObject newLine;
   
    public float minimumVertexDistance = 0.1f;

    public Vector3 GetWorldCoordinate(Vector3 mousePosition)
    {
        Vector3 mousePos = new Vector3(mousePosition.x, mousePosition.y, 1);
        return Camera.main.ScreenToWorldPoint(mousePos);
    }

    void Start()
    {
        // set the color of the line
        Line.startColor = Color.red;
        Line.endColor = Color.red;

        // set width of the renderer
        Line.startWidth = 0.3f;
        Line.endWidth = 0.3f;
        Line.positionCount = 0;
    }


    void Update()
    {
        if ((Input.GetMouseButtonDown(0)) && Line.positionCount == 0)

        {
            Vector3 mousePos = GetWorldCoordinate(Input.mousePosition);
            Line.SetPosition(0, mousePos);
            Line.positionCount = Line.positionCount + 2;
            
               
        }

        
        if (Input.GetMouseButtonDown(0) && Line.positionCount == 2)

        {
            Vector3 mousePos = GetWorldCoordinate(Input.mousePosition);
            Line.SetPosition(1, mousePos);
            Instantiate(newLine, transform.position, Quaternion.Euler(0, 0, 0));
            GetComponent<DrawLine_2PT>().enabled = false;

        }

    }

}

最后一位在第二個點生成后生成一條新線,並關閉初始線渲染器。 同樣,除了第一個點總是在 (0, 0, 0) 而不是鼠標 position 處生成外,似乎一切正常。

非常感謝任何/所有建議。

謝謝

你在做

Line.positionCount = Line.positionCount + 2;

在你打電話之后

Line.SetPosition(0, mousePos);

所以這還沒有效果,因為當你嘗試設置它時還沒有點。

然后你添加的兩個位置都保持默認 position 0,0,0直到你稍后覆蓋第二個。

您應該先增加計數,然后設置 position。

另請注意,實際上您的兩個代碼塊將在同一幀中執行,因為在增加計數后第二個條件也匹配。 這是故意的嗎?

我寧願期待像這樣的東西

void Update()
{
    if ((Input.GetMouseButtonDown(0))
    {
        if(Line.positionCount == 0))
        {
            Line.positionCount = 1;
            var mousePos = GetWorldCoordinate(Input.mousePosition);
            Line.SetPosition(0, mousePos);            
        }    
        else
        {
            Line.positionCount = 2;
            var mousePos = GetWorldCoordinate(Input.mousePosition);
            Line.SetPosition(1, mousePos);
            Instantiate(newLine, transform.position, Quaternion.Euler(0, 0, 0));
            GetComponent<DrawLine_2PT>().enabled = false;
        }
    }
}

而且,如果您願意,甚至可以在用戶繪制線條時直觀地更新線條,例如

void Update()
{
    if ((Input.GetMouseButtonDown(0))
    {
        if(Line.positionCount == 0))
        {
            Line.positionCount = 1;
            Vector3 mousePos = GetWorldCoordinate(Input.mousePosition);
            Line.SetPosition(0, mousePos);            
        }    
        else
        {
            Line.positionCount = 2;
            var mousePos = GetWorldCoordinate(Input.mousePosition);
            Line.SetPosition(1, mousePos);
            Instantiate(newLine, transform.position, Quaternion.Euler(0, 0, 0));
            GetComponent<DrawLine_2PT>().enabled = false;
        }
    }
    else if(Line.positionCount == 1)
    {
        var mousePos = GetWorldCoordinate(Input.mousePosition);
        Line.SetPosition(1, mousePos);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM