Jump to content
Unity Insider Forum

Cursor Problem


MustafGames

Recommended Posts

Ähm, wenn du den Cursor sperrst ist das normal? Du musst den Cursor freigeben, wenn in der UI was passieren soll .... Ich denke der Cursor wird global fürs ganze Game gesteuert und damit unterscheidet er nicht ob UI oder Scene.

Ich kenn es so, daß man den Cursor freigeben kann wenn man die UI öffnet und das man ihn wieder verstecken kann, wenn man "Dialoge" wieder schließt (leider kann man so aber eine Spellleiste / Actionleiste oder ähnliches dann nicht mehr über die Maus steuern)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was ist dann mit UI das im World Space ist (z.b. Konsole/Bildschirm eines PCs).

Ich möchte ja das mein Cursor immer in der Mitte des Bildschirms ist aber nicht sichtbar ist, und wenn ich dann mein Inventar öffne soll er wieder freigegeben sein.

Mir ist aufgefallen wenn ich ihn locke und die Maus bewege und ihn dann freigebe das die Position sich geändert hat obwohl er im Locked-Modus ja in der Mitte bleiben soll..

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du kannst dann nur das Sperren, was der Cursor NICHT machen soll.

Beispiel:

Deine Linke Mauste feuert die Waffe ab. Soll sie ja logischerweise nicht machen, wenn du im Menü etwas anklickst. Also müssen wir dafür sorgen, dass dies nicht geschieht. Eine Maustaste fragst du in der Update Methode ab, also musst du hier eine Sperre einbauen. 

private void Update(){
	// Sollte der Boolean true sein, gibt es ein return und die Update Methode wird abgebgrochen.
	if(pause == true ) 
		return;

	if(Input.GetMouseButtonDown(0)) {
		// Fire
	}
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das weiß ich ja, ich habe ein Zielkreuz also will ich die Maus nicht sehen, dennoch soll sie in der Mitte des Bildschirms bleiben weil sonst man das UI nicht anklicken kann welches im World Space ist. mit Locked -> klappt das nicht also etwa, sichtbarkeit aus und permanent in die Mitte des Bildschirms setzen oder kp

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich würde den Cursor beim Freigeben noch einmal locken, theroretisch sollte dies den Cursor erneut in die Mitte platzieren:

  void ReleaseLock() {
    Cursor.lockState = CursorLockMode.None; // Vielleicht überflüssig?
    Cursor.lockState = CursorLockMode.Locked;
    Cursor.lockState = CursorLockMode.None;
  }

Ansonsten kann man den Hardwarecursor auch über die Windowsapi setzen, wäre dann aber die letzte Waffe....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Irgendwie verstehe ich dein Problem nicht so ganz oder völlig falsch.

Zitat

Das weiß ich ja, ich habe ein Zielkreuz also will ich die Maus nicht sehen, dennoch soll sie in der Mitte des Bildschirms bleiben weil sonst man das UI nicht anklicken kann welches im World Space ist. mit Locked -> klappt das nicht also etwa, sichtbarkeit aus und permanent in die Mitte des Bildschirms setzen oder kp

Der Cursor ist eigentlich ein einzelnes Pixel (Hotspot) der bei der Cursordefinition angegeben wird (sich also irgendwo in verwendeten Icon befindet).
Wenn du den Cursor auf Locked stellst wird dieser Punkt einfach in die Mitte des Bildschirms verschoben und bleibt da (Cursor sichtbar oder nicht).
Alle aktiven Elemente die unter diesen Punkt geraten könnten ausgelöst werden. Deine UI-Elemente sind aber sicherlich am Rand des Bildschirms positioniert.
Und da die UI (Sorry für den Vergleich) eigentlich eine bemalte Glasplatte ist, die direkt vor die Kamera geklemmt wird und sich mit der Kamera mitbewegt. Du wirst nur Punkte in der 3D-Welt erreichen können.
Ich habe auch ein Fadenkreuz in der Mitte ( für die 3D-Welt, Cursor Locked, Hidden) und für die Nutzung der Oberflächenelemente schalte ich den einfach Cursor um (wird bei mir im Moment noch mit der CTRL-Taste aktiviert).

			if(StartStop)
			{
                Cursor.lockState = CursorLockMode.None;
                Cursor.visible = true;
			}
			else
			{
                Cursor.lockState = CursorLockMode.Locked;
                Cursor.visible = false;
			}
 

Funktioniert bei mir hervorragend.

Und mit

 Cursor.SetCursor(Icon[3], hotSpot, CursorMode.Auto);

Kannst du auch noch den Cursor selber ändern.:)

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bis jetzt nur im Editor, da die Maus aber ein Systemgerät (nicht Unity) ist, sollte es auch im Build klappen.
Ich hoffe ich verstehe es richtig (wenn nicht, korrigieren). Du hast ein paar Panel/Button-Objekte in der UI und "3DUIs" (3D-Objekte in der 3D-Welt, ständig sichtbar) die du anklicken willst.

In der UI (2D) wirst du keine Probleme haben, bei den 3D-Objekten wirst du wohl über einen Ray testen müssen, was du da vor dir hast und dann das Ereignis auslösen (händisch).
Soweit ich weiss, wird über irgendeine API-Funktion geprüft, ob sich die aktuelle Mausposition innerhalb eines bestimmten Bereiches befindet (Tectangle, ..), Rückgabe Ja/Nein (oder auch 0/1). Wenn es sich in Unity um einen Button/aktives Element handelt und man dort eine Function hinterlegt hat, wird diese ausgelöst, wenn die Maus darüber ist (Rectangle des Buttons).
Bei deinem 3D-Object müsstest du ein "virtuelles" Rectangle erzeugen (mit den Bildschirmkoordinaten an denen dein Object aktuell sichtbar ist), und die API-Funktion aufrufen. Trotzdem müsste jedes dieser Objekte dann auf dieses Event reagieren müssen.
Ich würde im 3D-Bereich immer ab der Mausposition einen RAY abschiessen und die Function dann "händisch" auslösen. Geht einfacher. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Innerhalb der UI (ich vermute mal Canvas-Object mit Panel, Button, ..) brauchst du kein Raycast. Für diese Object einfach im Inspector das OnClick-Ereignis mit einer Function belegen, die dann ausgelöst wird.

Ein Raycast ist eigentlich für die 3D-Welt gedacht (habe ich bei "3dUIs" vermutet).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sollte ich den Buttons 2D Collider geben, den es klappt immer noch nicht, habe jetzt die neuste Version und wenn mein Cursor Locked (in der Mitte des Bildschirms festgenagelt) und unsichtbar ist, reagiert das WorldSpace-Canvas nicht. Es gibt ja da einen Graphics Raycaster Script im Canvas, kann man dort vielleicht etwas ändern?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe ein World Space Canvas, mit paar Buttons.

Mein Script setzt den Cursor auf Locked und Sichtbarkeit false.

In der MItte des Bildschirms ist ein Zielkreuz damit man die Mitte erkennt.

Wenn ich nun auf einen der Buttons klicke, passiert nichts, den Buttons ist in der OnClick Methode ein Script eingestellt der mit Debug.Log("Klappt") ausgibt, außerdem ist Color Tint eingestellt damit ich es noch sehe wenn meine Maus über dem Button ist.

 

Wenn mein Cursor auf None gestellt ist und sichtbar, klappt alles aber das ist ja nicht der Sinn, den ich möchte das er in der Mitte des Bildschirms bleibt und unsichtbar ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also du stellst den Cursor in die Mitte und machst ihn unsichtbar, des weiteren fixierst du ihn mit Locked. Demnach musst du in der Update-Methode fragen, ob die Maustaste gedrückt wurde. Der Mausklick macht nur was, wenn du entweder einen Button drückst, der den Befehl an eine Methode weiter reicht oder wenn du in der Update abfragst, ob er gedrückt wurde. Hierbei ist es egal ob der Button sichtbar oder unsichtbar ist. Des weiteren ist es auch egal ob Locked oder Unlocked (hier würden logischerweise die Buttons nicht gehen).

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Update() {
        if (Input.GetMouseButtonDown(0))
            Debug.Log("Pressed left click.");
        
        if (Input.GetMouseButtonDown(1))
            Debug.Log("Pressed right click.");
        
        if (Input.GetMouseButtonDown(2))
            Debug.Log("Pressed middle click.");
        
    }
}

So, willst du mit der Maus wieder fleißig Button klicken, musst du ihn von der Fixierung lösen, also Unlocked und wieder sichtbar schalten, sonst sieht man ja auch nicht was man klickt.

Gleichzeitig unsichtbar und in der Mitte klappt nur wenn du ein Fadenkreuz zum herumschießen nimmst. Willst du nun wieder Buttons klicken, braucht der Button auch eine Interaktion. Buttons sind EventHandler, sie reagieren auf ein Event, eben auf deinen Klick. Sie reagieren nur wenn auch mit ihnen etwas gemacht wurde.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Noch mal Schritt für Schritt. :)

Du möchtest mit den Fadenkreuz herum rennen, also im Spiel, dann machst du folgende Aktionen:

- UI-Menü deaktivieren

- Fixierung der Maus in der Mitte

- Maus unsichtbar

- Time.timescale = 1 // Lässt das spiel wieder in der Standardgeschwindigkeit laufen

- Maus Buttons werden nun über die if-Abfrage von oben gesteuert. Was weiß ich, linke Maustaste Feuern, rechte Nachladen.

Du Möchtest ins Menü und drückst zum Beispiel die ESC-Taste, dann machst du folgende Aktionen:

- UI-Menü aktivieren

- Fixierung der Maus in der Mitte Aufheben

- Maus sichbar

- Time.timescale = 0 // Friert das Spiel ein, nichts bewegt sich mehr, Update Methoden sind noch aktiv und müssen über einen return-Befehl gestoppt werden

- Maus Buttons if-Abfrage deaktivieren

- Nun wie gewohn die Buttons im Menü benutzen

 

Das ist der gesamte Zauber. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke aber meine Idee ist etwas anders,

das mit dem Oberflächen Menü hab ich schon alles das klappt auch, das WorldSpace Menü ist aktivierbar auch wenn man rumlaufen kann, also wie so gesagt ein Hologramm.

Denke es wird klappen wenn ich in dem Moment wo die Maus geklickt wird sie einfach aus der Fixierung löse.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe in der Welt eine Werkbank stehen und wenn man "E" drückt öffnet sich bei dieser Werkbank ein 3D-Canvas (World Space Canvas/UI), das bleibt auch solange offen bis man wieder die Werkbank anklickt, man kann dabei herumlaufen und es ist wie ein Hologramm eines Menüs wo man dann auswählen kann was man herstellen möchte. Es sind UI Buttons und diese aktiviert es ja nur wenn der Cursor aus der Fixierung freigegeben wurde.

 

Würde ja alles prima funktionieren wenn man auch Buttons anklicken könnte obwohl der Cursor auf Locked ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

So ein kleines unwichtiges Detail solltest du mit erwähnen, denn dann müssen wir an die Sache ganz anders heran gehen. :lol:

Jo, also das ist recht komplex. Gleichzeitig laufen und interagieren und noch UI steuern. OK, damit wissen wir erst mal was du überhaupt machen willst. Mhhhh ... nachdenken ...

OK, ich sehe das zwei Möglichkeiten:

1. Du gehst an den Tisch, "E" wird gedrückt und das UI wird aufgerufen, Charakter in der Steuerung deaktivieren, deine Maus für die UIs freigeben und deine Buttons nutzen.

2. Du fügst vor der Kamera mehrere GameObjects ein, jedes Objekt bekommt eine Textur und wird als Button oder Anzeige genutzt. Diese Objekte müssen auf einen Ray reagieren können, um genutzt zu werden. Diese GameObjects müssen dann die Kamera als Parent haben, damit sie an ihren Platz verweilen. Wäre denk ich mal das was du willst, wäre aber schon etwas komplex zum umsetzen. Wenn du dann im Menü hin und her wechseln willst, müsstest du dann mit SetActive() wieder einzelne Objekte ausblenden und einblenden. Maus müsstest du hier aber auch freigeben, damit du den Ray eine Richtung vorgeben kannst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das mit der Steuerung deaktivieren damit der Charakter stehen bleibt ist nicht so mein Ziel.

So wären beide Varianten nicht möglich, da man ja in auf der Stelle stehen bleiben soll.

Bei den früheren Versionen von Unity ging das alles so wie ich es möchte, nur jetzt haben die sich gedacht wird werden mal den Locked Cursor so machen das er keine UI Elemente anklicken kann.

 

Eine Idee wäre das ich den UI Elementen einen 2D Collider gebe und dann einfach per Raycast die gewünschte Funktion aktiviere.

Der Cursor soll eigentlich in der Mitte bleiben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...