2016-04-16 13 views
0

Hallo :) Ich bin mit der Physics2D.Raycast Methode und nach Unity Dokumentation ihrer Eingabeargumente sind wie folgt definiert:Fehler Physics2D.Raycast mit - optional Argumenten

public static RaycastHit2D Raycast(Vector2 origin, Vector2 direction, float distance = Mathf.Infinity, 

int layerMask = DefaultRaycastLayers, float minDepth = -Mathf.Infinity, float maxDepth = Mathf.Infinity); 

Und ich diese Methode aufgerufen und eingefügt die folgenden Eingabeargumente:

RaycastHit2D hit = Physics2D.Raycast (transform.position, 
newVelocity, layerMask: hitLayerMask); 

Allerdings bekomme ich folgende Fehlermeldung:

The best overloaded method match for 'UnityEngine.Physics2D.Raycast(UnityEngine.Vector2, UnityEngine.Vector2, float)' 

does not contain a parameter named layerMask 

Können Sie mir helfen, dieses Problem zu lösen? Ich verstehe nicht, warum der Compiler denkt, ich überbelaste eine Methode mit nur drei Eingabeargumenten.

P.S: Ich bin mir meiner Einführung von "transform.position", einem Vector3-Objekt, in einer Funktion bewusst, die ein Vector2-Objekt annehmen soll. Aber ich habe das schon vorher gemacht und ich habe keine Fehler. Der einzige neue Ansatz, den ich nehme, ist die Spezifikation des Arguments layerMask:/

Ich wäre dankbar für jede Hilfe.

Edit: Um zu verdeutlichen, ist transform.position ein Vector3-Objekt, newVelocity ist ein Vector2 und hitLayerMask ist eine ganze Zahl.

Edit 2: Beachten Sie, dass ich die Übergabe des Arguments "distance" vernachlässigt habe, weil es einen Standardwert Mathf.Infinity hat. Auf dieser Webseite über optionale Argumente (https://msdn.microsoft.com/en-us/library/dd264739.aspx), auf dem ExampleMethod() - Teil, wird gezeigt, wie Argumente mit Standardwerten vernachlässigt werden können. Und das ist der Grund, warum ich das "Distanz" -Argument vernachlässigt habe

Antwort

0

Sie müssen Abstand vor der Ebenenmaske übergeben, aber Sie haben es versäumt, dies zu tun. Die Signatur der Funktion ist vector2, vector2, float int und andere, aber der aktuelle Code, den Sie haben, ist vector2, vector2, int (hitLayerMask) ....

int hitLayerMask = 0; 
    int layerMask = 6; 
    float distance = 60f; 

    RaycastHit2D hit = Physics2D.Raycast(transform.position, 
     newVelocity, distance, layerMask: hitLayerMask); 

Dies kompiliert, aber nicht gut funktionieren aufgrund wie du in der Schicht vorbeigehst. Dazu verwenden Sie den bitweisen Betrieb. Zum Beispiel 1<<hitLayerMask, 1 << LayerMask.NameToLayer("Environment"). Weitere Informationen zum bitweisen Betrieb der Schicht finden Sie unter here.

Im Folgenden ist der richtige Weg, dies zu tun:

Vector3 newVelocity = Vector3.zero; 
    float distance = 100f; 
    int layerMask = 1 << 6; //cast rays only against colliders in layer 6. 
    RaycastHit2D hit = Physics2D.Raycast(transform.position, 
     newVelocity, distance, layerMask); 

EDIT:

Fehler wahrscheinlich es ist, weil die Funktion, die Sie verwenden möchten, in der aktuellen Einheit C# Version nicht verfügbar ist. Optionale Parameter und benannte Argumente wurden in C# V4 hinzugefügt, während Unity die Version C# < = 3.5 verwendet, wobei einige Features entfernt wurden.

+0

Oh okay. Ich dachte, man könnte die Argumente vernachlässigen, die einen Standardwert hatten. Aber ich habe keine Distanz zu spezifizieren ...: s Sollte ich Mathf.Infinity verwenden, wie es der Standardwert ist? – Dayman75

+0

Auch diese Webseite über optionale Argumente https://msdn.microsoft.com/en-us/library/dd264739.aspx erklärt, wie Sie angeblich Argumente ignorieren können, die einen Standardwert haben, wie das Argument distance input in der Raycast-Funktion (Check ExampleMethod() auf dieser Seite). Also keine Passierdistanz sollte funktionieren:/ – Dayman75

+1

@ Dayman75 Du hast diese Seite falsch gelesen. Sie können optionale Argumente von rechts nach links ignorieren, nicht jedoch von links nach rechts. Sie können also ** layerMask ** vernachlässigen, aber dann ** distance ** verwenden. Sie können ** distance ** nicht vernachlässigen und ** layerMask ** verwenden. Für die Distanz kannst du jetzt ** Mathf.Infinity ** verwenden, bis du deine eigene Distanz gefunden hast. Das ist bei jedem Spiel anders. – Programmer

0

Wie der Benutzer @Programmer angegeben hat, verwendet Unity C# 2-> 3.5. Ich suchte tatsächlich nach der C# "Version" mit "Debug.Log (System.Environment.Version);" und bemerkte, dass meine Version 2.0.50727.1433 ist.

Um zu tun, was ich mit benannten Argumenten wollte ich C# 4.0-Version benötigt, und das ist, warum ich diesen Fehler bekam.