UnSpeed Geschrieben 7. April 2015 Melden Share Geschrieben 7. April 2015 Hey Leute, sorry, aber besser kann ich den Titel nich beschreiben, wenn jemand einen passenderen findet, feel free! Zu meinem Vorhaben: Die Szene ist ein Blick auf einen Tisch vpn schräg oben, statische Kamera (Später evtl. nicht mehr). Auf dem Tisch befinden sich verschiedene Gegenstände, die mittels Maus bewegt werden können sollen. Also OnMouseDown() - Objekt wird aufgehoben, OnMouseUp() - Objekt wird fallengelassen. Code dazu: #pragma strict var rb : Rigidbody; var grabbed = false; var pickUpHeight : float; function OnMouseDown() { Debug.Log("Clicked"); grabbed = true; } function OnMouseUp() { Debug.Log("UnClicked"); grabbed = false; } function setPickUpHeight() { pickUpHeight = 0.5; } function Start () { rb = GetComponent.<Rigidbody>(); setPickUpHeight(); } function Update () { if (grabbed) { rb.useGravity = false; while(pickUpHeight > 0) { this.transform.Translate(Vector3.up*Time.deltaTime*2); pickUpHeight -= Time.deltaTime*2; } } else { rb.useGravity = true; setPickUpHeight(); } } Das ist nicht der beste Code, ich weiß. Aber er funktioniert ganz gut, deshalb werde ich ihn wahrscheinlich erst später überarbeiten. So, jetzt das Problem: Wenn der Gegenstand aufgehoben worden ist, soll man ihn mit der Maus verschieben können und zwar so, dass die Mousebewegung perspektivisch umgerechnet wird... wird das klar?! :/ Meine Idee war, irgendwie zu ermitteln, worauf die Maus zeigt, da es möglich ist, zu erkennen, ob die Maus über einem Objekt ist, dachte ich mir, dass es auch sein könnte, dass man ermitteln kann WO GENAU sich die Maus über einem Objekt befindet. Ich bin für jeden Tip und jede Hilfe dankbar! Danke, UnSpeed Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
UnSpeed Geschrieben 7. April 2015 Autor Melden Share Geschrieben 7. April 2015 Wow, die ganze Zeit im Internet gesucht und nichts gefunden. Jetzt, nachdem ich das Thema erstellt habe, habe ich natürlich parallel weitergesucht und jetzt habe ich etwas gefunden. Für alle, die ein ähnliches Problem haben: http://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
GelegenheitsProgrammierer Geschrieben 7. April 2015 Melden Share Geschrieben 7. April 2015 Versuch es mal mit Raycast damit könntest du schon mal weiter kommen Du kannst das ungefähr so verstehen das do von der Mouseposition einen Strahl in dein Spiel malst bis dieser Strahl etwas trifft und der 3D Punkt wird dir dann zurück gegeben Ray ray = camera.main.ScreenViewPoint(mouseposition); if(phiysics.Raycast(ray, out hit, distance)) { Vector3 3dMouseposition = hit.point; } (Der Code ist jetzt so aus dem Kopf und eventuel fehlerhaft aber ich denke den zu korregieren wird kein Problem sein.) Und dann musst du nur noch das Layer deines Objektes was du bewegt den Raycast ignorieren. Kannst du irgenwo einstellen. Dann wird ich die Position nehmen und sie deinem Obejkt geben. Probier mal ein bisle damit rum, ich hoffe das hilft dir weiter?? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Tiwaz Geschrieben 7. April 2015 Melden Share Geschrieben 7. April 2015 Hätte das spontan auch so gemacht wie GelegenheitsProgrammierer.. So mache ich das eigentlich immer und funktioniert auch immer super ^^ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
UnSpeed Geschrieben 7. April 2015 Autor Melden Share Geschrieben 7. April 2015 Also, erstmal vielen Dank für den Tip, das hat super funktioniert! Deshalb präsentiere ich hier mal die Lösung, damit andere das auch so schnell hinbekommen: #pragma strict var rb : Rigidbody; var grabbed = false; var pickUpHeight : float; function OnMouseDown() { grabbed = true; } function OnMouseUp() { grabbed = false; } function setPickUpHeight() { pickUpHeight = 0.5; } function Start () { rb = GetComponent.<Rigidbody>(); setPickUpHeight(); } function updateCoordsFromMouse() { var hit : RaycastHit; var ray = Camera.main.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray, hit,1<<8)) { transform.position = Vector3(hit.point.x,transform.position.y,hit.point.z); } } function Update () { if (grabbed) { updateCoordsFromMouse(); rb.useGravity = false; while(pickUpHeight > 0) { this.transform.Translate(Vector3.up*Time.deltaTime*2); pickUpHeight -= Time.deltaTime*2; } } else { rb.useGravity = true; setPickUpHeight(); } } Dabei ist die Methode updateCoordsFromMouse() der Knackpunkt function updateCoordsFromMouse() { var hit : RaycastHit; var ray = Camera.main.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray, hit,1<<8)) { transform.position = Vector3(hit.point.x,transform.position.y,hit.point.z); } } Das dritte Argument von Raycast ist "1<<8". Das ist ein User Layer, den ich erstellt habe (Rechts Oben und Layers, dann Edit Layer und dann einen eintragen) Ich habe eine Plane erstellt, die den Layer bekommen hat und da das der achte Layer ist, wird nur dieser in die Raycast-Berechnung einbezogen. Nochmals danke! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.