Jump to content
Unity Insider Forum

Neue Startposition für Spieler in Waypoint System


YLmizzla

Recommended Posts

Liebe Community,

ich benötige eure Hilfe bei meinem ersten Spiel. Leider bin ich ein Anfänger, was das Programmieren angeht. Ich habe zwar einige Tutorial gemacht und versucht meinen Fehler zu finden, aber ohne Erfolg. Vielen Dank schonmal im Voraus für eure Hilfe!

Mein Spiel beinhaltet bisher drei Skripte.

Skript 1: "RolltheDice" --> in diesem Skript wird ein Würfel physikalisch gerollt und nach einer Pause von 10 Sekunden das Würfelauge bestimmt.

public class RollTheDice : MonoBehaviour
{
    private Rigidbody diceRb;
    private float speed = 1000f;
    private RayCast rayCastDice;
    public Button rollDiceButton;
    public FollowthePath moveAllowed;



    void Start()
    {
        diceRb = gameObject.GetComponent<Rigidbody>();
        rayCastDice = FindObjectOfType<RayCast>();
        moveAllowed = FindObjectOfType<FollowthePath>();
    }

    void Update()
    {
        StartCoroutine(GetSide());
    }
    public void RollDice()
    {
        float dirX = Random.Range(0, 500);
        float dirY = Random.Range(0, 500);
        float dirZ = Random.Range(0, 500);

        transform.position = new Vector3(-90, 5, 14);
        diceRb.AddForce(transform.up * speed);
        diceRb.AddTorque(dirX, dirY, dirZ);
    }

    private IEnumerator GetSide()
    {
        yield return new WaitForSeconds(10);

        rayCastDice.RayCastCollider();

    }
}

Skript 2: "RayCast" --> hierbei wird der Raycast erzeugt und das Würfelauge in die Variable diceSideNumber gespeichert. Hier ein Auszug aus dem Skript:

public class RayCast : MonoBehaviour
{
    public GameObject[] diceSides;

    public int diceSideNumber;

    // Raycasts werden initialisiert
    public void RayCastCollider()
    {
        // Initialisieren der Strahlen
        RaycastHit hit;

        if(Physics.Raycast(diceSides[0].transform.position, diceSides[0].transform.up, out hit, 5f))
        {
            Debug.DrawRay(diceSides[0].transform.position, diceSides[0].transform.up * 5F);
            diceSideNumber = 1;
        }
        else if(Physics.Raycast(diceSides[1].transform.position, diceSides[1].transform.up, out hit, 5f))
        {
            Debug.DrawRay(diceSides[1].transform.position, diceSides[1].transform.up * 5F);
            diceSideNumber = 2;
        }

Skript 3: "FollowthePath" --> in diesem Skript wird der Player bewegt:

public class FollowthePath : MonoBehaviour
{
    //Variables
    public Transform[] wayPoints;

    private float moveSpeed = 5.0f;

    public RayCast sideNumber;
    
    void Start()
    {
        transform.position = wayPoints[0].transform.position;
        sideNumber = FindObjectOfType<RayCast>();
        newStartPoint = FindObjectOfType<GameManager>();
    }


    private void Update()
    {
        Move();

    }

    public void Move()
    {
        if (sideNumber.diceSideNumber <= wayPoints.Length - 1)
        {
            transform.position = Vector3.MoveTowards(transform.position, wayPoints[sideNumber.diceSideNumber].transform.position,        moveSpeed * Time.deltaTime);
        }
        if (transform.position == wayPoints[sideNumber.diceSideNumber].transform.position)
        {
            //sideNumber.diceSideNumber += 1;
            Debug.Log(sideNumber.diceSideNumber);
        }

    }
}

Nun zu meinem Problem:

Beim ersten Würfeln passt soweit alles, d.h. der Würfel rollt und die Zahl wird korrekt ausgegeben und der Spieler bewegt sich auf den erwünschten wayPoint.

Beim zweiten Würfeln bewegt sich der Spieler wiederum auf die ermittelte Zahlt und auf das zugewiesene Feld.

Ich schaffe es leider nicht dem Computer zu sagen, dass er sich den 1. Wurf und die dazugehörige Zahl "merken" muss und dann die neue Zahl beim 2. Wurf dazuzuaddieren.

Ich habe schon viele Möglichkeiten ausprobiert, aber es hat leider nie wirklich geklappt.

Ich hoffe ihr habt eine Idee, wie ich das umsetzen kann :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

Am 24.1.2021 um 16:43 schrieb YLmizzla:

Ich schaffe es leider nicht dem Computer zu sagen, dass er sich den 1. Wurf und die dazugehörige Zahl "merken" muss und dann die neue Zahl beim 2. Wurf dazuzuaddieren.

Wenn du eine Variable deklarierst, die zum Zwischenspeichern dient und dort die dazugehörige Zahl von 1.Wurf zuweist, anschließend diesen Wert dem 2. Wurf dazu addierst müsste das funktionieren. Aber nicht vergessen anschließend die Zwischenspeicher Variable wieder auf den wert 0 zu setzen wenn du diesen wert nicht mehr führ eine Berechnung brauchst.

 

Gruß Jog

Link zu diesem Kommentar
Auf anderen Seiten teilen

such nach Stichwörtern wie static oder Nachrichten senden an andere Objekte. 

Stell dir das so vor. In meinem Kopf ist Wissen zum Thema programmieren, aber in deinem nicht. Mein Gehirn in deins verpflanzen geht heute nicht. Unsere Gehirne sind auch nicht anders physisch verbunden. Also verwenden wir dieses Forum. Es ist static. Das Wissen bleibt hier drin stehen. Bis du es gelesen hast. 

Oder ich schicke dir persönlich oder über telefon oder chat eine Nachricht direkt. Das ist das die Funktion zur Nachricht Übermittlung. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Am 27.1.2021 um 21:42 schrieb Sascha:

Nicht vergessen, das auch für die Nachwelt zu posten!

Ja da hast du recht! Mir hat dieses Videotutorial super geholfen: https://www.youtube.com/watch?v=W8ielU8iURI

Vor allem das if-Statement regelt die neue "Startposition":

if (player.GetComponent<FollowthePath>().wayPointIndex > playerStartWayPoint + diceSideThrow)
        { 
            player.GetComponent<FollowthePath>().moveAllowed = false;
            playerStartWayPoint = player.GetComponent<FollowthePath>().wayPointIndex - 1;
  
  // In diceSideThrow wird das Würfelauge aus dem Raycast-Skript gespeichert.

 

Ich hätte noch eine weitere Frage. Die ist zwar noch nicht aktuell, aber dann kann ich das Vorgehen schonmal planen.

Das Spiel soll später die Möglichkeit beinhalten, dass 2, 3 oder 4 Spieler gegeneinander antreten. Ist es da sinnvoll einfach 3 Szenen zu haben, die dann über das Hauptmenü aufgerufen werden? Oder ist es besser, dass über ein Skript zu lösen?

Mfg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...