Falsches Objekt bewegt sich

Hallo!
Ich beschäftige mich erst seit kurzem mit Unity und habe noch so meine Probleme mit der Objektzuweisung. Das folgende Script funktioniert einfach nicht richtig. Wer kann mir helfen? Ein Planet soll um eine Sonne kreisen (tut er). Der Planet hat als Kind-Objekte eine Düse und ein Partikel-System, die mitkreisen. Wenn ich per Cursortasten das Partikel-System aktiviere passiert nichts und wenn ich den Planeten drehen will bewegt sich nur die Düse weg.

using UnityEngine;
using System.Collections;

public class Planetenverhalten : MonoBehaviour {
 public Rigidbody planet;
 public Rigidbody sonne;
 public ParticleSystem Schubhinten;

 void Start () {
  planet = GetComponent <Rigidbody> ();
  sonne = GetComponent <Rigidbody> ();
  Schubhinten = GetComponentInChildren <ParticleSystem> ();
  planet.AddForce (Vector3.up * 500);
  planet.AddForce (sonne.transform.position * -1);
 }
   
 void FixedUpdate () {
  planet.AddForce (sonne.transform.position * -1);

  if (Input.GetKey (KeyCode.LeftArrow)) {
     planet.transform.Rotate (0F, 1F, 0F);
  }
  if (Input.GetKey (KeyCode.RightArrow)) {
     planet.transform.Rotate (0F, -1F, 0F);
  }

  if (Input.GetKey (KeyCode.DownArrow)) {
     planet.AddForce (planet.transform.position.forward * 10);
  
  if (Schubhinten.isStopped) {
   Schubhinten.Play ();
  } else if (Schubhinten.isPlaying) {
   Schubhinten.Stop ();
  }}
 }
}

gefragt20.07.2015
Volker10
Volker

2 Antworten

Eine Sache, die für geübte Augen relativ leicht zu erkennen ist, ist dass du Input.GetKey verwendest. Das liefert true, solange die Taste gedrückt gehalten wird, was in FixedUpdate() über mehrere Frames hinweg passieren kann. Benutzer hier besser Input.GetKeyDown - das ist nur einen Frame true, und zwar in dem, in dem die Taste gedrückt wird (im nächsten Frame nicht mehr, auch wenn die Taste weiterhin gedrückt gehalten wird).

Also für planet.AddForce(...) wäre das okay, wenn der Planet immer weiter beschleunigen soll. Dann sollte der Wert aber noch mit Time.fixedDeltaTime multipliziert werden, damit die Beschleunigung nicht abhängig von der Framerate wird.

Ah, okay, was ich auch sehe: Du hast in Start():

planet = GetComponent<Rigidbody>();
sonne = GetComponent<Rigidbody>();
Schubhinten = GetComponentInChildren<ParticleSystem>();

Das überschreibt dir natürlich planet, sonne und Schubhinten, falls du diese über den Inspector im Editor zugewiesen hast. Da würde ich lieber die Zuweisungen im Editor machen - so, wie es da jetzt steht, zeigen planet und sonne immer auf das gleiche Objekt, was ziemlich sicher nicht das ist, was du willst.

Um Genaueres sagen zu können, müsste ich mir mal das Projekt ansehen und es selbst ausprobieren - aber vielleicht hilft das ja schon ein wenig?

beantwortet21.07.2015 Jashan Chittesh 301
Jashan Chittesh
Danke! Das hilft mir schon mal sehr. Ich werde auch versuchen mehr einzelne Scripts pro Objekt statt ein Script für alles zu schreiben. Dann habe ich das Überschreibe-Problem nicht.
Liebe Grüße, Volker
beantwortet21.07.2015 Volker 10
Volker
  • Einzelne Komponenten / Scripts für verschiedene Funktionalitäten macht auf jeden Fall Sinn. Aber das mit dem Überschreiben ist ja kein Problem, wenn du dich nur auf die Zuweisung im Editor verlässt. Oft kann man, wenn man sich darauf nicht verlassen möchte in Start prüfen, ob die Variable (noch) null ist, und in diesem Fall einen Fallback bauen. Für Sonne oder Planet würde das auch hier wahrscheinlich klappen.

    Ah, aber ich glaube jetzt weiß ich, wie du's aufgesetzt hast: Sowohl das Objekt Sonne, als auch das Objekt Planet, als wahrscheinlich auch das Objekt Schubhinten haben diese Komponente zugewiesen bekommen, oder? Das ist in der Tat heikel, da die ja ganz unterschiedliche Aufgaben haben. Da ist dann die Aufteilung in mehrere Scripts auf jeden Fall eine gute Idee :-) - Jashan Chittesh 21.07.2015

Deine Antwort

Um eine Antwort zu geben, musst du Login

Ich markiere diese Frage weil ...

10 übrige Markierungen um Moderator zu informieren

Ich lösche diese Frage weil ...

Ich markiere diese Antwort weil ...

10 übrige Markierungen um Moderator zu informieren

Posting markieren

Du hast diese Beitrag bereits markiert. Klicke "Markierung aufheben" um deine Markierung zu entfernen, was auch die Anzahl der Markierungen um eins reduziert.

Ich lösche diese Antwort weil ...