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

原创 2017年08月30日 16:41:18

以前做端游编辑器时,制作过曲线编辑器,现在使用Unity3D编程,Unity3D为我们提供了很多组件,但是在项目开发中,我们可能只需要某个小功能,但是要把整个组件加到项目中,一旦需求变换,修改起来比较麻烦,鉴于这些原因,我们自己手动做一个曲线编辑器利用Unity3D。曲线编辑器的主要功能包括:

1.创建自定义的编辑器

2.在Scene View窗口中绘制

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

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

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

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

7.支持镜像控制点

8.支持循环样条曲线

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

效果如下所示:



线的绘制

首先我们利用脚本定义两个向量 p0和p1:

using UnityEngine;

public class Line : MonoBehaviour {

	public Vector3 p0, p1;
}
在Unity编辑器中的效果如下所示:



接下来我们开始创建曲线编辑器,代码如下所示:

using UnityEditor;
using UnityEngine;

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

这个脚本不执行任何功能,需要我们在里面添加一个函数OnSceneGUI,这个函数是Unity自带的回调函数,定义如下所示:

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

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


这样我们就能绘制一条直线了,效果如下所示:

   

我们现在看到的这条线,但是并不考虑其变换的设置, 移动,旋转和缩放。这是因为handle在世界空间中运行,而点位于线的局部空间, 我们必须明确地将这些点转换成世界空间点。这涉及到点变换:

	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);
	}




还有,除了显示线,我们还可以显示我们两点的位置handle。 为了做到这一点,我们也需要我们的转换旋转,所以我们可以正确对齐它们。

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);
	}


继续介绍,虽然我们现在得到了handle,但它们不符合Unity的旋转旋转模式,我们可以使用Tools.pivotRotation来确定当前模式并相应地设置旋转。

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);
		}

最后,现在我们可以在场景中拖动我们的点!
还有两个需要注意的问题。 首先,我们无法撤消拖动操作。 这是通过在进行任何更改之前添加对Undo.RecordObject的调用来修复的。 其次,Unity不知道发生了改变,所以不要求用户在退出时保存, 这通过调用EditorUtility.SetDirty来解决。

		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);
		}

代码下载地址:链接:http://pan.baidu.com/s/1gfrJVrl  密码:ft1o






版权声明:本文为博主原创文章,未经博主允许不得转载。

Unity 曲线编辑器说明

曲线编辑器 曲线有许多不同的用途,在 Unity 中有一些使用可编辑曲线的不同控件。文档地址:https://docs.unity3d.com/Manual/EditingCurves.html ...
  • akof1314
  • akof1314
  • 2016年06月30日 09:26
  • 5069

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

继续接着介绍曲线编辑器的制作,上篇博客介绍了关于Bezier曲线的制作,接下来给读者介绍Spine B样条曲线之作。 如果要创建复杂的曲线,我们需要连接多个曲线,这样的构造称为样条。让我们通过复制Be...
  • jxw167
  • jxw167
  • 2017年09月04日 13:56
  • 1097

Unity教程之-Unity3d游戏中自定义贝塞尔曲线编辑器

关于贝塞尔曲线曲线我们再前面的文章提到过《Unity教程之-在Unity3d中使用贝塞尔曲线》,那么本篇文章我们来深入学习下,并自定义实现贝塞尔曲线编辑器,贝塞尔曲线是最基本的曲线,一般用在计算机 图...
  • andyhebear
  • andyhebear
  • 2016年01月08日 12:00
  • 1891

Unity 贝塞尔曲线编辑器

  • 2017年08月14日 00:16
  • 68KB
  • 下载

unity3d自定义路径—曲线编辑器

  • 2010年10月25日 11:26
  • 7KB
  • 下载

unity 贝塞尔曲线的制作

通过传入Vector3[]值,返回坐标点数组 public void DrawPathHelper(Vector3[] path, Color color) { m_targetGameO...
  • qq_37240033
  • qq_37240033
  • 2017年09月12日 15:20
  • 111

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

以前做端游编辑器时,制作过曲线编辑器,现在使用Unity3D编程,Unity3D为我们提供了很多组件,但是在项目开发中,我们可能只需要某个小功能,但是要把整个组件加到项目中,一旦需求变换,修改起来比较...
  • jxw167
  • jxw167
  • 2017年08月30日 16:41
  • 2648

Unity3D教你制作Bezier和Spine曲线编辑器总结

上篇博客给读者介绍了关于曲线编辑器控制点的制作,最后给读者介绍如何使用曲线编辑器。 我们已经用样条做了一段时间了,但是还没有告诉读者如何使用它们。可以用样条做许多事情,例如,移动一个物体的路径,我们来...
  • jxw167
  • jxw167
  • 2017年09月06日 09:31
  • 565

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

在上篇博客中介绍了直线的制作,下面继续曲线的制作流程,曲线算法很多,...
  • jxw167
  • jxw167
  • 2017年08月31日 11:17
  • 670

在Editor模式下编辑贝塞尔曲线

贝塞尔曲线的原理以及具体实现方式在网上随处可见,这里不再赘述。实际上,在Unity的Editor模式下,系统已经提供了现成的接口,只需要简单的几行代码,便能实现可自由拖曳的贝塞尔曲线。 首先,创建一个...
  • mlkmx
  • mlkmx
  • 2016年05月06日 15:31
  • 1081
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3D教你制作Bezier和Spine曲线编辑器一
举报原因:
原因补充:

(最多只允许输入30个字)