unity dotween拓展DOBezier 直接传递数组进来 按照贝塞尔曲线移动————小果冻

使用方法:把下边的ex脚本丢到unity里边 `

//调用方法如下 : 把想要传递的路径数组和时间当参数传递进去 如果传递其他参数的话自行拓展
Vector3[]ve3=new vector3[]{};
transform.DOBezier(ve3,0.2f);

`

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

namespace DG.Tweening 
{
    public static class EXDOBezier
    { 
       //--由小果冻拓展
        public static Tweener DOBezier(this Transform transform, Vector3[] path, float timer)
        {
			BezierPath bezierPath = new BezierPath(); 
			List<Vector3> c = new List<Vector3>();
			for (int o = 0; o < path.Length; o++)
			{
				if (path[o] != null)
				{
					Vector3 p = path[o];
					c.Add(p);
				}
			}
			bezierPath.DeletePath();
			bezierPath.CreateCurve(c); 
			return transform.DOPath(bezierPath.pathPoints.ToArray(),timer); 
		} 
		private  class BezierPath
		{
			public List<Vector3> pathPoints;
			private int segments;
			public int pointCount;

			public BezierPath()
			{
				pathPoints = new List<Vector3>();
				pointCount = 50;
			}

			public void DeletePath()
			{
				pathPoints.Clear();
			}

			Vector3 BezierPathCalculation(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t)
			{
				float tt = t * t;
				float ttt = t * tt;
				float u = 1.0f - t;
				float uu = u * u;
				float uuu = u * uu;

				Vector3 B = new Vector3();
				B = uuu * p0;
				B += 3.0f * uu * t * p1;
				B += 3.0f * u * tt * p2;
				B += ttt * p3;

				return B;
			}

			public void CreateCurve(List<Vector3> controlPoints)
			{
				segments = controlPoints.Count / 3;

				for (int s = 0; s < controlPoints.Count - 3; s += 3)
				{
					Vector3 p0 = controlPoints[s];
					Vector3 p1 = controlPoints[s + 1];
					Vector3 p2 = controlPoints[s + 2];
					Vector3 p3 = controlPoints[s + 3];

					if (s == 0)
					{
						pathPoints.Add(BezierPathCalculation(p0, p1, p2, p3, 0.0f));
					}

					for (int p = 0; p < (pointCount / segments); p++)
					{
						float t = (1.0f / (pointCount / segments)) * p;
						Vector3 point = new Vector3();
						point = BezierPathCalculation(p0, p1, p2, p3, t);
						pathPoints.Add(point);
					}
				}
			}
		} 
	}
}
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中使用贝塞尔曲线进行移动可以通过以下步骤实现: 1. 首先创建一个空物体作为起点,将其命名为“起点”,并将其放置在场景中。 2. 创建另一个空物体作为终点,将其命名为“终点”,并将其放置在场景中。 3. 创建一个贝塞尔曲线,可以通过在Hierarchy视图中单击右键,选择Create Empty创建一个空物体,然后将其重命名为“曲线”,并将其放置在场景中。接着,在Inspector视图中选择该空物体,在Add Component菜单中选择Bezier Curve 2D,添加Bezier Curve 2D组件。 4. 选中曲线,在Inspector视图中选择Bezier Curve 2D组件,设置其两个Anchor Point分别为“起点”和“终点”。 5. 创建一个需要移动的物体,将其放置在场景中,并将其位置设置为“起点”的位置。 6. 编写脚本,控制物体沿着贝塞尔曲线移动。可以使用Unity内置的Tween类库,或者自己编写移动算法。具体实现方法可以参考以下代码示例: ```csharp using System.Collections; using System.Collections.Generic; using UnityEngine; public class BezierCurveMove : MonoBehaviour { public Transform startPoint; public Transform endPoint; public Transform curve; public float speed = 5f; private float t = 0; private void Update() { t += Time.deltaTime * speed; if (t > 1) { t = 1; } transform.position = Bezier.GetPoint(startPoint.position, endPoint.position, curve.position, t); } } public static class Bezier { public static Vector3 GetPoint(Vector3 p0, Vector3 p1, Vector3 p2, float t) { t = Mathf.Clamp01(t); float oneMinusT = 1f - t; return oneMinusT * oneMinusT * p0 + 2f * oneMinusT * t * p2 + t * t * p1; } } ``` 在脚本中,我们首先定义了起点、终点和曲线的Transform组件,以及移动速度speed。然后在Update()函数中,我们使用t变量控制物体沿着贝塞尔曲线移动。在每一帧中,我们调用Bezier.GetPoint()函数计算出物体当前应该处于的位置,并将其赋值给物体的transform.position属性,从而实现移动效果。 需要注意的是,Bezier.GetPoint()函数中的p0、p1和p2分别表示曲线的起点、终点和控制点。在上面的示例代码中,我们使用了Bezier Curve 2D组件自动生成的控制点,但是如果需要更加灵活地控制曲线的形状,可以手动编辑控制点的位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值