2016-08-27 11 views
0

私は3 Game Objectsを持っています。これらの3つのゲームオブジェクトは、の右,およびの左のボタンです。どのGameObjectがタッチされたかを検出しますか?

しかし、私は彼らのうちのどれが行動するためにクリックされたかを知りませんプレーヤー

:私は法をれるonmousedown使用することによって、ゲームの各オブジェクト ための特別のC#を作成することによってこれを行うことができますが、私は選手に取り付けられた1つのスクリプトファイル でこれを行いたいです。

enter image description here

、これはコントロールプレーヤー

enter image description here

答えて

1

注私Game Objectsの一つである:私は使用してゲームオブジェクト ごとに特別のC#を作成することによってこれを行うことができますOnmouseDownメソッドしかし、私はこれを1つのスクリプトファイル に添付してプレイヤーに追加します。

これは問題ではありません。 2つのスクリプトを相互に通信させることができます。

方法1

他のスクリプトからのクリックアクションがある場合にPlayerControllerスクリプトを通知します。

各ゲームオブジェクトにクリックを検出するようにアタッチします。あなたのPlayerControllerスクリプトにクリックされたGameObjectを送信します。

public class ClickDetector: MonoBehaviour 
{ 
    PlayerController playerController; 

    void Start() 
    { 
     playerController = GameObject.Find("GameObjectPlayerControlIsAttachedTo").GetComponent<PlayerController>(); 
    } 

    void OnMouseDown() 
    { 
     //Notify our PlayerController script that there was a click 
     playerController.OnGameObjectClicked(this.gameObject); 
    } 
} 

PlayerControllerスクリプトにこれを追加します。クリックされたGameObjectを受け取ります。 GameObject nameまたはtagと比較することができます。私はあなたがtagと行くことをお勧めします。

public class PlayerController: MonoBehaviour 
{ 
    public void OnGameObjectClicked(GameObject objClicked) 
    { 
     Debug.Log("There was a click from: "+objClicked.name); 
     if (objClicked.CompareTag("right")) 
     { 
      //Your code 
     } 
     else if (objClicked.CompareTag("left")) 
     { 
      //Your code 
     } 
     else if (objClicked.CompareTag("up")) 
     { 
      //Your code 
     } 
    } 
} 

方法2

1つのスクリプト(PlayerController)内のすべてを行います。

raycastを使用できます。どのゲームオブジェクトがクリックされたかを比較するにはtagを使用することをお勧めします。エディタから3つのタグ(rightleftup)を作成し、各ゲームオブジェクトを右にtagとします。タグを使用しない場合は、if (rayCastHit.collider.CompareTag("up"))if (rayCastHit.collider.name=="up")に置き換えることができます。

void Update() 
{ 
    //Check if Mouse Button is pressed 
    if (Input.GetMouseButtonDown(0)) 
    { 
     //Raycast from mouse cursor pos 
     RaycastHit rayCastHit; 
     Ray rayCast = Camera.main.ScreenPointToRay(Input.mousePosition); 
     if (Physics.Raycast(rayCast, out rayCastHit)) 
     { 
      if (rayCastHit.collider.CompareTag("right")) 
      { 
       //Your code 
      } 
      else if (rayCastHit.collider.CompareTag("left")) 
      { 
       //Your code 
      } 
      else if (rayCastHit.collider.CompareTag("up")) 
      { 
       //Your code 
      } 
     } 
    } 
} 

EDIT

あなたの質問、を更新した後、あなたが動作するようにレイキャストのためにあなたのゲームオブジェクトに衝突型加速器を添付する必要があります。 3つのGameObjectのそれぞれにBox Collider 2Dを添付してください。また

、これは2Dスプライト、メソッドのコードであるため、2が少し変更されます。あなたはVirtual JoyStickとあなたを必要とするよう

if (Input.GetMouseButtonDown(0)) 
{ 
    Vector2 ray = Camera.main.ScreenToWorldPoint(Input.mousePosition); 
    RaycastHit2D rayHit = Physics2D.Raycast(ray, Vector2.zero); 
    if (rayHit) 
    { 
     if (rayHit.collider.CompareTag("up")) 
     { 

     } 
    } 
} 

最後に、あなたがやっていることから、それは見えます現在それは間違っている。現在のソリューションはうまくいくはずですが、これを行う正しい方法はUIシステム(Imageコンポーネント)です。

+0

あなたの**メソッド2 **を使用しました。私は自分のゲームオブジェクト用の新しいタグを定義しています。自分のコードを私のプレーヤーに接続されたPlayerControllerスクリプトファイルの中にコピーしました。右手左をクリックしてゲームオブジェクトをクリックしても何も起こらなかった/チェックタグ用の各条件の中にDebug.Logを書き込む –

+0

そして私は**方法1 **をテストした。 –

+0

これは本当に簡単です。 **両方の方法があなたにとってうまくいかない場合、あなたは何か間違っています。クリックして検出したいGameObjectの1つを選択してください。それのスクリーンショットを投稿し、それに添付されたコンポーネントがどのように見えるかを投稿してください。 – Programmer

関連する問題