2016-07-05 4 views
1

スクリプトでGameObjectをInput.GetMouseButtonUp(0)に移動させます。残念ながら、UI Buttonをクリックすると、移動機能が起動され、ゲームオブジェクトが移動します。マウスの左クリックを検出する方法ですが、UI上でクリックが発生していない場合Buttonコンポーネント

画面(UI要素)のボタンを押したときに私のGameObjectが動かないようにしたいです。のようなUIコンポーネントにクリックがあると、GameObjectが動かないようにしたいのですか?どのように私はこれを改善することができますか?また、私はマウスが特定 UI要素(2つのまたは3ボタン)

+0

? –

+3

あなたのコードはすべて動きの責任を負います。 –

+0

@ḞḹáḿíṅḡⱫỏḿƀíéあなたはその質問を理解しませんでした。私は、マウスボタンを離すとキューブを動かすスクリプトを持っています。問題:キャンバス内のボタンを押すと、キューブは何に関係なく動きます。私はキャンバスボタンを押すとキューブを動かしたくありません。 – Dake

答えて

5

あなたのコメントを読んだ後。必要なのはEventSystem.current.IsPointerOverGameObject()で、ポインタがUI上にあるかどうかを確認します。 trueポインタがUIの上にある場合、それ以外の場合はfalseです。 '!'と一緒に使用し、マウスがUIを超えていない場合にのみ回転コードを実行できます。デスクトップ

モバイル

if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended && !EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) 
{ 
    //Your code here 
} 

については

if(Input.GetMouseButtonUp(0) && !EventSystem.current.IsPointerOverGameObject()) 
{ 
    //Your code here 
} 

//上記の解決策については

は動作するはずですが、バグがあります。 UI Buttonの上でマウスボタンを押してUI Buttonの外にリリースすると、クリックとして登録されます。したがって、基本的には、UI ButtonをクリックしてUI Buttonをリリースした場合にのみ、このソリューションが機能します。 U Buttonの外にリリースすると、元の問題は再び元に戻ります。

一時的なbooleanの値を使用して、最初にボタンがInput.GetMouseButtonDownのUIで押されたかどうかを確認することをお勧めします。 booleanを保存した後、ButtonInput.GetMouseButtonUp(0)でリリースされたときに使用できます。以下のソリューションは、モバイルとデスクトップの両方で動作するように提供されています。モバイルがテストされ、動作します。あなたは正確にそれを停止しているどのように

bool validInput = true; 

private void Update() 
{ 
    validateInput(); 

    #if UNITY_STANDALONE || UNITY_EDITOR 

    //DESKTOP COMPUTERS 
    if (Input.GetMouseButtonUp(0) && validInput) 
    { 
     //Put your code here 
     Debug.Log("Valid Input"); 
    } 
    #else 

    //MOBILE DEVICES 
    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Ended && validInput) 
    { 
     //Put your code here 
     Debug.Log("Valid Input"); 
    } 
    #endif 
} 

void validateInput() 
{ 
    #if UNITY_STANDALONE || UNITY_EDITOR 
    //DESKTOP COMPUTERS 
    if (Input.GetMouseButtonDown(0)) 
    { 
     if (EventSystem.current.IsPointerOverGameObject()) 
      validInput = false; 
     else 
      validInput = true; 
    } 
    #else 
    //MOBILE DEVICES 
    if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) 
    { 
     if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) 
      validInput = false; 
     else 
      validInput = true; 
    } 
    #endif 
} 
+0

このスクリプトはモバイルデバイスで機能しますか? – Dake

+0

@Dakeはい。それはあらゆるプラットフォーム上で行われます。それを試してみて – Programmer

+0

ありがとう。 「検出したいGameObjectに以下のスクリプトを添付するだけで、「あなたは私のボタンについて話していますか? – Dake

0

上でクリックされたかどうかを確認したいのですが、私は賭け、より良い解決策はありますが、私の心に来る最初の事は、次のとおりです。

UI要素をクリックしているかどうかを確認して、マウスアップイベントでオブジェクトを動かしてください。

あなたのマウスの位置に光線をキャストするGraphicsRaycasterを使用してUI要素を打つかどうかを確認できます。それが何かをヒットする場合は、任意のキャンバスをクリックしています。

参照:https://docs.unity3d.com/Manual/script-GraphicRaycaster.html

0

私はあなたがいない適切な条件でマウス入力を処理するためにUpdate()メソッドを使用していると思います。私は例

などダウン代わりに、マウスボタンを使用すると、UI要素で使用する相互作用として、あなたのコードを変更することをお勧め:画面上のすべての上に大きな目に見えない UIパネルを作成するが、 に他のすべての背後にある必要がありますUIキャンバス。次に、ボタンコンポーネントを追加し、このボタンの OnClick()イベントによって、 gameObjectの移動を制御します。 (問題を解決すれば他の人を助けるために投票してください)

関連する問題