これは一般的に悪いことですが(マウスをクリックすると関数が呼び出され、その関数をどこでも呼び出すことができるようにシステムを設計して、シミュレーションする必要はありません)、 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.
ただ、再びこの点を強調するために、あなたはそれをこのようにやってはいけません。これは頑丈で信頼性の低いハックです。それを行う適切かつ良い方法は、通常の左クリックが単に関数を呼び出すようにすることです。左クリックが発生したい場合は、複雑な手順を経て関数を呼び出す代わりに関数を呼び出すことができます。
をクリックしたいすべてのゲームオブジェクトをタグ付けすることをお勧めします。したがって、実際のマウスクリックでレイが作成された場合は、ジェネレータをクリックするだけでレイが生成されます。 – ryeMoss
クリックランダムまたはレイキャストランダムが必要なものは?または、rayCastHitのスクリーン位置のクリック – joreldraw
@joreldraw http://prntscr.com/gko2s6 http://prntscr.com/gko5rgこれは実際のコードです。私はUnityが画面上のどこにでもLeftClickDownを生成したいと思っています。なぜなら、Cardboardアプリケーションのどこでクリックされても画面の中央に常にRayを生成するからです。 –