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

Förderband simulieren

Recommended Posts

Hallo!

Bin dabei ein einfaches Förderband zu "simulieren". Dazu habe ich einen Cube erstellt und auf 20 x 1 x 0.1 skaliert.
Ein Collider als Trigger wurde um dieses Band gelegt.

Das Skript reagiert nun auf "void OnTriggerStay(Collider col)".
Mit einem "col.transform.Translate (Vector3.forward * speed * Time.deltaTime);" lasse ich nun alle Objekte "forward" laufen.

Folgende Frage: so muss ich immer darauf achten, dass die "forward"-Seite des Objekts richtig liegt.
Ansonsten läuft das Objekt nicht am Band entlang, sondern links/rechts vom Band weg oder nach hinten.
Weil aber später die Spieler Objekte in beliebiger Orientierung auf das Band legen können sollen,
frage ich mich, ob ich dem Objekt nicht die "richtige" Richtung dem Objekt mitgeben kann - statt "forward".

Mit "col.transform.position = Vector3.MoveTowards (col.transform.position, endpoint.position, speed * Time.deltaTime);"
geht es zu einem definierten Ende-Punkt (in dem Fall "endpoint.position" am Ende des Laufbands).
Egal in welcher Orientierung! Aber dann habe ich das Problem, dass das Objekt auf einen Punkt zuläuft
und auf dem Band selbst "die Spur wechselt" und eben nicht "gerade" läuft.

Wichtiger wird dann auch: wenn ich dann so ein "Laufband" im Halbkreis eine 180° Drehung machen lasse:
dann sehe ich nur die Möglichkeit, die Objekte an Hand von "Waypoints" laufen zu lassen.
Wüsste nicht, wie ich sonst die 180°-Drehung machen kann bei der sich das Objekt mit "dreht".

Evtl. ist die Frage unklar - bitte einfach Bescheid geben, wenn nicht klar ist, wo der Schuh drückt ...

Vielen Dank!
Leftwing

Share this post


Link to post
Share on other sites

Also ich hab was ähnliches und nutze es so:

transform.position = transform.position + transform.forward * charakterLaufgeschwindigkeit * (Time.deltaTime * timeScaleMultiplikator);

Zum drehen:

transform.rotation = Quaternion.RotateTowards(transform.rotation, zielRotation, charakterDrehgeschwindigkeit * (Time.deltaTime * timeScaleMultiplikator));

Vector3 bezieht sich immer auf Globale Ebene, Transform hingegen immer auf das Objekt an sich. Nutzt du also Transform.forward wird die Reise immer in die Richtung des blauen Pfeiles gehen.

Share this post


Link to post
Share on other sites

Es kommt drauf an wie realistisch du dein Förderband umsetzen willst. Natürlich kann man den Ansatz von @Kojote verwenden und deine Objekte werden Fix auf dem Förderband bewegt. Wenn du es allerdings etwas dynamischer haben möchtest, dann verwende lieber Rigidbodys zur Bewegung deiner Objekte auf dem Förderband.

Mit velocity oder AddForce kann man eine Kraft auf die Objekte einwirken lassen die auf dem Förderband liegen.

Mit Vector3.forward hast du auch nur die Weltrichtung und nicht die relative Richtung von deinem Fließband. Diese erhälst du wenn du transform.forward benutzt.

 

Share this post


Link to post
Share on other sites

@Kojote: Vielen Dank. Insbesondere für den Hinweis bzgl. Vector3 und der globalen Ebene.
Mit Transform kann ich jetzt das Objekt beliebig legen.
Was ich noch nicht nachvollziehen kann: die Strecke macht über einen Halbkreis eine 180° Wende.
Wie bringe ich dem Objekt hier die Drehung bei?

@Helishcoffe: Auch Danke! Was bedeutet es nun, Rigidbodys zur Bewegung zu nutzen?
Lege ich dann den Rigidbody über das Förderband und bewege dieses - mit den Objekten darauf?
Dann müsste ich im Fall des "Kurve" (ein Förderband welches einen Halbkreis nachzeichnet) einzelne Segmente bauen?

Share this post


Link to post
Share on other sites

Du musst erst mal einen Trigger haben, der dir sagt, in welche Richtung die Drehung geht und speicherst dir das, z.B.:

zielRotation = Quaternion.Euler(0f, -90f, 0f);

Das ganze zu drehen machst du entweder in der FixedUpdate- oder Update-Methode:

private void FixedUpdate(){ 
    if (aktionDrehen) {
         transform.rotation = Quaternion.RotateTowards(transform.rotation, zielRotation,   
         charakterDrehgeschwindigkeit * Time.deltaTime);
    }
}

Nun musst du noch kontrollieren, ob die Drehung komplett ist, am besten in einer Coroutine:

 // Ueberpruefung aller 0.05 Sekunden, ob die Zielrotation erreicht wurde
    private IEnumerator DrehenCoroutine() {
        aktionDrehen = true;
        bool drehenBeenden = false;
        yield return new WaitForFixedUpdate();
        do {
            drehenBeenden = DrehenCheck();
            yield return new WaitForFixedUpdate();
        } while (!drehenBeenden);
        aktionDrehen = false;
        transform.rotation = zielRotation;
    }


    // Pruefen ob die Zielrotation erreicht wurde
    private bool DrehenCheck() {
        aktuelleRotation = Quaternion.Euler(0f, this.transform.rotation.eulerAngles.y, 0f);
        float winkel = Quaternion.Angle(aktuelleRotation, zielRotation);
        bool gleicheRotation = Mathf.Abs(winkel) < 1f;
        if (gleicheRotation) {
            return true;
        } else {
            return false;
        }
    }

 

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