2017-12-31 253 views
0

私のシーンのいくつかの球に適用されるスクリプトがあります。私は、画面上で個々の球を動かすことができるようにしたいと思います。私の最初の問題は、どの球に触れてドラッグしても、すべての球が一緒に動く(同じプレハブの一部ですが、他の球の子ではありません)ということです。第2の問題は、画面のどこでもタッチしてドラッグすると、球体の1つに触れるときに反応するのではなく、球体が反応することです。タッチしてドラッグすると単一のオブジェクトが移動する

Touch touch = Input.GetTouch(0); 
    for (int i = 0; i < Input.touchCount; i++) 
    { 
     if (touch.phase == TouchPhase.Began) 
     { 
      screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position); 
      offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(touch.position.x, touch.position.y, screenPoint.z)); 
     } 
     else if (touch.phase == TouchPhase.Moved) 
     { 
      Vector3 cursorPoint = new Vector3(touch.position.x, touch.position.y, screenPoint.z); 
      Vector3 cursorPosition = Camera.main.ScreenToWorldPoint(cursorPoint) + offset; 
      transform.position = cursorPosition; 
     } 
    } 

私が一緒に移動するすべての球の問題は、同じスクリプトがすべての球に適用され、screenpointoffestgameObject.transform.positionから派生されて、代わりに特定の球のことに起因することを感じています触れられた。私はforループの上に次のコードを入れてこれを修正しようとしましたが、これは正しいアプローチではないかもしれないと推測しています。私はこれに新しいです:)。

RaycastHit hit = new RaycastHit(); 
    Physics.Raycast(touch.position, touch.position, out hit); 
    if (hit.collider == GameObject.FindGameObjectWithTag("Sphere0")) 
    { 
     selectedObject = GameObject.FindGameObjectWithTag("Sphere0"); 
    } 

私は私のタグが適切に設定している、そしてそれは最初の球(Sphere0)のために働いていた場合、私は他の球のコードを書かれているだろう。しかし、まったく動かないようです。私のプロジェクトはARCoreプロジェクトですが、シーンのこれらの側面をコーディングする必要があるとは思えません。

ご協力いただきありがとうございます。

答えて

1

タッチと球の制御でレイキャスティングを行うには、1つのマスタースクリプトをあなたの球から分離するだけです。次に、すべての球体に同じタグ(つまり「球体」)を付けます。

void Update() 
{ 
    Touch touch = Input.GetTouch(0); 
    if (touch.phase == TouchPhase.Began) // when screen is touched... 
    { 
     RaycastHit hit; 
     if (Physics.Raycast(Camera.main.ScreenToWorldPoint(touch.position), Vector3.forward, out hit)) // ...cast a ray... 
     { 
      if (hit.collider.tag == "sphere") //...and check if ray hits a sphere 
      { 
       selectedObject = hit.collider.gameObject; 
      } 
     } 
    } 

    // add touch controls here and apply to selectedObject for movement 
} 
+0

あなたの回答と幸せな新年ありがとう!それはうまくいくはずです。私はプレハブ内にSphereMovementControllerスクリプトを保持する球を含む空のゲームオブジェクトを作成しましたが、これはあなたがここで見ることができます(コメントが長すぎます):https://pastebin.com/V9REEN4p 私の驚きには、タッチしてドラッグして球のいずれかをドラッグします。私のコードに問題があるのか​​、それが設定されていると書いたのですか? – nerk

+0

Debug.Logsをコードの別の部分に配置し、到達していない部分を確認してください。 raycastを微調整する必要があるかもしれません。私は試してみませんでした。 – ryeMoss

+0

どのようなサウンドアドバイス:)私はそうし、私のレイキャストを変更しました: 'Physics.Raycast(Camera.main.ScreenToWorldPoint(touch.position)、Camera.main.transform.forward、out hit)'。私は最後のコード行で 'transform.position = touchPosition; 'を設定していますが、それはスクリプトが各球体にあったときであることに気づいたので、これを' selectedObject.transform.position = touchPosition; 'に変更しました。球体は触れたときに動きますが、まだ問題があります。 – nerk

関連する問題