Jump to content
Unity Insider Forum

transform.Position Stop vom Background und Enemy bei Event


Rasmusen

Recommended Posts

Hi, Ich habe ein Script an meinen Enemy gebunden welches auch teilweise funktioniert. Der Enemy läuft auf einen unbewegten Spieler zu und wenn er dessen Colider trifft dann soll er anhalten.

Der OnTrigger funktioniert. Ich habs getestet mit Destroy. Aber leider hält der Enemy nicht an sondern läuft weiter.

 

Hier das Script

using UnityEngine;
using System.Collections;
public class enemymove : MonoBehaviour {

public float speed = -3f;
public float speedstop = 0f;
private Rigidbody2D myBody;
// Use this for initialization
void Awake () {
 myBody = GetComponent<Rigidbody2D> ();
}

// Update is called once per frame
void Update () {
 myBody.velocity = new Vector2 (speed, 0);
}
void OnTriggerEnter2D(Collider2D otherObj) {
 if (otherObj.gameObject.tag == "Skeleton") {
  // GetComponent<ParticleSystem> ().Play ();
  myBody.velocity = new Vector2 (speedstop, 0);
 }
}
}

 

 

 

Es gibt aber noch ein Rätsel . Mein Background Scrolling Script sollte auch anhalten wenn diese beiden sich treffen. Aber da habe ich gar keine Ahnung weil das Background Script ist ja ein völlig anderes Script an mehrere Background angebunden (wegen Paralax Scrolling) wie ich das untereinander vermittle. Hier mein Background Scroll Script :

 

using UnityEngine;
using System.Collections;
public class BackgroundScroll : MonoBehaviour {
public float speed = 0;
public BackgroundScroll current;
   public float tileSize = 0;
   float pos = 0;
Renderer my_renderer;
// Use this for initialization
void Start () {
 current = this;

}

// Update is called once per frame
void Update(){

 pos += speed;
 if (pos < -tileSize)
  pos += tileSize;
 current.transform.position = new Vector3 (pos, current.transform.position.y, current.transform.position.z);
 //my_renderer.material.mainTextureOffset = new Vector2 (pos, 0);
}

}

 

Es wäre echt total gut wenn mir jemand helfen kann. Ich muss unbedingt den Enemy anhalten und wenn möglich auch den Background.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Update Methode und die OnTriggerEnter2D Methode sind zwei völlig unabhängige Methoden. Update wird jeden Frame aufgerufen. OnTrigger jedoch nur in dem Frame, wo der Trigger eben Aktiviert wird. Jedoch läuft die Update Methoden trotzdem Frame für Frame weiter sodass die velocity deines Enemys direkt im nächsten Frame wieder auf speed gesetzt wird. Baue stattdessen lieber eine Variable ein, die bei OnTriggerEnter auf true gesetzt wird. Dann brauchst du im Update nur noch abfragen ob die Variable auf true oder false ist und je nach dem eben deine Geschwindigkeit setzen.

 

Das gleiche gilt natürlich auch für dein Background script

Link zu diesem Kommentar
Auf anderen Seiten teilen

Super Tip , das ging : Der Bool = True und wird auf False gesetzt wenn die Trigger Colliden . Aber ich weis nicht wie ich das an das Background Script übermittle . Also so das ich im Move.Script den True oder False Wert auch weitergebe an das Background Scroll Script. Sorry , das mag eine Noobfrage sein , aber ich weis echt nicht wie ich Werte oder Variablen an andere Scripte weitergebe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du kannst das auf mehreren Arten lösen. Zum einen könntest du die bool Variable als static definieren. Das ist einfach und geht schnell und du kannst die Variable von allen Skripten aus direkt ansprechen ohne irgendetwas zuweisen zu müssen. Macht hier aber eher wenig sinn, da man Static Variablen meist nur benutzen sollte, wenn man das Script nur ein einziges mal instanziiert, weil sonst mehrere Scripte an der gleichen Variable rumfummeln. Das ist hier in deinem Kontext eher Kontraproduktiv, da du sicher mehrere Enemys hast, die mit irgendetwas kollidieren.

Besser wäre es dann, wenn du die Colliderabrfrage beim Spieler machst und dem Spieler den Trigger gibst. Dann kann dein Spielerscript immer Abfragen ob ein Enemy mit ihm Kollidiert. Dann müsstest du nur mit GetComponent<> != null abfragen ob das was der Spieler gerade getroffen hat, auch ein Enemy ist. Da du auch nur einen Spieler hast der gerade gesteuert wird, kannst du hier gut eine static bool variable verwenden. in deinem Backgroundscript kannst du dann ganz einfach mit Klassennamen.Variablenname abfragen ob false oder true.

 

Die Zweite möglichkeit ist, dass du deinem Enemy das BackgroundScroll-Skript zuweist und dann eine weitere Variable im BackgroundScroll Skript auf true oder false setzt und du dann im BackgroundScroll-Skript die variable als abfrage benutzen kannst. Das funktioniert auch, ist aber eher unschön da du jedem Enemy dann beim Spawnen oder im Inspector das BackgroundScroll skript zuweisen musst. Außerdem kannst du dann auch keine Abfragen mehr von anderen Skripten machen, solange du nicht jedes mal eine neue Variable erstellst.

 

Ich denke mal die erste Variante wäre hier besser.

Es gibt auch noch andere Möglichkeiten aber die wären noch unschöner.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also habs jetzt doch hinbekommen. ich zeig nun das Background Script :

 

using UnityEngine;
using System.Collections;
public class BackgroundScroll : MonoBehaviour {
public float speed = 0;
public BackgroundScroll current;
   public float tileSize = 0;
   float pos = 0;
Renderer my_renderer;
// Use this for initialization
void Start () {
 current = this;

}

// Update is called once per frame
void Update(){
 if (enemymove.canmove == true) {
  pos += speed;
  if (pos < -tileSize)
   pos += tileSize;
  current.transform.position = new Vector3 (pos, current.transform.position.y, current.transform.position.z);
  //my_renderer.material.mainTextureOffset = new Vector2 (pos, 0);
 } else {
 }
}

}

 

} else { ist leer weil ja nichts anderes passieren soll. Wenn das Spiel nun wieder weiter geht werde ich den Wert einfach wieder auf True zurück setzten.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn else leer ist, dann lass es doch einfach weg ^^

einen bool auf == true zu testen ist auch unnötig ;)

da steht dann true == true was zu true evaluiert wird oder false == true was zu false wird, also kannst du das == true einfach weglassen ^^

 

Jup. Ich ergänze mal:

if(var == true) ist das gleiche wie if(var)

und if(var == false) ist das gleiche wie if(!var)

 

 

@Rasmusen:

Bei static musst du halt nur aufpassen weil die canmove Variable nicht zu den einzelnen Objekten gehört sondern global für alle gleich ist. Aber wenns geht, dann gehts :P

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bin voll happy wegen eurer Hilfe . Aber ich bin ja noch lange nicht fertig . Ich muss dann ja später das alles auch wieder so setzten das Background wieder läuft und Enemy und Player . Und da wirds dann wieder spannend. Aber weis jemand ein Tutorial wo genau drin steht wie man einen bool Status bei bestimmten Ereignissen an ein anderes Script sendet und dort den Wert weiter verarbeitet. Weil das Abfragen des bool Wertes ist ja der Nachteil das das andauernd abgefragt werden muss und nicht erst wenn der Wert sich geändert hat. Es macht glaub mehr Sinn die Änderung des Bools an die betroffenen Scripte auch bekannt zu geben. Aber ich weis nicht wie ich danach googlen soll.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...