贝塞尔曲线的原理以及具体实现方式在网上随处可见,这里不再赘述。实际上,在Unity的Editor模式下,系统已经提供了现成的接口,只需要简单的几行代码,便能实现可自由拖曳的贝塞尔曲线。
首先,创建一个Bezier.cs文件,具体代码如下:
//将代码添加至任意GameObject即可
using UnityEngine;
using System.Collections;
public class Bezier : MonoBehaviour
{
//起始于startPosition,走向于startTangent,并从endTangent来到终点endPosition
public Vector3 startPosition = Vector3.zero;
public Vector3 startTangent = Vector3.zero;
public Vector3 endPosition = Vector3.zero;
public Vector3 endTangent = Vector3.zero;
}
using UnityEngine;
using UnityEditor;
//CustomEditor即将该编辑代码附加在Bezier.cs上
//当Bezier.cs绑定物体被选中时
//该代码会运行
[CustomEditor(typeof(Bezier))]
public class BezierEditor : Editor
{
private static Bezier bezier;
//每次激活时会运行
void OnEnable()
{
//target表示目前inspector内显示物体
bezier = target as Bezier;
}
void OnSceneGUI()
{
//创建一个可自由拖曳的点
bezier.startPosition = Handles.PositionHandle(bezier.startPosition, Quaternion.identity);
//创建一个可自由拖曳的控制轴,这里可以把其当成Tangent,即切线
bezier.startTangent = Handles.FreeMoveHandle(bezier.startTangent, Quaternion.identity, 1F, Vector3.zero, Handles.SphereCap);
//这里画条线是为了更加直观表示
Handles.DrawLine(bezier.startPosition, bezier.startTangent);
bezier.endPosition = Handles.PositionHandle(bezier.endPosition, Quaternion.identity);
bezier.endTangent = Handles.FreeMoveHandle(bezier.endTangent, Quaternion.identity, 1F, Vector3.zero, Handles.SphereCap);
Handles.DrawLine(bezier.endPosition, bezier.endTangent);
Handles.DrawBezier(bezier.startPosition, bezier.endPosition, bezier.startTangent, bezier.endTangent, Color.green, null, 10F);
}
}具体结果如下图:
如此,就可以自由操作一条贝塞尔曲线啦,很方便吧。
原文:http://blog.csdn.net/mlkmx/article/details/51332063