# Unity3D教你制作Bezier和Spine曲线编辑器一

1.创建自定义的编辑器

2.在Scene View窗口中绘制

3.可以在Scene View窗口中编辑

4.利用数学公式创建Bezier曲线

5.可以绘制曲线的移动方向

6.通过组合曲线构建Bezier和Spine曲线

7.支持镜像控制点

8.支持循环样条曲线

9.可以在曲线放置和移动物体

# 线的绘制

using UnityEngine;

public class Line : MonoBehaviour {

public Vector3 p0, p1;
}

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(Line))]
public class LineInspector : Editor {
}

	private void OnSceneGUI () {
Line line = target as Line;

Handles.color = Color.white;
Handles.DrawLine(line.p0, line.p1);
}

	private void OnSceneGUI () {
Line line = target as Line;
Transform handleTransform = line.transform;
Vector3 p0 = handleTransform.TransformPoint(line.p0);
Vector3 p1 = handleTransform.TransformPoint(line.p1);

Handles.color = Color.white;
Handles.DrawLine(p0, p1);
}

private void OnSceneGUI () {
Line line = target as Line;
Transform handleTransform = line.transform;
Quaternion handleRotation = handleTransform.rotation;
Vector3 p0 = handleTransform.TransformPoint(line.p0);
Vector3 p1 = handleTransform.TransformPoint(line.p1);

Handles.color = Color.white;
Handles.DrawLine(p0, p1);
Handles.DoPositionHandle(p0, handleRotation);
Handles.DoPositionHandle(p1, handleRotation);
}

Quaternion handleRotation = Tools.pivotRotation == PivotRotation.Local ?
handleTransform.rotation : Quaternion.identity;

注意，由于句柄值在世界空间中，因此我们需要使用InverseTransformPoint方法将其转换回本地空间。 另外，当点改变时，我们只需要这样做， 我们可以使用EditorGUI.BeginChangeCheck和EditorGUI.EndChangeCheck。

		EditorGUI.BeginChangeCheck();
p0 = Handles.DoPositionHandle(p0, handleRotation);
if (EditorGUI.EndChangeCheck()) {
line.p0 = handleTransform.InverseTransformPoint(p0);
}
EditorGUI.BeginChangeCheck();
p1 = Handles.DoPositionHandle(p1, handleRotation);
if (EditorGUI.EndChangeCheck()) {
line.p1 = handleTransform.InverseTransformPoint(p1);
}

		EditorGUI.BeginChangeCheck();
p0 = Handles.DoPositionHandle(p0, handleRotation);
if (EditorGUI.EndChangeCheck()) {
Undo.RecordObject(line, "Move Point");
EditorUtility.SetDirty(line);
line.p0 = handleTransform.InverseTransformPoint(p0);
}
EditorGUI.BeginChangeCheck();
p1 = Handles.DoPositionHandle(p1, handleRotation);
if (EditorGUI.EndChangeCheck()) {
Undo.RecordObject(line, "Move Point");
EditorUtility.SetDirty(line);
line.p1 = handleTransform.InverseTransformPoint(p1);
}

• 本文已收录于以下专栏：

## Unity中的曲线绘制

Unity中的曲线绘制（一）——直线 直线 　　让我们从创建一条简单的直线开始。两点成线，我们需要一个起始点p0，以及终点p2； 　　现在我们可以创建一个游戏对象...

## Unity3D 场景编辑器扩展学习笔记-Handles&Event

Handles Namespace: UnityEditor Description Custom 3D GUI controls and drawing in the scene v...

## Unity之Handles绘制贝塞尔曲线-八

Unity编辑器类在Scene下绘制贝塞尔曲线 在Editor文件夹下创建脚本 HandlerTest 如下 using UnityEngine; using ...

## unity三次样条曲线的简单实现

using UnityEngine; using System.Collections; using System.Collections.Generic; public class Fly : ...

## 【图像处理】透视变换 Perspective Transformation

举报原因： 您举报文章：深度学习：神经网络中的前向传播和反向传播算法推导 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)