2017-09-13 7 views
0

にここに私のスクリプトです:私はRayCastHitを持っていると私は、ディスプレイ上の任意の場所をクリック発生しますので、任意の特定のオブジェクトをクリックしたくないClickMouseButtonを生成する(0)どこにでも表示

void Update() { 
    public float clickTimer = 2f; 
    clickTimer -= Time.deltaTime; 
    if(clickTimer <= 0){ 
     //"Generate Click" I try: Input.GetMouseButtonDown(0); 
     clickTimer = 2f; 
    } 
} 

が。

+3

をクリックしたいすべてのゲームオブジェクトをタグ付けすることをお勧めします。したがって、実際のマウスクリックでレイが作成された場合は、ジェネレータをクリックするだけでレイが生成されます。 – ryeMoss

+0

クリックランダムまたはレイキャストランダムが必要なものは?または、rayCastHitのスクリーン位置のクリック – joreldraw

+0

@joreldraw http://prntscr.com/gko2s6 http://prntscr.com/gko5rgこれは実際のコードです。私はUnityが画面上のどこにでもLeftClickDownを生成したいと思っています。なぜなら、Cardboardアプリケーションのどこでクリックされても画面の中央に常にRayを生成するからです。 –

答えて

0

このスクリプト(2Dゲーム用)を使用すると、マウスでクリックした画面のポイントからRayCastを作成し、あなたがヒットしたゲームオブジェクトを確認できます。私はあなたが最初にあなたが代わりにあなたはおそらく、通常のマウスクリックが何であろうとどんなコードを模倣したい「クリックを生成する」の

void Update() { 

    clickTimer -= Time.deltaTime; 

    if(clickTimer <= 0){ 

     if(Input.GetMouseButtonDown(0)) { 

      //What point was pressed 
      Vector3 worldPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition); 
      worldPoint.z = Camera.main.transform.position.z; 
      //Generate a Ray from the position you clicked in the screen 
      Ray ray = new Ray(worldPoint, new Vector3(0, 0, 1)); 
      //Cast the ray to hit elements in your scene 
      RaycastHit2D hit = Physics2D.GetRayIntersection(ray); 

      if(hit.collider != null) { 
       Debug.Log("I hit: "+hit.gameObject.tag); 
       //And here you can check what GameObject was hit 

       if(hit.gameObject.tag == "AnyTag"){ 
        //Here you can do whatever you need for AnyTag objects 
       } 
      } 
     } 

     clickTimer = 2f; 
    } 
} 
0

これは一般的に悪いことですが(マウスをクリックすると関数が呼び出され、その関数をどこでも呼び出すことができるようにシステムを設計して、シミュレーションする必要はありません)、 C# .netの特定の位置でマウスクリックをシミュレートすることができます。

最初のステップは、マウスカーソルを目的の位置に移動することです(この操作をしたくないことがわかっています。マウスクリックを生成するための後の手順の一部に設定できます。参照)、Unityはネイティブにマウスカーソルを制御する方法を持っていません。つまり、ここに示す例はWindowsマシンでのみ機能し、OSX上で動作させるには別のコードを実装する必要があります。まず、我々はを含むことから始めなければなりません。私たちのスクリプトで

using System.Runtime.InteropServices; 

を、この行は、我々が望む位置にマウスを位置し直すことができるように、私たちは、user32.dllのをインポートすることができますものです。それでは次の段階は、私たちは、マウスを移動することができます機能をインポートすることで、これはそう

[DllImport("user32.dll")] 
public static extern bool SetCursorPos(int X, int Y); 

我々は今、マウスカーソルの位置を設定するために我々のコードでは、この機能を使用することができ、今のように行われていますuser32.dllはウィンドウのみであり、他のオペレーティングシステムには移植できないことに注意してください。これがこのようにするのを避けるべき主な理由です。あなたが持っているだろう、すべての解決のために、画面の中央を取得したいので、もしWindowsオペレーティングシステム0,0

public void Start() 
{ 
    SetCursorPos(50, 50); 
} 

は、画面の左上の点で、座標は画面サイズに拡大していませんScreenクラスを使用してディスプレイサイズを取得します。

マウスを正しく配置したら、マウスクリックを実行するだけです。残念ながら、これは非常に扱いにくく、.netにはこれを行うための方法がありません。この時点での最良の選択は、私たちのために、マウスの操作を行うことができ、このクラスである:

public class MouseOperations 
{ 
    [Flags] 
    public enum MouseEventFlags 
    { 
     LeftDown = 0x00000002, 
     LeftUp = 0x00000004, 
     MiddleDown = 0x00000020, 
     MiddleUp = 0x00000040, 
     Move = 0x00000001, 
     Absolute = 0x00008000, 
     RightDown = 0x00000008, 
     RightUp = 0x00000010 
    } 

    [DllImport("user32.dll", EntryPoint = "SetCursorPos")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool SetCursorPos(int X, int Y);  

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool GetCursorPos(out MousePoint lpMousePoint); 

    [DllImport("user32.dll")] 
    private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo); 

    public static void SetCursorPosition(int X, int Y) 
    { 
     SetCursorPos(X, Y); 
    } 

    public static void SetCursorPosition(MousePoint point) 
    { 
     SetCursorPos(point.X, point.Y); 
    } 

    public static MousePoint GetCursorPosition() 
    { 
     MousePoint currentMousePoint; 
     var gotPoint = GetCursorPos(out currentMousePoint); 
     if (!gotPoint) { currentMousePoint = new MousePoint(0, 0); } 
     return currentMousePoint; 
    } 

    public static void MouseEvent(MouseEventFlags value) 
    { 
     MousePoint position = GetCursorPosition(); 

     mouse_event 
      ((int)value, 
      position.X, 
      position.Y, 
      0, 
      0) 
      ; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct MousePoint 
    { 
     public int X; 
     public int Y; 

     public MousePoint(int x, int y) 
     { 
      X = x; 
      Y = y; 
     } 

    } 

} 

プロジェクトに私たちはその後、マウス操作をシミュレートするために、このクラスを使用することができることを追加した後、これがそうのように行うことができます。

MouseOperations.MouseEvent(MouseOperations.MouseEventFlags.LeftDown | MouseOperations.MouseEventFlags.LeftUp); 

その行には左クリックが実行されます。マウスイベント機能は、さまざまなマウス機能を実行できる既成のフラグを取り込みます。 LeftDownフラグを渡しただけの場合は、マウスの左ボタンを押したままにして、左クリックを保持します。そのため、クリックを取得するには左上のフラグを渡す必要があります。

Here's the code I used that worked flawlessly on my test project.

ただ、再びこの点を強調するために、あなたはそれをこのようにやってはいけません。これは頑丈で信頼性の低いハックです。それを行う適切かつ良い方法は、通常の左クリックが単に関数を呼び出すようにすることです。左クリックが発生したい場合は、複雑な手順を経て関数を呼び出す代わりに関数を呼び出すことができます。

関連する問題