Jump to content
Unity Insider Forum
Sign in to follow this  
Rasmusen

transform.Position Stop vom Background und Enemy bei Event

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.

Share this post


Link to post
Share on other sites

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

  • Like 1

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Ok ich schau mir das mal heute Abend an. Ich werde wohl einige Tutorials dazu machen müssen wie das mit dem GetComponent<anderesScript> zu lösen ist. Aber wenigstens stoppen schonmal die beiden Collider beim aufeinander Treffen. Dafür bin ich echt schon dankbar.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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 ^^

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Dafür finde ich Delegates bzw. Events super ^^

Sind zugegebenermaßen recht schwer zu verstehen aber gerade für solche Sachen sehr nützlich :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...