2017-11-21 14 views
1

プールされたオブジェクトに相対力を適用することに問題があります。新しい力を追加する前にリジッドボディから以前の力を取り除く

私はすべての私の弾丸が再利用の準備ができているオブジェクトプールを持っています。弾丸は使用されていないときは無効になっています。

プレイヤーは自分の武器を撮影するとき、弾丸がobjectpoolから引っ張られ、次の弾丸で行われ、この順序で:

  • のsetActive(真)
  • transform.position = bulletSpawnPosition
  • transform.rotation =ガンの回転/バレル
  • RigidBody.AddRelativeForce(Vector3.forward倍速、ForceMode.Impulse)

これは1人のプレイヤーにのみ正しく動作します。私はオブジェクトプールから弾丸を引っ張る別のプレイヤーがいるとき、弾丸は前のプレイヤーの回転を維持するように見えるので、力は間違った方向に加えられます。

私ができることの1つは、回転の設定と相対的な力の適用との間に次のフレームを待つことですが、それは間違っています。 何か不足していますか?下のコードは少し修正されていますが、何が起こっているかを絞り込んでいます。

function Shoot() { 
    GameObject poolObject = GetObjectFromPool(); 
    poolObject.SetActive(true); 
    poolObject.transform.position = transform.position; 
    poolObject .transform.rotation = transform.rotation; 

    if (poolObject != null) 
    { 
     //add force 
     Rigidbody rBody = poolObject.GetComponent<Rigidbody>(); 
     rBody.AddRelativeForce(Vector3.forward * ProjectileSpeed.Value, ForceMode.Impulse); 
    } 
} 
+0

私はそれをして、この問題とは関係がありませんでした。弾丸が無効にされ、再使用のためにマークされたとき、velocityとangularVelocityをリセットします。コードは、リセットではなく弾丸の使用を示しています。新しいポジションとローテーションを設定することはリセット時にやりたいことではありません – Marijn

答えて

2

アイテムを再度使用する前に、常にアイテムをリセットしてください。プール内のオブジェクトの種類ごとに関数を用意して、簡単に呼び出してリセットすることができます。弾丸にはRigidbodyが添付されており、プールから取り出すときにはまだ動いていますので、velocityangularVelocityをリセットするだけで、まだ回転しています。あなたはVector3(0, 0, 0);に設定することでそれを行います。 Vector3.zeroプロパティはnew Vector3(0, 0, 0);のショートカットであり、ここで使用する必要があります。

これはそれを行う必要があります。

これは、問題が発生します:

poolObject.SetActive(true); 
poolObject.transform.position = transform.position; 
poolObject .transform.rotation = transform.rotation; 

public void resetPool(Rigidbody rg) 
{ 
    rg.velocity = Vector3.zero; 
    rg.angularVelocity = Vector3.zero; 
} 
+0

私はそれをやっています。それは実際にrelativeForceを追加するときに更新されないローテーションです。私が使っている最初の弾丸はすぐにこの問題を抱えているので、それに取り組む武器はありません。私の銃を90度回転させると、最初の弾丸が正しく弾かれません。弾丸をもう一度(回転させずに)使用すると、正しい弾丸が弾かれます。 – Marijn

+0

弾丸が無効になると、velocityとangularVelocityがリセットされ、無効になります。再度使用すると、その時に必要な位置と回転を設定します。 – Marijn

+0

ok、私はsetActiveを呼び出す必要があります。私は回転と位置を設定する前に、代わりに – Marijn

1

を私はそれが位置と回転を設定する前のsetActiveを呼び出すことと関係しています、問題を発見しましたこれは動作します:

poolObject.transform.position = transform.position; 
    poolObject .transform.rotation = transform.rotation; 
    poolObject.SetActive(true); 
関連する問題