private Dictionary<Transform, BezierTask> m_BezierTask = new Dictionary<Transform, BezierTask>();
private bool m_bProcess = true;
public void ClearAllTask()
{
m_BezierTask.Clear();
}
void Update()
{
if (m_bProcess)
{
MainProcess();
}
}
public void RemoveBezierTask(Transform tran)
{
if (m_BezierTask.ContainsKey(tran))
{
m_BezierTask.Remove(tran);
}
}
private void MainProcess()
{
float fTime = Time.deltaTime; //这次使用的时间
Transform tran = null;
BezierTask task;
for (int i = 0; i < m_BezierTask.Count; ++i)
{
tran = m_BezierTask.ElementAt(i).Key;
task = m_BezierTask.ElementAt(i).Value;
task.fUsedTime = task.fUsedTime + fTime;
if (task.fUsedTime >= task.fTotalTime) //已经到达目的地
{
tran.position = task.DestVec;
m_BezierTask.Remove(tran);
}
else
{
float fRela = task.fUsedTime / task.fTotalTime;
Vector3 DestVec = GetBezierPos(fRela, task.SourVec, task.DestVec, task.Ctrl0Vec, task.Ctrl1Vec);
tran.position = DestVec;
m_BezierTask[tran] = task;
}
}
}
private Vector3 GetBezierPos(float fRela, Vector3 Point0Vec, Vector3 Point1Vec, Vector3 Ctrl0Vec, Vector3 Ctrl1Vec)
{
float fTemp0 = fRela * fRela;
float fTemp1 = (1 - fRela) * (1 - fRela);
float fX = Point0Vec.x * fTemp1 * (1 - fRela) + 3 * Ctrl0Vec.x * fRela * fTemp1 + 3 * Ctrl1Vec.x * fTemp0 * (1 - fRela) + Point1Vec.x * fTemp0 * fRela;
float fY = Point0Vec.y * fTemp1 * (1 - fRela) + 3 * Ctrl0Vec.y * fRela * fTemp1 + 3 * Ctrl1Vec.y * fTemp0 * (1 - fRela) + Point1Vec.y * fTemp0 * fRela;
float fZ = Point0Vec.z * fTemp1 * (1 - fRela) + 3 * Ctrl0Vec.z * fRela * fTemp1 + 3 * Ctrl1Vec.z * fTemp0 * (1 - fRela) + Point1Vec.z * fTemp0 * fRela;
return new Vector3(fX, fY, fZ);
}
public void AddToBezier(Transform tran, Vector3 SourVec, Vector3 DestVec, float fTotalTime)
{
BezierTask temp = new BezierTask();
Vector3 BaseCtrl0Vec = Vector3.Lerp(SourVec, DestVec, 0.25f);
Vector3 BaseCtrl1Vec = Vector3.Lerp(SourVec, DestVec, 0.75f);
GetMCtrl(BaseCtrl0Vec, BaseCtrl1Vec, ref temp.Ctrl0Vec, ref temp.Ctrl1Vec);
temp.SourVec = SourVec;
temp.DestVec = DestVec;
temp.fTotalTime = fTotalTime;
temp.fUsedTime = 0;
tran.position = SourVec;
m_BezierTask[tran] = temp;
}
private void GetMCtrl(Vector3 BaseCtrl0Vec, Vector3 BaseCtrl1Vec, ref Vector3 Ctrl0Vec, ref Vector3 Ctrl1Vec)
{
float fRandom_x = Random.Range(-100, 101);
float fRandom_y = Random.Range(-100, 101);
Ctrl0Vec = BaseCtrl0Vec + new Vector3(fRandom_x, fRandom_x, 0);
Ctrl1Vec = BaseCtrl1Vec + new Vector3(fRandom_y, fRandom_y, 0);
private bool m_bProcess = true;
public void ClearAllTask()
{
m_BezierTask.Clear();
}
void Update()
{
if (m_bProcess)
{
MainProcess();
}
}
public void RemoveBezierTask(Transform tran)
{
if (m_BezierTask.ContainsKey(tran))
{
m_BezierTask.Remove(tran);
}
}
private void MainProcess()
{
float fTime = Time.deltaTime; //这次使用的时间
Transform tran = null;
BezierTask task;
for (int i = 0; i < m_BezierTask.Count; ++i)
{
tran = m_BezierTask.ElementAt(i).Key;
task = m_BezierTask.ElementAt(i).Value;
task.fUsedTime = task.fUsedTime + fTime;
if (task.fUsedTime >= task.fTotalTime) //已经到达目的地
{
tran.position = task.DestVec;
m_BezierTask.Remove(tran);
}
else
{
float fRela = task.fUsedTime / task.fTotalTime;
Vector3 DestVec = GetBezierPos(fRela, task.SourVec, task.DestVec, task.Ctrl0Vec, task.Ctrl1Vec);
tran.position = DestVec;
m_BezierTask[tran] = task;
}
}
}
private Vector3 GetBezierPos(float fRela, Vector3 Point0Vec, Vector3 Point1Vec, Vector3 Ctrl0Vec, Vector3 Ctrl1Vec)
{
float fTemp0 = fRela * fRela;
float fTemp1 = (1 - fRela) * (1 - fRela);
float fX = Point0Vec.x * fTemp1 * (1 - fRela) + 3 * Ctrl0Vec.x * fRela * fTemp1 + 3 * Ctrl1Vec.x * fTemp0 * (1 - fRela) + Point1Vec.x * fTemp0 * fRela;
float fY = Point0Vec.y * fTemp1 * (1 - fRela) + 3 * Ctrl0Vec.y * fRela * fTemp1 + 3 * Ctrl1Vec.y * fTemp0 * (1 - fRela) + Point1Vec.y * fTemp0 * fRela;
float fZ = Point0Vec.z * fTemp1 * (1 - fRela) + 3 * Ctrl0Vec.z * fRela * fTemp1 + 3 * Ctrl1Vec.z * fTemp0 * (1 - fRela) + Point1Vec.z * fTemp0 * fRela;
return new Vector3(fX, fY, fZ);
}
public void AddToBezier(Transform tran, Vector3 SourVec, Vector3 DestVec, float fTotalTime)
{
BezierTask temp = new BezierTask();
Vector3 BaseCtrl0Vec = Vector3.Lerp(SourVec, DestVec, 0.25f);
Vector3 BaseCtrl1Vec = Vector3.Lerp(SourVec, DestVec, 0.75f);
GetMCtrl(BaseCtrl0Vec, BaseCtrl1Vec, ref temp.Ctrl0Vec, ref temp.Ctrl1Vec);
temp.SourVec = SourVec;
temp.DestVec = DestVec;
temp.fTotalTime = fTotalTime;
temp.fUsedTime = 0;
tran.position = SourVec;
m_BezierTask[tran] = temp;
}
private void GetMCtrl(Vector3 BaseCtrl0Vec, Vector3 BaseCtrl1Vec, ref Vector3 Ctrl0Vec, ref Vector3 Ctrl1Vec)
{
float fRandom_x = Random.Range(-100, 101);
float fRandom_y = Random.Range(-100, 101);
Ctrl0Vec = BaseCtrl0Vec + new Vector3(fRandom_x, fRandom_x, 0);
Ctrl1Vec = BaseCtrl1Vec + new Vector3(fRandom_y, fRandom_y, 0);
}
少些了一点东西上回。不然你们看不懂可能。
用的时候用AddToBezier这个共有方法。就可以了。然后GetMCtrl这个方法是1/4、3/4点的偏移距离。