2017-05-28 2 views
0

Ich habe einen Spieler und ein paar NPCs. Die NPCs haben zufällige Bewegungen, und ich kontrolliere meine Spielerbewegung. Beide haben RigidBody2D, um sich mit Physik und BoxCollider2D mit Kollisionen zu befassen.Einheit: Stop RigidBody2D von einander schieben

Jedoch, wenn ich in einen NPC gehe, drückt mein Spieler es. Das Gleiche gilt, wenn ein NPC in meinen Player zieht, während der Spieler still steht.

Ich kann die Masse eines Objekts nicht auf eine extreme Zahl setzen, da dies das Verhalten anderer Objekte in meinem Spiel beeinträchtigt.

Was ich will: Wenn ein NPC kollidiert mit dem Spieler, die NPC stoppt (ich diesen Effekt, wenn ich Spieler Masse ab auf 1000, aber dann kann der Spieler die NPC schieben, die ich nicht wollen.), und der NPC agiert als eine "Wand", dh er bewegt sich nicht, aber der Spieler kann ihn auch nicht herumschieben. Wie kann ich das machen?

EDIT: Also habe ich meine eigene Methode für sie:

void OnCollisionEnter2D(Collision2D other){ 
    if (other.gameObject.name == "Player") { 
     collidedWithPlayer = true; //we only move if !collidedWithPlayer 
     isMoving = false; //stop moving 
     myRigidBody.mass = 1000; //turn NPC into "wall" 
    } 
} 

void OnCollisionExit2D(Collision2D other){ 
    if (other.gameObject.name == "Player") { 
     collidedWithPlayer = false; 
     waitCounter = waitTime; //stop NPC from starting to move right after we exit 
     myRigidBody.mass = 1; 
    } 
} 

Ich meine dies funktioniert, aber es gibt keine native Methode, dies zu tun?

Antwort

1

Was Sie versuchen, ist im Wesentlichen eine "realistische" Physik-Engine zu verwenden, um eher unrealistische Physik zu erstellen. Aus diesem Grund wird es nicht von den integrierten Funktionen von Unity unterstützt. Außerdem haben Sie recht, wenn Sie davon ausgehen, dass das Durcheinander mit den Objektmassen keine gute Idee ist.

Hier ist ein Vorschlag, der vermeidet, mit Masse zu spielen. Es ist ein bisschen kluddy, aber versuchen Sie es und sehen Sie, ob es für Sie funktioniert. (Ich nehme an, Ihr Player Starrkörper ist nicht Kinematisch?)

Schritt 1: Erstellen Sie 2 neue Schichten; nenne sie NPCWall und PlayerWall. Richte 2D-Physik so ein, dass der Spieler mit NPCWall kollidiert und NPC mit der PlayerWall kollidiert, aber der Player kollidiert nicht mit NPCs. (Wenn sich NPCs und Spieler auf derselben Ebene befinden, lege sie natürlich auf 2 separate Ebenen.)

Schritt 2: Erstelle ein NPCWall-Prefab, das dieselbe Art von Collider wie die NPCs verwendet. Ich nehme an, Sie haben nur eine Größe von NPC. Erstellen Sie ebenfalls ein PlayerWall-Prefab, das dieselbe Art von Collider wie der Player verwendet. Legen Sie das Prepab NPCWall auf die NPCWall-Ebene und das PlayerWall-Prefab auf die PlayerWall-Ebene fest.

Schritt 3: Wir können die NPCWall nicht zum NPC erziehen, weil sie als Teil des Starrkörpers enden würde. Daher ein einfaches Skript zum NPCWall und PlayerWall hinzufügen:

public class TrackingWall 
{ 
    //This invisible wall follows an NPC around to block the player. 
    //It also follows the player around to block NPCs. 

    Transform followTransform; 

    public void Init(Transform targetTrans) 
    { 
     followTransform = targetTrans; 
     transform.position = followTransform.position; 
     transform.rotation = followTransform.rotation; 
    } 

    void Update() 
    { 
     if (followTransform == null) 
      Destroy(gameObject); 
     transform.position = followTransform.position; 
     transform.rotation = followTransform.rotation; 
    } 
} 

Schritt 4: In der NPC und Spieler-Skripte:

TrackingWall myWallPrefab; 

void Start() 
{ 
    [whatever else you are doing in Start()] 
    TrackingWall myWall = Instantiate<TrackingWall>(myWallPrefab); 
    myWall.Init(transform); 
} 

Offensichtlich für NPCs sollte myWallPrefab zum NPCWall Fertig eingestellt werden, und Für Spieler sollte myWallPrefab auf das Prefab von PlayerWall eingestellt werden.

In der Theorie sollte dies jedem Charakter eine undurchdringliche, unbewegliche Wand geben, die sich nur bewegt, wenn sie es tut, verhindert, dass andere Charaktere sie stoßen, und sich selbst aufräumt, wenn sie zerstört werden. Ich kann nicht garantieren, dass es funktioniert!