Jump to content
Unity Insider Forum

Object kann nur einmal angeklickt werden


Singular

Recommended Posts

Hallo zusammen, Hallo Sascha ;),

Ich sitze gerade an einem kleinen Problem und weiß noch nicht wirklich woran es liegt. Vielleicht könnt ihr mir sagen was ich falsch mache:

Ich habe ein Interface erstellt was nicht besonders aufregend aussieht:

public interface IClickable
{
    public GameObject GetObject();
}

Dazu habe ich ein Testscript, welches ich erst einmal Player genannt habe. Wichtig ist, dass es IClickable implementiert. Auch nicht besonders aufregend...

public class Player : MonoBehaviour, IClickable
{
    public GameObject GetObject()
    {
        return gameObject;
    }
}

 

Soweit so simpel. Jetzt habe ich einen "ClickManager" geschrieben, der bei einem Linksklick prüfen soll ob das Objekt anklickbar ist und wenn ja, dann soll er dieses bitte abspeichern und sich seinen NavMeshAgent holen. Wenn nicht, sollen Objekte die angeklickt wurde nicht mehr markiert sein. (Kennt man ja denke ich aus jedem RTS)

Wenn ich einen Rechtsclick mache, soll das angeklickte Objekt sich bewegen.

Das Problem ist interesanterweise, dass ein Objekt nur mit dem aller ersten Klick ausgewählt wird. Wenn ich das Spiel starte und einen Spieler anklicke, wird dieser abgespeichert und ich kann ihn bewegen. Klicke ich daneben und dann auf den Player, wird er vom Raycast nicht getroffen und ich erhalte in der Konsole lediglich die Plane darunter.

public class ClickManager : MonoBehaviour
{
    Camera cam;
    public GameObject clickedObject;
    private NavMeshAgent agent;

    private void Start()
    {
        cam = Camera.main;
    }

    private void Update()
    {
		//Linksklick für die Auswahl eines Objektes
        if (Input.GetMouseButtonDown(0))
        {
            clickedObject = null;
            agent = null;

            Ray ray = cam.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out RaycastHit hit))
            {
                Debug.Log("0");
                Debug.Log(hit.transform.gameObject.name); // Hier bekomme ich aus aussage immer "Plane"

                if (hit.transform.GetComponent<IClickable>() != null)
                {
                    Debug.Log("1"); //Diesen Debug bekomme ich ensprechend nicht, da die Plane auch kein IClickable hat
                    clickedObject = hit.transform.GetComponent<IClickable>().GetObject();
                    
                    agent = clickedObject.GetComponent<NavMeshAgent>();
                }
            }
        }
		
        //Rechtsklick für die Bewegung eines angeklickten Objekts
        if (clickedObject != null && Input.GetMouseButtonDown(1))
        {
            Ray ray = cam.ScreenPointToRay(Input.mousePosition);

            if (Physics.Raycast(ray, out RaycastHit hit))
            {
                if(hit.transform.GetComponent<Ground>() != null)
                {
                    agent.destination = hit.point;
                }
            }
        }
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

:D :D :D Naja, das Objekt selbst steht ja noch auf der Plane, deswegen bin ich davon ausgegangen, dass der Colider noch an der Stelle zu finden ist. Das schau ich mir mal an. 

edit: Nö. Ich habs gerade mal ausprobiert. Der Collider bleibt an Ort und Stelle und folgt dem Objekt korrekt. Ich kann es nur nicht anklicken...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay, jetzt wird das ganze leider doch etwas zum Problem. Ich habe jetzt eine Methode geschrieben um mehrere Objekte auszuwählen. Also Kasten um mehrere Objekte ziehen und über einen Trigger Collider werden Objekte, die auch bewegt werden können in die Liste gepackt. Das Funktioniert auch. Aber nur, wenn sie einen Rigidbody haben, da sie für den Trigger einen brauchen.

Der witz ist jetzt, wenn ich den RB drauf habe kann ich die Units auswählen und sie werden auch in meiner Liste angezeigt aber ich kann sie zum einen nicht mehr einzeln anklicken und zum anderen nicht mehr bewegen. (Rechtsklick hat normalerweise die Destination gesetzt)
Nehme ich den RB wieder runter, geht wieder alles inkl. bewegen aber dann kann ich die Units nicht mehr über den Kasten auswählen.

Also entweder,
Mit RB: Keine Bewegung, Keine einzelauswahl, Kasten ziehen möglich
Ohne RB: Bewegung möglich, einzelauswahl möglich, Kasten ziehen is nicht...

Das ist gerade etwas frustirerend. 😢

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Singular:

Das Funktioniert auch. Aber nur, wenn sie einen Rigidbody haben, da sie für den Trigger einen brauchen.

Nimm halt keinen Trigger sondern eine der verfügbaren Funktionen in der Physics-Klasse. Für die meisten Collider findest du da problemlos eine entsprechende Funktion, um einmalig ein Gebiet nach Collidern abzugrasen. Und die brauchen dann auch keine Rigidbodies.

Davon abgesehen sollte es möglich sein, da Rigidbodies drauf zu haben. Sind die denn non-kinematic?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 17 Stunden schrieb Sascha:

Davon abgesehen sollte es möglich sein, da Rigidbodies drauf zu haben. Sind die denn non-kinematic?

Ne nicht kinematisch. Das hier ist der Komplette Inspector von der Unit.

image.thumb.png.4eb62af6cb9d1073a3b060ba20ed14c1.png

 

Der NavMeshAgent ist fast Komplett mit Standardwerten gefüllt außer, dass ich die Speed von 3.5 runter auf 1.5 gesetzt habe.

 

vor 17 Stunden schrieb Sascha:

Nimm halt keinen Trigger sondern eine der verfügbaren Funktionen in der Physics-Klasse.

Ich denke mal du meinst einen Overlap. Ich hatte das mit einem MeshCollider, weswegen das mit dem Physics Overlap das nicht funktioniert. Aber ich habe jetzt mal die ganze Formel auf einen BoxCollider umgestellt. Sollte eigentlich auch gehen. Allerdings weiß ich nicht, wie ich an das "HalfExtends" dran komme. Ich würde eigentlich erwarten, dass das 3 Vectoren sind, die die größe in x, y und z. (Also von Mittelpunkt zu einer seite) Aber scheinbar ist es etwas anderes, da ich nur einen Vector brauche. Ist es dann nur zu einem der Eckpunkte?
Ist die Drehung dann schon mit einberechnet?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay, habe den Fehler gefunden. Ein NavMeshAgent, kann nur mit einem RB arbeiten, wenn dieser Kinematisch ist... Jetzt funktioniert die Auswahl auch wie ich sie mir gewünscht hatte über das Mesh, das der Spieler zieht. Hoffe nur, dass das nachher auch mit ungeraden flächen funktioniert^^ Wir werden sehen... ansonsten heule ich hier nochmal ein bischen rum danke dir :D

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...