|
|
/*
|
|
|
http://www.cgsoso.com/forum-211-1.html
|
|
|
|
|
|
CG搜搜 Unity3d 每日Unity3d插件免费更新 更有VIP资源!
|
|
|
|
|
|
CGSOSO 主打游戏开发,影视设计等CG资源素材。
|
|
|
|
|
|
插件如若商用,请务必官网购买!
|
|
|
|
|
|
daily assets update for try.
|
|
|
|
|
|
U should buy the asset from home store if u use it in your project!
|
|
|
*/
|
|
|
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using UnityEngine;
|
|
|
|
|
|
[Serializable]
|
|
|
public class LTSpline
|
|
|
{
|
|
|
public static int DISTANCE_COUNT = 3;
|
|
|
|
|
|
public static int SUBLINE_COUNT = 20;
|
|
|
|
|
|
public float distance;
|
|
|
|
|
|
public bool constantSpeed = true;
|
|
|
|
|
|
public Vector3[] pts;
|
|
|
|
|
|
[NonSerialized]
|
|
|
public Vector3[] ptsAdj;
|
|
|
|
|
|
public int ptsAdjLength;
|
|
|
|
|
|
public bool orientToPath;
|
|
|
|
|
|
public bool orientToPath2d;
|
|
|
|
|
|
private int numSections;
|
|
|
|
|
|
private int currPt;
|
|
|
|
|
|
public LTSpline(Vector3[] pts)
|
|
|
{
|
|
|
init(pts, constantSpeed: true);
|
|
|
}
|
|
|
|
|
|
public LTSpline(Vector3[] pts, bool constantSpeed)
|
|
|
{
|
|
|
this.constantSpeed = constantSpeed;
|
|
|
init(pts, constantSpeed);
|
|
|
}
|
|
|
|
|
|
private void init(Vector3[] pts, bool constantSpeed)
|
|
|
{
|
|
|
if (pts.Length < 4)
|
|
|
{
|
|
|
LeanTween.logError("LeanTween - When passing values for a spline path, you must pass four or more values!");
|
|
|
return;
|
|
|
}
|
|
|
this.pts = new Vector3[pts.Length];
|
|
|
Array.Copy(pts, this.pts, pts.Length);
|
|
|
numSections = pts.Length - 3;
|
|
|
float num = float.PositiveInfinity;
|
|
|
Vector3 b = this.pts[1];
|
|
|
float num2 = 0f;
|
|
|
for (int i = 1; i < this.pts.Length - 1; i++)
|
|
|
{
|
|
|
float num3 = Vector3.Distance(this.pts[i], b);
|
|
|
if (num3 < num)
|
|
|
{
|
|
|
num = num3;
|
|
|
}
|
|
|
num2 += num3;
|
|
|
}
|
|
|
if (!constantSpeed)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
num = num2 / (float)(numSections * SUBLINE_COUNT);
|
|
|
float num4 = num / (float)SUBLINE_COUNT;
|
|
|
int num5 = (int)Mathf.Ceil(num2 / num4) * DISTANCE_COUNT;
|
|
|
if (num5 <= 1)
|
|
|
{
|
|
|
num5 = 2;
|
|
|
}
|
|
|
ptsAdj = new Vector3[num5];
|
|
|
b = interp(0f);
|
|
|
int num6 = 1;
|
|
|
ptsAdj[0] = b;
|
|
|
distance = 0f;
|
|
|
for (int j = 0; j < num5 + 1; j++)
|
|
|
{
|
|
|
float num7 = (float)j / (float)num5;
|
|
|
Vector3 vector = interp(num7);
|
|
|
float num8 = Vector3.Distance(vector, b);
|
|
|
if (num8 >= num4 || num7 >= 1f)
|
|
|
{
|
|
|
ptsAdj[num6] = vector;
|
|
|
distance += num8;
|
|
|
b = vector;
|
|
|
num6++;
|
|
|
}
|
|
|
}
|
|
|
ptsAdjLength = num6;
|
|
|
}
|
|
|
|
|
|
public Vector3 map(float u)
|
|
|
{
|
|
|
if (u >= 1f)
|
|
|
{
|
|
|
return pts[pts.Length - 2];
|
|
|
}
|
|
|
float num = u * (float)(ptsAdjLength - 1);
|
|
|
int num2 = (int)Mathf.Floor(num);
|
|
|
int num3 = (int)Mathf.Ceil(num);
|
|
|
if (num2 < 0)
|
|
|
{
|
|
|
num2 = 0;
|
|
|
}
|
|
|
Vector3 vector = ptsAdj[num2];
|
|
|
Vector3 a = ptsAdj[num3];
|
|
|
float d = num - (float)num2;
|
|
|
return vector + (a - vector) * d;
|
|
|
}
|
|
|
|
|
|
public Vector3 interp(float t)
|
|
|
{
|
|
|
currPt = Mathf.Min(Mathf.FloorToInt(t * (float)numSections), numSections - 1);
|
|
|
float num = t * (float)numSections - (float)currPt;
|
|
|
Vector3 a = pts[currPt];
|
|
|
Vector3 a2 = pts[currPt + 1];
|
|
|
Vector3 vector = pts[currPt + 2];
|
|
|
Vector3 b = pts[currPt + 3];
|
|
|
return 0.5f * ((-a + 3f * a2 - 3f * vector + b) * (num * num * num) + (2f * a - 5f * a2 + 4f * vector - b) * (num * num) + (-a + vector) * num + 2f * a2);
|
|
|
}
|
|
|
|
|
|
public float ratioAtPoint(Vector3 pt)
|
|
|
{
|
|
|
float num = float.MaxValue;
|
|
|
int num2 = 0;
|
|
|
for (int i = 0; i < ptsAdjLength; i++)
|
|
|
{
|
|
|
float num3 = Vector3.Distance(pt, ptsAdj[i]);
|
|
|
if (num3 < num)
|
|
|
{
|
|
|
num = num3;
|
|
|
num2 = i;
|
|
|
}
|
|
|
}
|
|
|
return (float)num2 / (float)(ptsAdjLength - 1);
|
|
|
}
|
|
|
|
|
|
public Vector3 point(float ratio)
|
|
|
{
|
|
|
float num = (!(ratio > 1f)) ? ratio : 1f;
|
|
|
return (!constantSpeed) ? interp(num) : map(num);
|
|
|
}
|
|
|
|
|
|
public void place2d(Transform transform, float ratio)
|
|
|
{
|
|
|
transform.position = point(ratio);
|
|
|
ratio += 0.001f;
|
|
|
if (ratio <= 1f)
|
|
|
{
|
|
|
Vector3 vector = point(ratio) - transform.position;
|
|
|
float z = Mathf.Atan2(vector.y, vector.x) * 57.29578f;
|
|
|
transform.eulerAngles = new Vector3(0f, 0f, z);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public void placeLocal2d(Transform transform, float ratio)
|
|
|
{
|
|
|
Transform parent = transform.parent;
|
|
|
if (parent == null)
|
|
|
{
|
|
|
place2d(transform, ratio);
|
|
|
return;
|
|
|
}
|
|
|
transform.localPosition = point(ratio);
|
|
|
ratio += 0.001f;
|
|
|
if (ratio <= 1f)
|
|
|
{
|
|
|
Vector3 a = point(ratio);
|
|
|
Vector3 vector = a - transform.localPosition;
|
|
|
float z = Mathf.Atan2(vector.y, vector.x) * 57.29578f;
|
|
|
transform.localEulerAngles = new Vector3(0f, 0f, z);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public void place(Transform transform, float ratio)
|
|
|
{
|
|
|
place(transform, ratio, Vector3.up);
|
|
|
}
|
|
|
|
|
|
public void place(Transform transform, float ratio, Vector3 worldUp)
|
|
|
{
|
|
|
transform.position = point(ratio);
|
|
|
ratio += 0.001f;
|
|
|
if (ratio <= 1f)
|
|
|
{
|
|
|
transform.LookAt(point(ratio), worldUp);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public void placeLocal(Transform transform, float ratio)
|
|
|
{
|
|
|
placeLocal(transform, ratio, Vector3.up);
|
|
|
}
|
|
|
|
|
|
public void placeLocal(Transform transform, float ratio, Vector3 worldUp)
|
|
|
{
|
|
|
transform.localPosition = point(ratio);
|
|
|
ratio += 0.001f;
|
|
|
if (ratio <= 1f)
|
|
|
{
|
|
|
transform.LookAt(transform.parent.TransformPoint(point(ratio)), worldUp);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public void gizmoDraw(float t = -1f)
|
|
|
{
|
|
|
if (ptsAdj != null && ptsAdj.Length > 0)
|
|
|
{
|
|
|
Vector3 from = ptsAdj[0];
|
|
|
for (int i = 0; i < ptsAdjLength; i++)
|
|
|
{
|
|
|
Vector3 vector = ptsAdj[i];
|
|
|
Gizmos.DrawLine(from, vector);
|
|
|
from = vector;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public void drawGizmo(Color color)
|
|
|
{
|
|
|
if (ptsAdjLength >= 4)
|
|
|
{
|
|
|
Vector3 from = ptsAdj[0];
|
|
|
Color color2 = Gizmos.color;
|
|
|
Gizmos.color = color;
|
|
|
for (int i = 0; i < ptsAdjLength; i++)
|
|
|
{
|
|
|
Vector3 vector = ptsAdj[i];
|
|
|
Gizmos.DrawLine(from, vector);
|
|
|
from = vector;
|
|
|
}
|
|
|
Gizmos.color = color2;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public static void drawGizmo(Transform[] arr, Color color)
|
|
|
{
|
|
|
if (arr.Length >= 4)
|
|
|
{
|
|
|
Vector3[] array = new Vector3[arr.Length];
|
|
|
for (int i = 0; i < arr.Length; i++)
|
|
|
{
|
|
|
array[i] = arr[i].position;
|
|
|
}
|
|
|
LTSpline lTSpline = new LTSpline(array);
|
|
|
Vector3 from = lTSpline.ptsAdj[0];
|
|
|
Color color2 = Gizmos.color;
|
|
|
Gizmos.color = color;
|
|
|
for (int j = 0; j < lTSpline.ptsAdjLength; j++)
|
|
|
{
|
|
|
Vector3 vector = lTSpline.ptsAdj[j];
|
|
|
Gizmos.DrawLine(from, vector);
|
|
|
from = vector;
|
|
|
}
|
|
|
Gizmos.color = color2;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public static void drawLine(Transform[] arr, float width, Color color)
|
|
|
{
|
|
|
if (arr.Length < 4)
|
|
|
{
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public void drawLinesGLLines(Material outlineMaterial, Color color, float width)
|
|
|
{
|
|
|
GL.PushMatrix();
|
|
|
outlineMaterial.SetPass(0);
|
|
|
GL.LoadPixelMatrix();
|
|
|
GL.Begin(1);
|
|
|
GL.Color(color);
|
|
|
if (constantSpeed)
|
|
|
{
|
|
|
if (ptsAdjLength >= 4)
|
|
|
{
|
|
|
Vector3 v = ptsAdj[0];
|
|
|
for (int i = 0; i < ptsAdjLength; i++)
|
|
|
{
|
|
|
Vector3 vector = ptsAdj[i];
|
|
|
GL.Vertex(v);
|
|
|
GL.Vertex(vector);
|
|
|
v = vector;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else if (pts.Length >= 4)
|
|
|
{
|
|
|
Vector3 v2 = pts[0];
|
|
|
float num = 1f / ((float)pts.Length * 10f);
|
|
|
for (float num2 = 0f; num2 < 1f; num2 += num)
|
|
|
{
|
|
|
float t = num2 / 1f;
|
|
|
Vector3 vector2 = interp(t);
|
|
|
GL.Vertex(v2);
|
|
|
GL.Vertex(vector2);
|
|
|
v2 = vector2;
|
|
|
}
|
|
|
}
|
|
|
GL.End();
|
|
|
GL.PopMatrix();
|
|
|
}
|
|
|
|
|
|
public Vector3[] generateVectors()
|
|
|
{
|
|
|
if (pts.Length >= 4)
|
|
|
{
|
|
|
List<Vector3> list = new List<Vector3>();
|
|
|
Vector3 item = pts[0];
|
|
|
list.Add(item);
|
|
|
float num = 1f / ((float)pts.Length * 10f);
|
|
|
for (float num2 = 0f; num2 < 1f; num2 += num)
|
|
|
{
|
|
|
float t = num2 / 1f;
|
|
|
Vector3 item2 = interp(t);
|
|
|
list.Add(item2);
|
|
|
}
|
|
|
list.ToArray();
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
}
|