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






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

相关文章推荐

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

在上篇博客中介绍了直线的制作,下面继续曲线的制作流程,曲线算法很多,

Unity中的曲线绘制

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

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

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

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

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

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 : ...

【Google内推】2016校园招聘

很久没有写文章了,收到了好多邮件也没有回,真是惭愧。博主正式从P大毕业了,现在在谷歌北京工作。有意向过来工作的同学欢迎找我内推~--------------------我是正文分割线---------...

Redis超级新手指南-下篇(哪吒篇)

可用高性能分布式缓存解决方案(Rdeis) 1.简述     本文将从以下几个方面详细讲解redis,看过上篇(福禄篇)的可以直接跳过简介,这里只是保证文章的可读性. (在word上写完才拷贝过...

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

透视变换(Perspective Transformation)是将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。通用的变换公式为:u...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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