【问题标题】:Creating Mesh like Line Render Unity3d像线渲染Unity3d一样创建网格
【发布时间】:2021-10-08 05:32:20
【问题描述】:

我想创建与用户输入相同的网格。用户通过 linerender 绘制线条。 这是我的代码,通过 LineRender 点数组的点生成网格,但是网格不是连续的,如果你快速画线,网格之间会有一些空间,因为数组中两个点的距离很大(所以如何创建相同的网格形状和连续性。网格需要看起来像线。

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

[RequireComponent(typeof(MeshFilter))]
public class MeshGenerator : MonoBehaviour
{
    public Vector3[] _point;
    private Vector3[] _vertices;
    private int[] _triengels;
    private Mesh _mesh;
    private Draw draw;
    private float _verticesOffSetX;
    private float _verticesOffSetY;


    void Start()
    {
        draw = GameObject.FindGameObjectWithTag("GameController").GetComponent<Draw>();
        _mesh = GetComponent<MeshFilter>().mesh;

    }

    void Update()
    {
        if(Input.GetKeyUp(KeyCode.Mouse0))
        {
            CreateShapeDraw();
            UpdateMesh();
        }        
    }

    private void CreateShapeDraw()
    {


        _point = new Vector3[draw.pointCounter];
        draw.currentLineRender.GetPositions(_point);

        _vertices = new Vector3[draw.pointCounter * 4];
        _triengels = new int[draw.pointCounter * 6];

        int v = 0;
        int t = 0;
        for (int i = 1; i < draw.pointCounter-1; i++)
        {

            _verticesOffSetX = _point[0].x - _point[i].x ;
            _verticesOffSetY = _point[0].y - _point[i].y;
            Vector3 offSet = new Vector3(_verticesOffSetY, 0, _verticesOffSetX);

            _vertices[v] =   new Vector3(-0.1f, 0, -0.1f) + offSet;
            _vertices[v+1] = new Vector3(0.1f, 0, -0.1f) + offSet;
            _vertices[v+2] = new Vector3(-0.1f, 0, 0.1f) + offSet;
            _vertices[v+3] = new Vector3(0.1f, 0, 0.1f) + offSet;

            _triengels[t]   = v;
            _triengels[t+1] = _triengels[t+4] = v+1;
            _triengels[t+2] = _triengels[t+3] = v+2;
            _triengels[t+5] = v+3;

            v += 4;
            t += 6;



        }

    }

    private void UpdateMesh()
    {
        this.gameObject.RemoveComponent<MeshCollider>();
        _mesh.Clear();
        _mesh.vertices = _vertices;
        _mesh.triangles = _triengels;
        MeshCollider mesh =  gameObject.AddComponent(typeof(MeshCollider)) as MeshCollider;
        mesh.convex = true;
    }   
}

我画线的方式

public class Draw : MonoBehaviour
{
    public Camera mainCamera;
    public GameObject brush;

    public LineRenderer currentLineRender { get; set; }
    public int pointCounter { get; set; }

    private Vector3 _previousPointDistance = Vector3.zero;
    private float _minDistance = 0.01f;
    private CheckArea checkArea;
    private int i;
    public List<Vector3> extenciveArray;
    private Vector3[] _point;

    private void Start()
    {
        i = 0;
        checkArea = GameObject.FindGameObjectWithTag("Desk").GetComponent<CheckArea>();
    }
    private void Update()
    {
        Shapeding();
        currentLineRender.GetPositions(_point);
    }
    private void Shapeding()
    {
        if (!checkArea.canDrow) return;
        
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
           CreateBrush();
        }
        else if (Input.GetKey(KeyCode.Mouse0))
        {
            Vector3 mousePos = mainCamera.ScreenToWorldPoint(Input.mousePosition);   
            AddPoint(mousePos);
            pointCounter = currentLineRender.positionCount;
            _point = new Vector3[pointCounter];
        }
        else
        {
            currentLineRender = null;
             Destroy(GameObject.FindGameObjectWithTag("Brush"));
             i = 0;
        }
        
        
    }
    private void CreateBrush()
    {
        GameObject brushInctance = Instantiate(brush);
        currentLineRender = brushInctance.GetComponent<LineRenderer>();

        Vector3 mousePos = mainCamera.ScreenToWorldPoint(Input.mousePosition);

        currentLineRender.SetPosition(0, new Vector3(mousePos.x, mousePos.y, mousePos.z + 10));
        currentLineRender.SetPosition(1, new Vector3(mousePos.x, mousePos.y, mousePos.z + 10));
    }
    private void AddPoint(Vector3 pointPos)
    {
        if(_previousPointDistance == null)
        {
            _previousPointDistance = pointPos;
        }
        if (_previousPointDistance != null && Mathf.Abs(Vector3.Distance(_previousPointDistance, pointPos)) >= _minDistance)
        {
            i++;
            _previousPointDistance = pointPos;
            currentLineRender.positionCount = i;
            currentLineRender.SetPosition(i - 1, new Vector3(pointPos.x, pointPos.y, pointPos.z + 10));

        }
    }
}

【问题讨论】:

标签: c# unity3d


【解决方案1】:

定义你所追求的对撞机是一项非常有趣但又相当艰巨的任务。 统一的 lineRenderer 的LineRenderer.BakeMesh 方法可以为你做到这一点。

你可以这样做:

public yourLineRendererComponent;
public meshColliderComponentReferenceAddedToYourLineRendererGameObject;
private Mesh mesh = new Mesh();

void setLrCollider() {
    LineRenderer lineRenderer = yourLineRendererComponent;
    lineRenderer.startWidth = 1; //optional
    lineRenderer.endWidth = 1; //optional
    MeshCollider meshCollider = 
    meshColliderComponentReferenceAddedToYourLineRendererGameObject;
    lineRenderer.positionCount = lineRendererPathVector3Array.Length;
    lineRenderer.SetPositions(lineRendererPathVector3Array);
    lineRenderer.BakeMesh(mesh, Camera.main);
    meshCollider.sharedMesh = mesh;
}

显然没有调试过的代码。为变量命名,使其尽可能具有描述性,以便您知道如果您想尝试一下该怎么做。

【讨论】:

  • 你能检查一下我画线的方式吗(我添加了一些代码来提问)因为我不明白我可以在哪里实现 lineRender.BakeMesh(),对不起,我是 Unity 的新手第一次使用网格
  • 据我了解,您需要一个与您的线形状相同的网格(来自句子“网格需要看起来像线”)。我没有深入研究您的代码,只是为您提供了线渲染器的方法,它生成了一个网格碰撞器,该网格碰撞器具有 lineRenderer 组件生成的线的形状。似乎比我认为你正在做的自己处理网格点更可行......
  • 好的,请按你的方式做,谢谢
  • 我建议这样做,因为它是最可行的方式。然后你可以尝试自己生成网格,如果实现这种方式很痒;)
猜你喜欢
  • 2019-04-22
  • 2018-10-18
  • 1970-01-01
  • 2021-05-07
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多