Jump to content
Unity Insider Forum
M0rrr1tz

Zufallsgenerator mit Objekten verknüpfen

Recommended Posts

Hallo zusammen,

ich bin neu bei unity und habe eine frage für ein Projekt. 
 

Kann mir jemand erklären, wie ich einen Zufalls generator in C# mach welcher beispielsweise eine Zahl von 1-10 auswirft. Jede Zahl soll jeweils mit zwei Objekten verknüpft sein, welche anschließend angezeigt werden sollen.

Beispiel:

Zahlenraum 1 - 3 

1=a,b

2=c,d

3=e,f

Zufallszahl = 2
Angezeigt werden also Objekt c und d

Share this post


Link to post
Share on other sites

Inzwischen habe ich es geschafft eine zufällige Zahl aus zu spucken. Jedoch weis ich leider nicht wie machen soll :(

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RandomThings : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        float randomZahl = 0;
        randomZahl = Random.Range(0, 10);
        Debug.Log(randomZahl);
    }

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

}

 

Share this post


Link to post
Share on other sites

Willkommen! :)


Das ist nicht ganz so schwer.
Als Erstes musst du deine Zufallszahl generieren. Du hast das schon fast richtig gemacht. Anstatt float brauchst du aber ein Variable vom Typ int.
Float ist eine Gleitkommazahl, und dann kann z.B. 3,6574352760 als Ergebnis raus kommen. Das willst du ja nicht, du willst ja ganze Zahlen von 1 bis 10.
Deswegen nimmst du den Typ int, was ein ganzzahliger Wert ist.
Damit deine Zufallszahl auch wirklich zwischen 1 und 10 ist, muss der Max-Wert für deine Berechnung eins höhter sein.
Eine Zufallszahl zwischen 1 und 10 bekommst du also so raus:

int zufall = Random.Range(1,11); // gibt eine zufällige Zahl zurück die min. 1 ist und max. 10 ist


Über diese nun gefundene Zahl, die in der Variable zufall abgespeichert ist, sollen jetzt je 2 Objekte angezeigt werden.
Dafür musst du jetzt einfach nur die Zahl nutzen.

if(zufall == 1){
  // zeige Objekt a und Objekt b
}
if(zufall == 2){
  // zeige Objekt c und Objekt d
}
// usw.

Was bei dir jetzt "anzeigen" bedeutet weiß ich nicht. Es könnte ja sein, dass die Objekte schon in der Szene an einem Platz außerhalb des Sichtfeldes liegen. Wenn ja, dann musst du sie einfach nur an die Richtige Position bringen.
Es kann auch sein, dass sie noch garnicht da sind, dann musst du sie instanzieren.
Oder aber sie sind schon an richtiger Position, aber der Renderer des Objektes oder das ganze Objekt selbst ist deaktiviert, dann musst du es eben aktivieren.

Du kannst die Objekte von diesem Script aus steuern oder aber jedes Objekt, welches schon in der Szene sein muss, fragt einfach den Zufallswert ab und macht dann selbst die Dinge.

Willst du das von diesem Script aus tun, dann muss dein Script jedes einzelne Objekt kennen. Du musst also für jedes einzelne Objekt eine Variable gebildet haben und diese Variable mit dem Objekt verknüpft haben.
 

Sollen die Objekte selbst agieren und die Nummer einfach abfragen, dann muss die zufall Variable public sein. Sie kann also nicht innerhalb einer Methode/Funktion generiert werden. Sie muss außerhalb davon deklariert sein.
Zusätzlich muss jetzt jedes Objekt, was dargestellt werden soll, das Gameobjekt kennen, wo der Zufallscode drauf läuft. Oder aber du nutzt Events auf die die Obejkte hören.

Na ja.
Wie dem auch sei, du musst leider die grundlegenden Sachen über c# und Unity erst einmal lernen um das hinzubekommen.

  • Finden von Gameobjects bzw. das Verknüpfen von GameObjects/Komponenten mit einer Variable.
  • Kommunikation zwischen GameObjects
  • Zugriff auf die Komponenten der Gameobjects und Manipulation der Werte/Eigenschaften.
  • Unterschiede zwischen Variablentypen und was bedeuten die Modifizierer public, private, static usw.
  • Prefabs und Instanzieren von Objekten
  • ja und natürlich c# allgemein.

Tja, so isses.

 

  • Like 1

Share this post


Link to post
Share on other sites

Moin!

(ich habe heute morgen angefangen, das hier zu schreiben, und dann ist etwas dazwischen gekommen... jetzt gibt's schon andere Antworten :))

Also, erstmal spuckt Random.Range dir, wenn du zwei ints reinsteckst, auch wieder ein int raus. Ist nicht sinnvoll, das ohne Grund in eine float-Variable zu speichern. Darüber hinaus (nur, um sicherzugehen) ist die Obergrenze bei zwei ints exklusiv, das heißt: Du kriegst bei (0, 10) Zahlen zwischen 0 und 9, inklusive. Ist ja aber vielleicht Absicht :)

Wenn du "Objekte anzeigen" willst, musst du dir überlegen, wie das überhaupt passieren soll. Willst du neue Objekte spawnen - oder sind alle Objekte in der Szene und die inaktiven werden einfach ausgeblendet? Letzteres macht das Verknüpfen schön einfach, also nehme ich das mal als Beispiel.

public GameObject[] objects;

(Wie so oft der Hinweis: Code vereinfacht, damit's nicht unnötig verwirrend ist, würde man auf lange Sicht evtl. etwas anders machen.)

Hier hast du ein GameObject-Array, also eine Liste, in die du im Inspektor beliebig viele GameObjects reinziehen kannst.

Ich bin mir natürlich nicht ganz sicher, ob ich dein gewünschtes Ergebnis richtig verstanden habe, aber prinzipiell willst du X "Eimer" haben, und in jeden Eimer kommen (möglichst) gleich viele Objekte. In deinem Beispiel also 3 Eimer, 6 Objekte, macht 2 Objekte pro Eimer. Dann willst du einen Eimer zufällig auswählen. Richtig?

Dann könntest du das z.B. so machen:

public int numberOfGroups = 3;

private void Start()
{
  // Beispiel: 2 Objekte pro Gruppe
  var objectsPerGroup = objects.Length / numberOfGroups;
  
  // Welche der drei Gruppen soll aktiviert werden?
  var activeGroupIndex = Random.Range(0, numberOfGroups);
  
  // In der Liste, welche Objekte werden aktiviert?
  // 
  var activeStart = activeGroupIndex * objectsPerGroup;
  var activeEnd = (activeGroupIndex + 1) * objectsPerGroup;
  
  for (var i = 0; i < objects.Length; i++)
  {
    var active = i >= activeStart && i < activeEnd;
    objects[i].SetActive(active);
  }
}

So, als Edit zu @malzbies Post... ganz viele if-else-s sind natürlich initial recht simpel zu verstehen, sollten aber auf lange Sicht eher vermieden werden, weil du jedes Mal den Code ändern musst, wenn sich eine Kleinigkeit ändert - und bei solchen Änderungen entstehen die meisten Fehler.

Meine Lösung ist sicherlich anfangs schwerer zu verstehen, aber wenn du die Zeit hast, versuch mal, dich da ranzuwagen :)

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

×
×
  • Create New...