2017-06-13 6 views
0

私は2つの力フィールドI & II(ここに画像 - https://i.stack.imgur.com/yXAhQ.png)があります。彼らは両方ともMouseDown()でトグルされるbool 'repel'というスクリプトを添付しています。これらの力場は、宇宙船を引き寄せたり、宇宙船を直接撃退したりする必要があります。船の実際の動きは船からレイキャスティング右&によって行われます。これらのレイキャストは、力場の「撃退」ブールをチェックし、その後、船は離れて動かされます。すべてのgameObjectsはKinematicです。Rigidbody2Dを使った前後の動きmovePosition

力のフィールド間で船を前後に動かすことができるようにする必要があります。これは船を動かすためにtransform.Translateを使ってうまくいきました。しかし、衝突はバギーだったので、代わりにRigidbody2D.MovePositionを使うことにしました。

ここで、船はForceField Iに向かって動くことができ、ForceField IIを検出すると、船は垂直線に沿ってコースを変更します。しかし、X軸線に沿ってそれを検出すると、ForceField Iの方に移動することはできません。だから、船は今や上下に動くだけです。どのように私は船を力のフィールドの間で移動させ続けるのですか?値が渡されると、フレームの上に補間

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class shipRays_test : MonoBehaviour { 

      public float rayDistance = 100; 
      public Vector2 Xspeed; 
      public Vector2 Yspeed; 

      private polarityScript polarityright; 
      private polarityScript polaritydown; 
      private Rigidbody2D rb; 

      void Start() 
      { 
       rb = GetComponent<Rigidbody2D>(); 
      } 

      void FixedUpdate() 
      { 
       Debug.DrawRay (transform.position, Vector2.right * rayDistance, Color.red); 
       RaycastHit2D rightHit = Physics2D.Raycast (transform.position, Vector2.right, rayDistance); 

       Debug.DrawRay (transform.position, Vector2.down * rayDistance, Color.green); 
       RaycastHit2D downHit = Physics2D.Raycast (transform.position, Vector2.down, rayDistance); 

       if (rightHit.collider != null) 
       { 
        if (rightHit.collider.CompareTag ("forceField")) 
        {  
         polarityright = rightHit.collider.gameObject.GetComponent<polarityScript >(); 
         if (polarityright.repel) 
         { 
          rb.MovePosition (rb.position - Xspeed * Time.fixedDeltaTime);  
         } 
         else if (!polarityright.repel) 
         { 
          rb.MovePosition (rb.position + Xspeed * Time.fixedDeltaTime); 
         } 
        } 
       } 

       if (downHit.collider != null) 
       { 
        if (downHit.collider.CompareTag ("forceField")) 
        { 
         polaritydown= downHit.collider.gameObject.GetComponent<polarityScript >(); 
         if (polaritydown.repel) 
         { 
          rb.MovePosition (rb.position + Yspeed * Time.fixedDeltaTime); 
         } 
         else if (!polaritydown.repel) 
         { 
          rb.MovePosition (rb.position - Yspeed * Time.fixedDeltaTime); 
         } 
        } 
       } 
      } 
} 
+0

あなたが使用したいと 'rb.MovePosition()'一度だけ呼び出しオフセットを合計する必要がある場合があります。関数がしているように私には、与えられた値を格納し、現在の位置から補間するので、2回目にその値を上書きするように見えます。 – Draco18s

+0

コードの例を教えてください。私はどのように進めるべきか分かりません。オブジェクトのrb.positionをfixedUpdateの変数に格納し、それをrb.MovePositionに渡す必要がありますか? –

+0

if-statementsの前に: 'Vector3 newPos = rb.position;' ...最初のifブロックの中で: 'newPos + = Yspeed;' ... 2番目の: 'newPos + = Xspeed;' ...両方の後に: 'rb.MovePosition(newPos)' – Draco18s

答えて

0

どうやらRigidbody.MovePosition()店、変化しない時間Rigidbody.position中に以前の値を、上書きそれぞれの呼び出し -

はここで船に取り付けたコードです。これはドキュメントにはまったく記されていません(少なくとも、うまくいけませんが)。

これを修正するには、希望する新しい位置を自分で保持する変数を作成し、論理フローとして追加し、最後にMovePosition()を呼び出す必要があります。

だから、このようなものを設定する必要があると思います:

Vector3 newPos = rb.position; 
if (rightHit.collider != null) 
{ 
    //... 
     { 
      newPos -= Xspeed * Time.fixedDeltaTime;  
     } 
    //... 
} 

if (downHit.collider != null) 
{ 
    //... 
     { 
      newPos += Yspeed * Time.fixedDeltaTime;  
     } 
    //... 
} 
rb.MovePosition(newPos); 
関連する問題