首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用鼠标绘制线条渲染器,然后从起点(飞行控制方式)将其缩短。

用鼠标绘制线条渲染器,然后从起点(飞行控制方式)将其缩短。
EN

Stack Overflow用户
提问于 2015-12-07 13:50:28
回答 1查看 1.2K关注 0票数 2

我正在创建一个类似于“飞行控制”的游戏。现在,我可以通过在屏幕上拖动鼠标来创建一个linerenderer,并且对象将跟随它。以下是代码:

代码语言:javascript
复制
void Update ()
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;
    if(Physics.Raycast(ray, out hit, 1000))
    {
        if(mouseDown)
        {
            if (pathList.Count == lineNum)
            {
                GameObject x = new GameObject();
                x.AddComponent<LineRenderer>();
                LineRenderer lr = x.GetComponent<LineRenderer>();
                lr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
                lr.receiveShadows = false;
                lr.SetWidth(0.4f, 0.4f);
                lr.material = m;
                List<Vector3> path = new List<Vector3>();
                lrList.Add(lr);
                pathList.Add(path);
                pathList[lineNum] = new List<Vector3>();
                finalPath.Add(hit.point);
            }

            if(Vector3.Distance(finalPath[finalPath.Count-1], hit.point) >5)
            {
                finalPath.Add(hit.point);
            }

            pathList[lineNum].Add(hit.point);
            lrList[lineNum].SetVertexCount(pathList[lineNum].Count);
            lrList[lineNum].SetPosition(pathList[lineNum].Count - 1, hit.point + new Vector3(0, 0.1f, 0));
            hitPoints.Add(hit.point); 
        }
    }

问题是,当跟随者对象到达时,我希望这条线消失。就像从起点到终点。下面是我在下面这个对象上的代码:

代码语言:javascript
复制
public class FollowLine : MonoBehaviour {

LineGenerator ln;
Vector3[] path;
int i = 0;
int y = 0;

void Start ()
{
    ln = FindObjectOfType<LineGenerator>();
}


void Update ()
{
    path = ln.finalPath.ToArray();
    if (path.Length != 0 && Vector3.Distance(transform.position, path[i]) > 1)
    {
        transform.position = Vector3.MoveTowards(transform.position, path[i], Time.deltaTime*3);
    }
    else if(path.Length > i+1)
    {
        i++;
    } 

    if(ln.pathList.Count != 0 && Vector3.Distance(transform.position, ln.pathList[0][0]) < 1)
    {
        ln.pathList[0].RemoveAt(ln.pathList.Count-1);
    } 
}

问题是,即使这段代码实际上删除了行渲染器中的oints,但它不会影响屏幕上的任何内容。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-07 16:34:48

您的代码确实很难阅读,但似乎您并没有真正从行呈现器中删除点,而且它还可能存在多个其他问题。

将行呈现器组件引用存储在lrList中。你打电话来

代码语言:javascript
复制
 ln.pathList[0].RemoveAt(ln.pathList.Count-1);

在第二个脚本中,它移除pathList中索引with List.Count-1中的点(注意,您从pathList引用了pathList列表和索引,这是一个错误吗?)如果不是这样的话,您试图通过这个方法实现什么?),从第一个脚本看,它只是一个Vector3列表。

现在回到第一个脚本,您已经

代码语言:javascript
复制
lrList[lineNum].SetVertexCount(pathList[lineNum].Count);

它将行呈现器的点数截断为pathList[lineNum]的长度(尽管第二个脚本实际上可以从pathList的中间删除点)。注意它是在if mouseDown子句下,所以它只会发生在鼠标向下。另外,它会立即添加另一个点,而不是在鼠标点击的位置,所以它会造成一些额外的混乱。

您应该考虑重写这段代码。首先:如果要删除行呈现器,请使用Object.Destroy函数:

代码语言:javascript
复制
Destroy(lrList[someIdx].gameObject); // Destroy the game object
lrList.RemoveAt(someIdx); // Remove from list if we don't need it

如果您只想清除在线渲染器上的点,请将顶点计数设置为0:

代码语言:javascript
复制
lrList[someIdx].SetVertexCount(0);

如果要删除行渲染器中的特定点,则要复杂得多。使用备份数据(类似于pathList中的数据)清除并重新创建它的点列表,因此它可能如下所示:

代码语言:javascript
复制
pathList[someIdx].RemoveAt(whatever_you_want); // Remove the point you want
lrList[someIdx].SetVertexCount(pathList[someIdx].Count); // Truncate line renderer points
// Set new points
for (int i = 0; i < pathList[someIdx].Count; ++i) {
  lrList[someIdx].SetPosition(i, pathList[someIdx][i]);
}

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34135160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档