2 回答

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個贊
如果你有一個Rigidbody2D
你想跟隨另一個對象,這Rigidbody2D.MovePosition
是移動它的正確方法。
請執(zhí)行下列操作:
1 .通過將“重力比例”設(shè)置為 0 來禁用重力。
2 .將 BodyType 更改為 Kinematic。
3 .您現(xiàn)在可以Rigidbody
使用該Rigidbody2D.MovePosition
功能移動對象以跟隨另一個游戲?qū)ο?。請參閱下面的代碼。這應(yīng)該在FixedUpdate
函數(shù)中完成,Time.fixedDeltaTime
而不是Time.deltatime
。
最后,如果您仍然有生澀的運(yùn)動,請將Interpolate選項(xiàng)從None更改為 Interpolate或Extrapolate。我還建議減少下面的速度變量。
//Object to follow
public Transform target;
//Rigidbody to move
public Rigidbody2D rb2d;
public float speed = 7.0f;
//Distance to start moving
public float minDistance = 0.09f;
void FixedUpdate()
{
//Find direction
Vector3 dir = (target.transform.position - rb2d.transform.position).normalized;
//Check if we need to follow object then do so
if (Vector3.Distance(target.transform.position, rb2d.transform.position) > minDistance)
{
rb2d.MovePosition(rb2d.transform.position + dir * speed * Time.fixedDeltaTime);
}
}

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個贊
直接改變速度總是不好的做法,應(yīng)該避免。而是始終使用 AddForce。我會計(jì)算目標(biāo)和身體之間的距離,并根據(jù)該距離添加一個力。
var dif = target.transform.pos - body.transform.pos;
bodyRigid.AddForce(dif * multiplier * Time.deltatime);
該解決方案帶來的唯一問題可能是,一旦目標(biāo)關(guān)閉,身體就會在目標(biāo)周圍“搖晃”。您可以通過檢查身體是否接近目標(biāo)然后將其凍結(jié)來避免這種情況。
var dif = target.transform.pos - body.transform.pos;
if(dif.magnitude > 1) {
bodyRigid.AddForce(dif * multiplier * Time.deltatime);
} else {
bodyRigid.velocity = Vector2.zero;
}
雖然我說直接設(shè)置速度是個壞習(xí)慣,但是用它來凍結(jié)身體應(yīng)該沒問題。我不知道這是否會破壞你在游戲中使用的其他物理,因?yàn)檫@會直接凍結(jié)你的對象。您還可以更改凍結(jié)所需的距離(if 語句中的 1),只需稍微調(diào)整一下并找到適合游戲的值
- 2 回答
- 0 關(guān)注
- 694 瀏覽
添加回答
舉報