Unity之线性渲染器

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012614432/article/details/49339819

      最近再做一个光线类的小游戏,时间不太够写算法的,但是不能断对算法的研究,周六日补吧~

今天说说写光线的时候遇到的一个问题,在使用LineRender组件的时候,一旦在顶点数组中多加一个点从而增加一条线段的时候会发生光线头粗尾细的情况,效果很差,从网上找的资料貌似是绘制三角面片的问题,具体原因我也不太清楚,于是我打算用一堆LineRender对多个线段进行渲染,所以自己封装了一个LineRenderGroup类,接口不一定很完善,主要为项目提供接口的,如果大家有不同的需要可以自己加,至于以前使用一个渲染器出问题的图片我懒得贴了,懒人创造世界嘛~

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
/// <summary>
/// 线性渲染器组类
/// 用来绘制多条线段,避免了一个渲染器发生的头粗尾短的现象
/// </summary>
public class LineRenderGroup : MonoBehaviour {
	private Transform _transform;
	private int size = 0;											//允许存在的线段的数量
	private List <LineRenderer> segmentList; 					//线段存放的集合
	private const string objectName = "Segment";
	private Material lightMaterial;
	private float thickness = Gloabal.lineWidth;

	public float Thickness {
		get {
			return thickness;
		}
		set {
			thickness = value;
			SetSegmentThickness ();
		}
	}

	void Awake () {
		_transform = transform;
		segmentList = new List<LineRenderer> ();
		lightMaterial = Resources.Load ("LightShader", typeof (Material)) as Material;
	}

	//设置线段顶点的方法
	public void SetSegment (int index, Segment segment) {
		segmentList [index].SetPosition (0, segment.startPoint);
		segmentList [index].SetPosition (1, segment.endPoint);
	}
	//设置整体线段粗细的方法
	public void SetSegmentThickness () {
		for (int i = 0; i < segmentList.Count; i++) {
			segmentList [i].SetWidth (thickness, thickness);
		}
	}
	//设置光线颜色(该方法未实现)!!
	public void SetLightColor (Color c) {
		for (int i = 0; i < segmentList.Count; i++) {
			segmentList [i].material.color = c;
		}
	}
	//设置允许存在的顶点的数量
	public void SetSegmentCount (int count) {
		this.size = count;
		if (size > segmentList.Count) {
			AddSegment (size - segmentList.Count);
		}
		if (size < segmentList.Count) {
			RemoveSegment (segmentList.Count - size);
		}
	}
	//添加线段的方法
	private void AddSegment (int addCount) {
		for (int i = 0; i < addCount; i++) {
			GameObject g = new GameObject (objectName);
			g.transform.SetParent (_transform);
			LineRenderer lineRender = g.AddComponent <LineRenderer> ();
			lineRender.SetWidth (thickness, thickness);
			lineRender.SetVertexCount (2);
			lineRender.SetPosition (0, Vector3.zero);
			lineRender.SetPosition (1, Vector3.zero);
			lineRender.material = lightMaterial;
			segmentList.Add (lineRender);
		}
	}
	//移除线段的方法(采用将线段两个端点设置为同一点的方法,也可以使用对象池回收多余的LineRender)
	private void RemoveSegment (int increaseCount) {
		int length = segmentList.Count;
		for (int i = 0; i < increaseCount; i++) {
			segmentList [length - i - 1].SetPosition (0, Vector3.zero);
			segmentList [length - i - 1].SetPosition (1, Vector3.zero);
		}
	}
}
修改颜色的方法的bug解决了,和代码无关,我选择的shader的问题~

效果图:

展开阅读全文

没有更多推荐了,返回首页