首先是任意画线,添加了一个选择颜色和大小的功能,脚本挂在摄像机上在,UI是三个Toggle和一个Slider,先看效果:
下面的代码:
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class DrawLine : MonoBehaviour
{
private LineRenderer line;
private int linePoint;
private int lineIndex;
private Vector3 mousePos;
public Material mat;
public Slider slider;//画线的粗细
private Color color;//画线的颜色
private void Start()
{
color = Color.red;
}
void Update()
{
if (Input.GetMouseButtonDown(0) && !EventSystem.current.IsPointerOverGameObject())//鼠标按下一次并且不是在UI上
{
InitLine();
}
if (Input.GetMouseButton(0) && line != null && !EventSystem.current.IsPointerOverGameObject())//鼠标按下不松并且不是在UI上
{
Drawing();
}
}
/// <summary>
/// 创建一个LineRendere,并且设置它的属性
/// </summary>
public void InitLine()
{
GameObject go = new GameObject();
go.name = "LineRenderer";
line = go.AddComponent<LineRenderer>();
line.material.color = color;
line.startWidth = slider.value;
line.endWidth = slider.value;
linePoint = 0;
lineIndex = 0;
}
/// <summary>
/// 开始画线
/// </summary>
public void Drawing()
{
//获取鼠标位置,给一个深度使摄像机能够看到
mousePos = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.transform.forward.magnitude * 1));
linePoint++;
line.positionCount = linePoint;//连接LineRenderer的位置个数
if (lineIndex < linePoint)
{
lineIndex++;
line.SetPosition(lineIndex - 1, mousePos);
}
}
/// <summary>
/// 红色Toggle调用
/// </summary>
public void ChooseRedColor()
{
color = Color.red;
}
/// <summary>
/// 黄色Toggle调用
/// </summary>
public void ChooseYellowColor()
{
color = Color.yellow;
}
/// <summary>
/// 蓝色Toggle调用
/// </summary>
public void ChooseBlueColor()
{
color = Color.blue;
}
}
这里是使用的鼠标位置划线,想在哪里画就用哪个的坐标就可以了,另外设置一下Slider的最大和最小:
-------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------
下面是使用LineRenderer画一个圆圈,主要使用的是四元数的右乘:
上面的一个是一次生成,大小变动是我在手动调节半径,下面的是慢慢生成。代码:
using UnityEngine;
public class LineCircle : MonoBehaviour
{
public LineRenderer line;
public int LineCount;//需要多少个位置点
public float Radius;//园的半径
private float Angle;//从中心点出发,和两个点之间的夹角
private Quaternion q;
private float timer;//计时器
private int index = -1;//起始点
public float IntervalTime;//画一个点的间隔时间
private void Start()
{
line.positionCount = LineCount + 1;
Angle = 360 / LineCount;
}
private void Update()
{
//DrawCircle();
SlowDrawCircle();
}
/// <summary>
/// 一次生成
/// </summary>
public void DrawCircle()
{
for (int i = 0; i <= LineCount; i++)
{
q = Quaternion.Euler(q.eulerAngles.x, q.eulerAngles.y, q.eulerAngles.z + Angle);//
Vector3 linePoint = transform.position + q * Vector3.up * Radius;
line.SetPosition(i, linePoint);
}
}
/// <summary>
/// 时间间隔生成
/// </summary>
public void SlowDrawCircle()
{
timer += Time.deltaTime;
if (timer > IntervalTime)
{
if (index < LineCount)
{
index += 1;
q = Quaternion.Euler(q.eulerAngles.x, q.eulerAngles.y, q.eulerAngles.z + Angle);//表示Z轴旋转Angle度
Vector3 linePoint = transform.position + q * Vector3.up * Radius;//q * Vector3.up表示把Vector3.up旋转q度。获取一个旋转后的向量
/*旋转自身,通过自身的方向获取坐标
transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z + Angle);
//Vector3 linePoint = transform.position + transform.up * Radius;
*/
line.SetPosition(index, linePoint);
timer = 0;
}
}
}
}
下一篇会通过四元数右乘制作一个敌人检测玩家的功能, 顺带熟悉一下行为树的简单使用。
欢迎加群:4364930讨论交流