182 lines
5.2 KiB
C#
182 lines
5.2 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Threading.Tasks;
|
|
using UnityEngine;
|
|
using UnityEngine.AddressableAssets;
|
|
using UnityEngine.ResourceManagement.AsyncOperations;
|
|
|
|
public class MonsterMoveLine
|
|
{
|
|
public static Dictionary<string, BezierCurveData> dic_BezierCurveDatas=new Dictionary<string, BezierCurveData>();
|
|
public static List<BezierCurveData> curves = new List<BezierCurveData>();
|
|
public class BezierCurveData
|
|
{
|
|
public string name;
|
|
public Vector2 start;
|
|
public List<Vector2> controlPoints = new List<Vector2>();
|
|
public Vector2 end;
|
|
}
|
|
|
|
public static async void LoadBezier()
|
|
{
|
|
await LoadBezierTxtAsync("MoveLine");
|
|
}
|
|
/// <summary>
|
|
/// 读取曲线数据 读取单个
|
|
/// </summary>
|
|
/// <param name="path"></param>
|
|
/// <returns></returns>
|
|
public static async Task LoadSingleBezierTxtAsync(string path)
|
|
{
|
|
AsyncOperationHandle<TextAsset> handle = Addressables.LoadAssetAsync<TextAsset>(path);
|
|
await handle.Task;
|
|
var lines = handle.Result.text.Split('\n');
|
|
|
|
|
|
foreach (var line in lines)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(line)) continue;
|
|
|
|
var parts = line.Split(';');
|
|
BezierCurveData curve = new BezierCurveData();
|
|
|
|
// 第一个是曲线名
|
|
curve.name = parts[0];
|
|
|
|
// 后面所有都是点
|
|
List<Vector2> points = new List<Vector2>();
|
|
for (int i = 1; i < parts.Length; i++)
|
|
{
|
|
points.Add(ParseVector(parts[i]));
|
|
}
|
|
|
|
// 第一个点是 start
|
|
curve.start = points[0];
|
|
if (points.Count > 1)
|
|
{
|
|
// 最后一个点是 end
|
|
curve.end = points[points.Count - 1];
|
|
}
|
|
|
|
|
|
// 中间的都是 controlPoints
|
|
for (int i = 1; i < points.Count - 1; i++)
|
|
{
|
|
curve.controlPoints.Add(points[i]);
|
|
}
|
|
|
|
curves.Add(curve);
|
|
dic_BezierCurveDatas.Add(curve.name, curve);
|
|
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 读取曲线数据 游戏开始时在awake调用aa包
|
|
/// </summary>
|
|
/// <param name="path"></param>
|
|
/// <returns></returns>
|
|
public static async Task LoadBezierTxtAsync(string path)
|
|
{
|
|
AsyncOperationHandle<IList<TextAsset>> handles = Addressables.LoadAssetsAsync<TextAsset>(path,null);
|
|
await handles.Task;
|
|
foreach (var text in handles.Result)
|
|
{
|
|
var lines = text.text.Split('\n');
|
|
|
|
|
|
foreach (var line in lines)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(line)) continue;
|
|
|
|
var parts = line.Split(';');
|
|
BezierCurveData curve = new BezierCurveData();
|
|
|
|
// 第一个是曲线名
|
|
curve.name = parts[0];
|
|
|
|
// 后面所有都是点
|
|
List<Vector2> points = new List<Vector2>();
|
|
for (int i = 1; i < parts.Length; i++)
|
|
{
|
|
points.Add(ParseVector(parts[i]));
|
|
}
|
|
|
|
// 第一个点是 start
|
|
curve.start = points[0];
|
|
if (points.Count > 1)
|
|
{
|
|
// 最后一个点是 end
|
|
curve.end = points[points.Count - 1];
|
|
}
|
|
|
|
|
|
// 中间的都是 controlPoints
|
|
for (int i = 1; i < points.Count - 1; i++)
|
|
{
|
|
curve.controlPoints.Add(points[i]);
|
|
}
|
|
|
|
curves.Add(curve);
|
|
dic_BezierCurveDatas.Add(curve.name, curve);
|
|
|
|
}
|
|
}
|
|
|
|
Debug.Log("曲线读取完成共" + dic_BezierCurveDatas.Count + "条");
|
|
|
|
}
|
|
|
|
private static Vector2 ParseVector(string s)
|
|
{
|
|
var xy = s.Split(',');
|
|
return new Vector2(float.Parse(xy[0]), float.Parse(xy[1]));
|
|
}
|
|
|
|
|
|
public BezierCurveData bezierCurveData;
|
|
public float moveTime;
|
|
public float moveSpeed;
|
|
|
|
public void Init(BezierCurveData bezierCurveData, float Time)
|
|
{
|
|
this.bezierCurveData = bezierCurveData;
|
|
this.moveTime = Time;
|
|
Debug.Log($"初始化曲线 {this.bezierCurveData.name} ,移动时间 {moveTime}");
|
|
}
|
|
/// <summary>
|
|
/// 获取曲线上的点
|
|
/// </summary>
|
|
/// <param name="t"></param>
|
|
/// <returns></returns>
|
|
public Vector2 GetBezierPoint(float t)
|
|
{
|
|
t = t / moveTime;
|
|
BezierCurveData curve=bezierCurveData;
|
|
List<Vector2> points = new List<Vector2>();
|
|
points.Add(curve.start);
|
|
points.AddRange(curve.controlPoints);
|
|
points.Add(curve.end);
|
|
|
|
return DeCasteljau(points, t%1);
|
|
}
|
|
|
|
|
|
private Vector2 DeCasteljau(List<Vector2> points, float t)
|
|
{
|
|
while (points.Count > 1)
|
|
{
|
|
List<Vector2> next = new List<Vector2>();
|
|
for (int i = 0; i < points.Count - 1; i++)
|
|
{
|
|
next.Add(Vector2.Lerp(points[i], points[i + 1], t));
|
|
}
|
|
points = next;
|
|
}
|
|
return CoordinateTransformation.CanvasToWorld( points[0],UIManager.Instance.uiRoot.GetComponent<RectTransform>(),Camera.main);
|
|
}
|
|
|
|
|
|
|
|
}
|