2017-01-10 3 views
3

Ich möchte Spieler Bewegung in den Bereichen der Kugel zu beschränken, zeigen die schematische Darstellung wie unten, wenn Spieler Bewegung außerhalb der Bereiche, dann Spieler auf Kugel maximalen Radius Bereich beschränken.Setzen Spieler Grenze in Sphere

Wie kann ich C# -Code schreiben, um es zu implementieren, so?

enter image description here

dies ist mein aktueller Schritt:

  1. schaffen 3D-Kugel

  2. C# -Code append erstellen Objekt Sphäre

My-Code so weit:

public Transform player; 

void update(){ 
     Vector3 pos = player.position; 
} 
+0

Wurde Ihr Problem gelöst? Wenn ja, erwäge bitte, eine gepostete Antwort als die richtige auszuwählen. – Kardux

Antwort

3

Ich weiß nicht, wie Sie die Position Ihres Spielers berechnen, aber bevor Sie dem Spieler die neue Position zuweisen, sollten Sie überprüfen, ob die Bewegung durch möglich ist, indem Sie den neuen Positionsabstand vom Mittelpunkt der Kugel überprüfen

//so calculate your player`s position 
//before moving it then assign it to a variable named NewPosition 
//then we check and see if we can make this move then we make it 
//this way you don't have to make your player suddenly stop or move it 
//back to the bounds manually   

if(Vector3.Distance(sphereGameObject.transform.position, NewPosition)< radius) 
{ 
//player is in bounds and clear to move 
SetThePlayerNewPosition(); 
} 
+0

OK, ich werde es versuchen, vielen Dank für Ihre Hilfe. – user3177358

1

Was @Milad vorgeschlagen ist richtig, aber auch die Tatsache, dass Sie in der Lage zu „gleitet“ auf der Kugel Grenze nicht, wenn Ihr Bewegungsvektor sogar etwas außerhalb der Kugel geht:

Sphere vector explanation

(sorry für die crappy grafischen Fähigkeiten ...)

Was Sie tun können, wenn Sie auf der Kugelinnenfläche zu „gleiten“ wollen in der Lage sein wird, erhält den Winkel zwischen der Spielerposition gebildet und der X Vektor und dann diesen Winkel mit der Anwendung:

public Transform player; 
public float sphereRadius; 

void LateUpdate() 
{ 
    Vector3 pos = player.position; 
    float angle = Mathf.Atan2(pos.y, pos.x); 
    float distance = Mathf.Clamp(pos.magnitude, 0.0f, sphereRadius); 
    pos.x = Mathf.Cos(angle) * distance; 
    pos.y = Mathf.Sin(angle) * distance; 
    player.position = pos; 
} 

nur sicherstellen, dass dies mit nicht counter Spieler Bewegung Skript bewirken (das ist, warum ich es in meinem Beispiel in LateUpdate() setzen).

+0

Hallo, Kardux: vielen Dank für Ihre Hilfe, es funktioniert gut. – user3177358