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

原创 2017年09月06日 09:31:18

上篇博客给读者介绍了关于曲线编辑器控制点的制作,最后给读者介绍如何使用曲线编辑器。

我们已经用样条做了一段时间了,但是还没有告诉读者如何使用它们。可以用样条做许多事情,例如,移动一个物体的路径,我们来创建一个SplineWalker组件。

using UnityEngine;

public class SplineWalker : MonoBehaviour {

	public BezierSpline spline;

	public float duration;

	private float progress;

	private void Update () {
		progress += Time.deltaTime / duration;
		if (progress > 1f) {
			progress = 1f;
		}
		transform.localPosition = spline.GetPoint(progress);
	}
}

 现在我们可以创建一个walker对象,分配我们的样条,设置一个持续时间,然后在我们进入播放模式后看它移动。在这里只是用了一个立方体,你可以看到它的方向。



现在它还没有朝向,我们可以为它添加一个选项。

public bool lookForward;

	private void Update () {
		progress += Time.deltaTime / duration;
		if (progress > 1f) {
			progress = 1f;
		}
		Vector3 position = spline.GetPoint(progress);
		transform.localPosition = position;
		if (lookForward) {
			transform.LookAt(position + spline.GetDirection(progress));
		}
	}



这是一种方法,另一种方法是继续循环,而不是只走一次,当我们在它的时候,我们也可以让立方体来回移动,让我们创建一个枚举来在这些模式之间选择。

public enum SplineWalkerMode {
	Once,
	Loop,
	PingPong
}

现在SplineWalker必须记住它是向前还是向后,它还需要根据其模式在传递样条末端时调整进度。

public SplineWalkerMode mode;

	private bool goingForward = true;

	private void Update () {
		if (goingForward) {
			progress += Time.deltaTime / duration;
			if (progress > 1f) {
				if (mode == SplineWalkerMode.Once) {
					progress = 1f;
				}
				else if (mode == SplineWalkerMode.Loop) {
					progress -= 1f;
				}
				else {
					progress = 2f - progress;
					goingForward = false;
				}
			}
		}
		else {
			progress -= Time.deltaTime / duration;
			if (progress < 0f) {
				progress = -progress;
				goingForward = true;
			}
		}

		Vector3 position = spline.GetPoint(progress);
		transform.localPosition = position;
		if (lookForward) {
			transform.LookAt(position + spline.GetDirection(progress));
		}
	}


我们还可以做的另一件事是创建一个装饰器,它会在样条上实例化一个项目序列,我们也给它一个前瞻性的选项,它适用于它产生的项目。这个项目序列有一定的频率,允许重复。当然,如果频率是零或者没有物体,我们什么都不做。我们需要一些物体,因此也要创建一些prefabs。

using UnityEngine;

public class SplineDecorator : MonoBehaviour {

	public BezierSpline spline;

	public int frequency;

	public bool lookForward;

	public Transform[] items;

	private void Awake () {
		if (frequency <= 0 || items == null || items.Length == 0) {
			return;
		}
		float stepSize = 1f / (frequency * items.Length);
		for (int p = 0, f = 0; f < frequency; f++) {
			for (int i = 0; i < items.Length; i++, p++) {
				Transform item = Instantiate(items[i]) as Transform;
				Vector3 position = spline.GetPoint(p * stepSize);
				item.transform.localPosition = position;
				if (lookForward) {
					item.transform.LookAt(position + spline.GetDirection(p * stepSize));
				}
				item.transform.parent = transform;
			}
		}
	}
}




这对于使用循环很有效,但它不会一直到没有循环的样条的末尾。我们可以通过增加我们的步长来解决这个问题,只要它不是一个循环,而且我们有不止一个项。

		if (frequency <= 0 || items == null || items.Length == 0) {
			return;
		}
		float stepSize = frequency * items.Length;
		if (spline.Loop || stepSize == 1) {
			stepSize = 1f / stepSize;
		}
		else {
			stepSize = 1f / (stepSize - 1);
		}

最后,其实还有很多方法可以使用splines,而且还有更多的特性可以添加到splines本身。比如移除曲线,或者将一条曲线分成两个较小的曲线,或者将两条曲线合并在一起。


  代码下载地址:链接:http://pan.baidu.com/s/1gfrJVrl  密码:ft1o 中的名字为curves-and-splines-finished的包。



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

Unity 曲线编辑器说明

曲线编辑器 曲线有许多不同的用途,在 Unity 中有一些使用可编辑曲线的不同控件。文档地址:https://docs.unity3d.com/Manual/EditingCurves.html ...

Unity 曲线编辑扩展菜单功能

曲线编辑扩展菜单功能,原因默认的 AnimationCurve 字段曲线编辑,不支持复制粘贴到另一个 AnimationCurve 字段,亦不支持关键帧的清空。所以扩展 AnimationCurve ...

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

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

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

贝塞尔曲线的原理以及具体实现方式在网上随处可见,这里不再赘述。实际上,在Unity的Editor模式下,系统已经提供了现成的接口,只需要简单的几行代码,便能实现可自由拖曳的贝塞尔曲线。 首先,创建一个...
  • mlkmx
  • mlkmx
  • 2016年05月06日 15:31
  • 1020

两个牛叉哄哄的Unity3d Shader编辑器

【AssetStore经验分享】今天遭吓到了。。   楼主# 更多发布于:2013-02-27 22:31 自己做的插件Xffect Editor Pro ...
  • ldghd
  • ldghd
  • 2013年07月12日 18:55
  • 5971

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

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

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

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Unity3d 曲线Curvy插件的学习使用

第一次写博客  咳咳 有点紧张,马上要下班了就言简意赅的描述下今天的工作内容吧。 管线流动的效果的实现,Curvy的使用: 各种水的管道,希望能有一种方法表明水流的方向,于是打算通过Curvy来来...

Unity C#教程—绘制三维曲线和样条,制作路径

参考链接 : http://catlikecoding.com/unity/tutorials/curves-and-splines/ demo下载链接 : https://github.com/...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3D教你制作Bezier和Spine曲线编辑器总结
举报原因:
原因补充:

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