](http://upload-images.jianshu.io/upload_images/3975796-0ffa152c43ce6ba6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 整個(gè)黑圈表示的就是減速范圍恋腕,而此時(shí)的速度velocity向量我們可以獲取,toTarget向量也可以獲得,我們此時(shí)要讓他有一個(gè)減速效果啥寇,那就給他一個(gè)反向的toTarget的作用力就好。上代碼
public class ArriveSecond : MonoBehaviour
{
//目標(biāo)位置
public Transform targetPosition;
//減速半徑
float distance;
//速度向量(方向洒扎,大屑稹)
public Vector3 velocity;
void Start()
{
distance = 2f;
}
void Update()
{
//物體到目標(biāo)的向量
Vector3 toTarget = targetPosition.position - transform.position;
if (Vector3.Distance(transform.position, targetPosition.position) > distance)
{
//當(dāng)物體沒(méi)有進(jìn)入減速半徑的時(shí)候,物體朝向目標(biāo)移動(dòng)
//Seek行為
Vector3 controlForce = (toTarget - velocity).normalized * velocity.magnitude;
velocity += controlForce * Time.deltaTime;
}
else if (Vector3.Distance(transform.position, targetPosition.position) < distance && Vector3.Distance(transform.position, targetPosition.position) > 0.001f)
{
//當(dāng)物體進(jìn)入到減速半徑后袍冷,給物體一個(gè)方向的toTarget的力
//當(dāng)物體里目標(biāo)越近那這個(gè)減速的力就越小
Vector3 controlForce = -toTarget.normalized * velocity.magnitude * (Vector3.Distance(transform.position, targetPosition.position) / distance);
velocity += controlForce * Time.deltaTime;
}
else
{
//當(dāng)物體到達(dá)目標(biāo)點(diǎn)后我們磷醋,讓他的速度變?yōu)?
velocity = Vector3.zero;
}
if (velocity.magnitude > 0.1f)
{
//目標(biāo)轉(zhuǎn)向
transform.forward = Vector3.Lerp(transform.forward, velocity, Time.deltaTime);
}
transform.position += velocity * Time.deltaTime;
}
}
但是這種方法有個(gè)BUG,當(dāng)物體到達(dá)目標(biāo)點(diǎn)位的時(shí)候他不會(huì)自己主動(dòng)去停止胡诗,需要我們加代碼去控制邓线,在我上邊的代碼中有寫(xiě)到
第二種方法
這種方法有點(diǎn)難理解
- 減小當(dāng)前速度,就是 -velocity
-
控制物體最終還是朝向物體移動(dòng) controForce
最后把這兩個(gè)力相加也就是controlForce-velocity就得到我們想要的那個(gè)控制速度的最終方向
public class ArrivefIRST : MonoBehaviour
{
//目標(biāo)位置
public Transform targetPosition;
//減速半徑
float distance;
//速度向量(方向乃戈,大泄犹怠)
public Vector3 velocity;
void Start()
{
distance = 2f;
}
void Update()
{
//物體到目標(biāo)的向量
Vector3 toTarget = targetPosition.position - transform.position;
//操縱力,改變物體的速度方向
Vector3 controlForce = (toTarget - velocity).normalized * velocity.magnitude;
if (Vector3.Distance(transform.position, targetPosition.position) > distance)
{
//當(dāng)物體沒(méi)有進(jìn)入減速半徑的時(shí)候症虑,物體朝向目標(biāo)移動(dòng)
//Seek行為
velocity += controlForce * Time.deltaTime;
}
else
{
//當(dāng)進(jìn)入減速半徑的時(shí)候物體開(kāi)始減速缩歪,并最終到達(dá)目標(biāo)點(diǎn)
velocity += (controlForce - velocity) * Time.deltaTime;
}
if (velocity.magnitude > 0.1f)
{
//目標(biāo)轉(zhuǎn)向
transform.forward = Vector3.Lerp(transform.forward, velocity, Time.deltaTime);
}
transform.position += velocity * Time.deltaTime;
}
}
兩種方法的對(duì)比我們可以看到,第一種只是給他一個(gè)減速的力谍憔,如果當(dāng)目標(biāo)物體過(guò)近匪蝙,就可能不能停在目標(biāo)點(diǎn)位主籍,讓他在進(jìn)入減速區(qū)域減速,而第二種我們就是讓他除了減速還給他一個(gè)向目標(biāo)點(diǎn)移動(dòng)的力逛球,兩個(gè)種力的結(jié)合讓物體可以更好的打到目標(biāo)點(diǎn)千元,所以我們經(jīng)常采取第二種方法。
下邊我們看下颤绕,這個(gè)是第二種方法
若水GIF截圖_2016年12月11日16點(diǎn)6分49秒.gif
這個(gè)是第一種方法