Jump to content
Unity Insider Forum

Auf 3D-Objekte klicken (Picking)


Sascha

Recommended Posts

In anderen Engines ist es eine komplizierte Sache, wenn man dem Spieler die Möglichkeit geben will, mit der Maus in die 3D-Welt hineinzuklicken.

Man muss die zweidimensionale Mausposition benutzen, um über Aspect Ratio der Kamera und Auflösung des Spiels eine dreidimensionale Position zu ermitteln und dabei schauen, auf welches Objekt der "Strahl" (Ray), der mit diesen Informationen berechnet wird, fällt.

 

Unity macht diesen Vorgang sehr einfach, aber bietet zusätzlich noch eine ganz einfache Alternative an.

 

  1. Erstelle folgendes Skript:
    function OnMouseDown()
    {
    print("Du hast auf das Objekt geklickt.");
    }


  2. Weise das Skript einem Objekt zu, das einen Collider hat
  3. Starte das Spiel
  4. Klicke auf das Objekt
  5. In der Konsole (und damit unten links im Editor) erscheint der Geklickt-Satz.
  6. Ersetze den print()-Befehl durch beliebigen Code
  7. Fertig!

Neben OnMouseDown() (Spieler hat geklickt) gibt es noch ähnliche Funktionen:

  • OnMouseEnter() (Spieler hat angefangen, das Objekt mit dem Zeiger zu berühren)
  • OnMouseExit() (Spieler hat aufgehört, das Objekt mit dem Zeiger zu berühren)
  • OnMouseOver() (Spieler berührt jetzt in diesem Frame das Objekt mit dem Mauszeiger)

 

Viel Spaß mit Picking!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja ich persönlich finde OnMouseUp() besser als OnMouseDown().

Speziell bei Menüs ist es besser.

 

Tom.

 

Naja... besser, schlechter... Beide haben ihren eigenen Zweck/Sinn, z.B. ist eine Drag&Drop funktion mithilfe von OnMouseUp() ziemlich,... doof. Da ist es sinnvoller onMouseDown() zu nehmen und solange man gedrückt hält, das Object "dragged". ;) Von daher ist diese Aussage. Mäh. Aber klar für Menüs wird oftmals onMouseUp benutzt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 year later...

Hi leute, da fällt mir grad was ähnliches ein.

 

Ist es möglich wenn ich in der Mitte ein GUI (Crosshair) einrichte ähnlich wie bei dem (3rdPersonShooter_Sample),diesen so zu nutzen das wenn ich damit auf Objekte Ziele, und eine Maustaste drücke dieses Object ausgewählt wird?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi leute, da fällt mir grad was ähnliches ein.

 

Ist es möglich wenn ich in der Mitte ein GUI (Crosshair) einrichte ähnlich wie bei dem (3rdPersonShooter_Sample),diesen so zu nutzen das wenn ich damit auf Objekte Ziele, und eine Maustaste drücke dieses Object ausgewählt wird?

 

Ich denke, dass sollte möglich sein. Ich würde das hier benutzen um festzulegen, dass der Cursor in der Mitte bleibt: http://docs.unity3d.com/Documentation/ScriptReference/Screen-lockCursor.html

 

Einfach das Crosshair auf die Kamera legen und zentrieren und dann kannst du ein Script mit OnMouseDown Funktion erstellen und auf dein Objekt legen.

Im selben Skript auch eine Boolean Variable erstellen und OnMouseDown auf true setzen... Dann könntest du es als Schalter benutzen... Oder du lässt es sich bewegen oder so... Ich hoffe es hilft und die Idee ist net falsch.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke habe mir nun was zusammen gezimmert B) .

 

using UnityEngine;
using System.Collections;
public class Crosshair : MonoBehaviour {

public Texture reticle;


/*Funktion draw crosshair on Center
 * Erstellt in der Mitte der Screens einen Zielpunkt
 * wenn ESC gedrückt wird wird der Cursor wieder Freigegeben,ist allerdings noch verdeckt!*/

void OnGUI () {
 if (Time.time != 0 && Time.timeScale != 0)
  GUI.DrawTexture(new Rect(Screen.width/2-(reticle.width*0.5f), Screen.height/2-(reticle.height*0.5f), reticle.width, reticle.height), reticle);
 Screen.lockCursor = true;
 Screen.showCursor = false;
}

}

 

Soweit geht alles und sogar ohne Fehler!.

 

Nun habe ich einem Object diesen Script zugewiesen.

#pragma strict
function Start () {
}
function Update () {
}
function OnMouseDown()
{
print("Du hast auf das Objekt geklickt.");
}

 

Wobei ich ja nun anstatt (print) auch eine Funktion zuweisen kann z.B:

 

So wie ich das im Game geplant habe,als Bonus Goldstücke auf der Map zu verteilen diese damit per Klick aufnehmen zu lassen, und dem Guthaben des Players im Game hinzuzufügen, und somit gleichzeitig das Object verschwinden zu lassen.

 

Wobei ich das verschwinden des Objects über Destroy (gameObject) realisieren möchte.

 

@Edit: Hätte eventuell jemand nen Tipp wie man diese Destroy's Zählen lassen könnte.

 

Im Detail: Ich habe vor im Game ein Money System einzubauen, sprich bei Game-start(New Game) hat der Player ein Festes Guthaben z.B. 2000 Coints oder so.

 

Wenn er nun die Versteckten Coints findet und einsammelt, wird ihm ein festgelegter Betrag gut geschrieben.

 

Also soll der vorhandene Betrag logischerweise erhöht werden und irgendwo gespeichert werden, das er beim nächsten start wieder da ist.

 

Hätte dafür jemand eine Lösung?

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...