using UnityEngine;
using System.Collections;
public class Script1 : MonoBehaviour
{
//LineRenderer
private LineRenderer lineRenderer;
//定义一个Vector3,用来存储鼠标点击的位置
private Vector3 position;
//用来索引端点
private int index = 0;
//端点数
private int LengthOfLineRenderer = 0;
void Start()
{
//添加LineRenderer组件
lineRenderer = gameObject.AddComponent<LineRenderer>();
gameObject.GetComponent<LineRenderer>().SetPosition(0,new Vector3(0,0,0));
gameObject.GetComponent<LineRenderer>().SetPosition(1,new Vector3(0,0,0));
//设置材质
//lineRenderer.material = new Material(Shader.Find("Particles/Additive"));
Material lineMat = new Material(Shader.Find("Legacy Shaders/Diffuse"));
lineMat.SetColor("_Color", new Color(100/255f, 100 / 255f, 100 / 255f, 1));
lineRenderer.material = lineMat;
//设置颜色
lineRenderer.SetColors(Color.red, Color.yellow);
//设置宽度
lineRenderer.SetWidth(0.05f, 0.05f);
}
void Update()
{
//鼠标左击
if (Input.GetMouseButtonDown(0))
{
//将鼠标点击的屏幕坐标转换为世界坐标,然后存储到position中
// position = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 1.0f));
position = RayDemo01.instance.nowVertex;
//端点数+1
LengthOfLineRenderer++;
//设置线段的端点数
lineRenderer.SetVertexCount(LengthOfLineRenderer);
// Debug.Log(LengthOfLineRenderer);
}
//连续绘制线段
while (index < LengthOfLineRenderer)
{
// Debug.Log(index);
// Debug.Log(position);
//两点确定一条直线,所以我们依次绘制点就可以形成线段了
lineRenderer.SetPosition(index, position);
index++;
}
}
void OnGUI()
{
GUILayout.Label("当前鼠标X轴位置:" + Input.mousePosition.x);
GUILayout.Label("当前鼠标Y轴位置:" + Input.mousePosition.y);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RayDemo01 : MonoBehaviour {
//顶点数组
public List<Vector3> Vertexes;
public List<Vector2> UVtexes;
public Vector3 nowVertex;
public static RayDemo01 instance;
//网格过滤器
private MeshFilter _meshFilter;
//网格
private Mesh _mesh;
public int trianglesCount;
public bool forward ;
public bool backward;
List<int> tempVertexList;
public bool isAlreadyforward;
public bool isAlreadybackward;
void Start()
{
instance = this;
mainCrma = Camera.main;
Vertexes = new List<Vector3>();
UVtexes = new List<Vector2>();
tempVertexList = new List<int>();
}
private Camera mainCrma;
private RaycastHit objhit;
private Ray _ray;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
_ray = mainCrma.ScreenPointToRay(Input.mousePosition);//从摄像机发出一条射线,到点击的坐标
Debug.DrawLine(_ray.origin, objhit.point, Color.red, Mathf.Infinity);//显示一条射线,只有在scene视图中才能看到
if (Physics.Raycast(_ray, out objhit, Mathf.Infinity, 1 << LayerMask.NameToLayer("floor")))
{
GameObject gameObj = objhit.collider.gameObject;
Vertexes.Add(objhit.point);
UVtexes.Add(new Vector2(objhit.point.x, objhit.point.z));
nowVertex = objhit.point;
// Debug.Log("Hit objname:" + gameObj.name +" Hit objlayer:" + objhit.point +" Hit objlayer:" + gameObj.layer);
if (Vertexes.ToArray().Length - 2 >= 1)
{
RefreshMesh();
}
}
}
}
public void RefreshMesh()
{
GameObject obj = new GameObject("mesh");
MeshFilter mf = obj.AddComponent<MeshFilter>();
MeshRenderer mr = obj.AddComponent<MeshRenderer>();
得到三角形的数量
// trianglesCount = Vertexes.ToArray().Length - 2;
//if (trianglesCount>=1)
//{
// // Debug.Log(trianglesCount);
// //三角形顶点ID数组
// int[] triangles = new int[trianglesCount * 3];
// Mesh _mesh = new Mesh();
// //绘制三角形
// _mesh.vertices = Vertexes.ToArray();
// //三角形顶点索引,确保按照顺时针方向设置三角形顶点
// for (int i = 0; i < trianglesCount; i++)
// {
// for (int j = 0; j < 3; ++j)
// {
// triangles[i * 3 + j] = j == 0 ? 0 : i + j;
// }
// }
// _mesh.uv = UVtexes.ToArray();
// _mesh.triangles = triangles;
// mf.mesh = _mesh;
//}
//得到三角形的数量
trianglesCount = Vertexes.ToArray().Length - 2;
if (trianglesCount >= 1)
{
// Debug.Log(trianglesCount);
//三角形顶点ID数组
int[] triangles = new int[trianglesCount * 3];
Mesh _mesh = new Mesh();
//绘制三角形
_mesh.vertices = Vertexes.ToArray();
if (trianglesCount>=1)
{
Vector3 temp1 = Vertexes[Vertexes.ToArray().Length - 2] - Vertexes[0];
Vector3 temp2 = Vertexes[Vertexes.ToArray().Length - 1] - Vertexes[0];
float c = Vector3.Dot(temp1.normalized, temp2.normalized);
float angle = Mathf.Acos(Vector3.Dot(temp1.normalized, temp2.normalized)) * Mathf.Rad2Deg;
Vector3 cross = Vector3.Cross(temp1.normalized, temp2.normalized);
float angle2 = Mathf.Asin(Vector3.Distance(Vector3.zero, cross)) * Mathf.Rad2Deg;
if (cross.y > 0 )
{
forward = true;
backward = false;
}
if (cross.y < 0)
{
forward = false;
backward = true;
}
if (forward)
{
if (!isAlreadybackward)
{
for (int i = 0; i < trianglesCount; i++)
{
for (int j = 0; j < 3; ++j)
{
triangles[i * 3 + j] = j == 0 ? 0 : i + j;
}
}
}
else
{
int maxNum = Vertexes.ToArray().Length - 1;
int deltaValue = maxNum -tempVertexList.Count;
int deltaStart = maxNum - tempVertexList.Count - 1;
for (int i = 0; i < tempVertexList.Count; i++)
{
for (int j = 0; j < 3; ++j)
{
if (j<2)
{
triangles[deltaValue + j + i] = deltaStart + j + i;
}
else
{
triangles[deltaValue + j + i] = maxNum;
}
Debug.Log("point " + (deltaValue + j + i).ToString());
Debug.Log("value "+triangles[deltaValue + j + i]);
}
}
isAlreadybackward = false;
}
}
if (backward)
{
tempVertexList.Add(Vertexes.ToArray().Length - 1);
isAlreadybackward = true;
int tempStart = Vertexes.ToArray().Length-1 - tempVertexList.Count;
foreach (var index in tempVertexList)
{
Debug.Log("aaaaa " + index);
}
}
}
_mesh.uv = UVtexes.ToArray();
_mesh.triangles = triangles;
mf.mesh = _mesh;
}
obj.GetComponent<MeshRenderer>().material = Resources.Load<Material>("Material/CubeMat");
//关闭渲染
obj.GetComponent<MeshRenderer>().enabled = false;
obj.AddComponent<DebugMeshInfo>();
}
}
感觉写的还是有点问题的。。。很早之前的Demo翻出来看看