Eine einfache und schnelle Möglichkeit hat regex9 vorgestellt. Mit Eigenschaften kannst du kontrollieren, wie mit einem Objekt "von außen" umgegangen werden soll, beispielsweise ob man den Wert in der Variable lesen oder schreiben darf, sowie auf welche Art und Weise.

Eine weitere Möglichkeit wäre das Einführen einer eigenen Klasse. In C# kann man nämlich eine Operatorüberladung vornehmen. Du könntest dann für deine Klasse nur den "+" einführen, aber nicht die anderen arithmetischen Operatoren, sodass man den Wert in einer Instanz dieser Klasse immer nur erhöhen könnte (ist etwas komplizierter als das, weil man dann Objekte miteinander "verrechnet"). Das führt aber an dieser Stelle meiner bescheidenen Meinung nach zu weit, gerade wenn du nicht mehr mit dieser Variable machen möchtest als diese Einschränkung, dass man den Wert in der Variable nur erhöhen darf.

...zur Antwort

Schau dir mal die Überladungen der Methode Object.Instantiate, die du vermutlich benutzt, um deine Prefabs zu instantiieren. Diese Überladung sollte das machen, was du möchtest:

public static Object Instantiate(Object original, Transform parent);

Du übergibst da den Transform von deinem Objekt "carPrefabsManager" als Argument für den Parameter "parent", dann wird dein neu erstelltes Prefab in der Hierarchie als Child dem Objekt "carPrefabsManager" untergeordnet.

...zur Antwort

In C# gibt es Methoden (englisch: „methods"). Das sind Funktionen, die einen logischen Ablauf kaspeln. Als Beispiel stell dir eine Kaffeemaschine vor, die Kaffee kocht. Dann ist die Kaffeemaschine deine Klasse und das Kochen des Kaffee eine Objektmethode:

public class Kaffeemaschine
{
    public Kaffee Kochen(Bohnen bohnen, Wasser wasser, Milch milch)
    {
        Kaffee kaffee = null; // Kaffee existiert noch nicht
        // Kaffeemaschine macht den Kaffee mit Bohnen, Wasser und Milch
        return kaffee; // der Kaffee ist das Ergebnis dieser Methode
    }
}

Damit die Kaffeemaschine aber Kaffee kochen kann, braucht sie Zutaten, nämlich die Bohnen, das Wasser und die Milch. Das sind die Parameter, die vonnöten sind, damit Kaffee in der Methode gekocht werden kann.

Kocht man nun Kaffee, übergibt man für diese Parameter die entsprechenden Werte als Argumente. Ein Parameter definiert hierbei, was für ein Objekt du als Argument übergeben musst. Schau dir zum Beispiel den Code unten an:

public static void Main(string[] args)
{
    Bohnen bohnen = /*...*/;
    Wasser wasser = /*...*/;
    Milch milch = /*...*/;

    Kaffeemaschine maschine = /*...*/;

    Kaffee kaffee = maschine.Kochen(bohnen, wasser, milch);
}

Wenn ich hier mit der Maschine den Kaffee koche, so übergebe ich meine Zutaten bohnen, wasser und milch, die ich mir vorher bereitgelegt habe, an die Kaffeemaschine.

Die tatsächlichen Objekte, die du einer Methode übergibst, das sind die Argumente. Wie diese Objekte aussehen müssen, das definieren die Parameter der Methode.

...zur Antwort

Schau mal in den Terrain Settings nach der Einstellung "Tree Distance". Diese Einstellung entscheidet darüber, ab welcher Distanz zur Kamera die Bäume nicht mehr zu sehen sind.

...zur Antwort

Bei einer verschachtelten IF-ELIF-ELSE Anweisung wird immer nur ein Block ausgeführt, nämlich der, für den die Bedingung zuerst erfüllt ist.

        if (Input.GetKeyDown("A"))
        {
            //...
        } else if (Input.GetKeyDown("W"))
        {
            //...
        }

Wenn in diesem Beispiel 'A' gedrückt wird, dann wird der Block nach der Bedingung ausgerführt, in der geprüft wird, ob 'A' gedrückt wird. Es wird dann aber niemals geprüft, ob 'B' gedrückt wird, weil schon der Fall erfüllt ist, dass 'A' gedrückt wird.

        if (Input.GetKeyDown("A"))
        {
            //...
        }

        if (Input.GetKeyDown("W"))
        {
            //...
        }

Das hier könnte funktionieren, muss aber nicht, es hängt davon ab, wie du deinen Transform bewegst. Je nach Methode kannst du nicht innerhalb einer Frame einen Transform mehrfach bewegen und falls du das versuchst, wird nur die letzte Bewegung ausgeführt.

Du kannst versuchen, die Richtung als lokale Variable abzuspeichern und deine Richtungsänderungen darauf anzuwenden, um schlussendlich nur einmal die Bewegung auszulösen:

Vector3 direction = Vector3.zero;   
     
if (Input.GetKeyDown("A"))
{
    direction += tranform.left;
}

if (Input.GetKeyDown("W"))
{
    direction += transform.forward;
}

//...

// direction verwenden, um die Bewegung in eine Richtung zu realisieren
...zur Antwort

Ja, das ist möglich, gerade auch wegen der großen Fortschritte im Bereich der Photogrammetrie und den vielen Megascans wie Quixel. Schwieriger wird es, an diese Technologien zu kommen, aber ab dann kann man gute Fortschritte machen und ein fotorealistisches Spiel zu entwickeln. Ein Spiel der Größe Halo ist allerdings für 4 Personen etwas hoch gegriffen, aber ein kleines RPG oder dergleichen sollte schon drinnen sein.

...zur Antwort
C# Programm Zweidimensionales Array?

Moin,

sitze schon ne Weile an einem Programm, das einen Integer (nennen wir ihn Zahl ) vom Benutzer einlesen soll. Ausgehend von Zahl soll dann wie folgt ein zweidimensionales Array erstellt werden:

  • das Array ist Zahl x Zahl groß
  • das Element oben links im Array (also [0, 0] ) hat den Wert Zahl x Zahl
  • jedes weitere Element rechts daneben hat jeweils -1 weniger
  • anders beschrieben: es wird von links nach rechts abwärts gezählt beginnend vom Wert Zahl x Zahl

Da ich mir den Lösungsweg Stück für Stück erarbeiten möchte, könnt Ihr auf die komplette Lösung/ bzw. Erklärung verzichten.

Ich weiß, dass man Zeilen und Spalten bei dieser Aufgabe beide mit for-Schleifen erstellen kann, doch der Einfachheit halber möchte ich erst verstehen, wie ich mit den Spalten vorgehen muss.

Ohne for-Schleife bekomme ich die erste Spalte problemlos erstellt und das sieht dann so aus:

oder:

Console.WriteLine("Geben Sie eine Zahl ein, bei der nach dem"+ "Schema Zahl*Zahl ein Array erstellet werden soll:");
            string eingabe = Console.ReadLine();
            int intEingabe = Convert.ToInt32(eingabe);
            Console.WriteLine("\n");
            int[,] eingabeArray = new int[intEingabe,intEingabe];
            int eingabeArrayLänge = intEingabe * intEingabe;

            //Erste Spalte:
            eingabeArray[0, 0] = eingabeArrayLänge;
            eingabeArray[1, 0] = eingabeArray[0, 0] - 1;
            eingabeArray[2, 0] = eingabeArray[1, 0] - 1;
            Console.WriteLine(eingabeArray[0, 0] + "\n" + eingabeArray[1, 0] + "\n" + eingabeArray[2, 0]);

Bis dahin kein Problem doch wie schaffe ich es nun, dass ich die erste Spalte nicht "von Hand" ausfüllen muss? Das muss doch irgendwie mit ner for-Schleife zu machen sein?

Doch ich komme da nicht weiter - egal wie ich es drehe und wende.. Wäre nett wenn jemand mir die passende for-Schleife zeigen könnte.

LG

...zum Beitrag

Schau zum Beispiel mal hier, wie man in C# durch einen multidimensionalen Array iteriert: How do you loop through a multidimensional array?

Dann musst du es nicht von Hand ausfüllen.

...zur Antwort

Das dürfte die Serie Shaolin Wuzang sein, das lief mal auf Kika. Auch die Beschreibung der ersten Folge auf der Wikia-Seite klingt sehr ähnlich.

...zur Antwort

Die Empfehlungen anderer Nutzer bei MyAnimeList sind in der Regel recht verlässlich, siehe https://myanimelist.net/anime/28223/Death_Parade/userrecs

Da sind auch gleich noch mehr Informationen dabei, statt dir hier Titel um die Ohren zu schmeißen. Insbesondere Angel Beats! und Hell Girl kann ich empfehlen.

...zur Antwort

Diese Filme parodieren andere Filme. Es wird zwar in manchen Filmen Bezug auf frühere Filme der Serie genommen ("Hey, du lebst ja wieder!"), im Großen und Ganzen ist aber jeder Film für sich eine geschlossene Einheit, inhaltlich, auch wenn es die gleichen Charaktere in den meisten Filmen sind.

...zur Antwort

Das ist ein bekanntes Problem, schau mal hier, die Person hatte das gleiche Problem. Es gibt verschiedene Lösungsansätze, die beispielsweise hier gelistet sind.

...zur Antwort

Wenn du in Start() die Position der Mouse dir einmal holst, dann bleibst die für den Rest des Spiels gleich, egal wo der Spieler seine Mouse hinbewegt. Du musst die Position der Mouse jedes Mal neu berechnen, bevor du dein Objekt bewegst.

private void FixedUpdate()
{
    mousePosition = camera.ScreenToWorldPoint(Input.mousePosition);
    transform.Translate(mousePosition.normalized  * Stats.BulletSpeed * Time.deltaTime);
}

oder direkt als lokale Variable, ohne Objektfeld in der Klasse:

private void FixedUpdate()
{
    var mousePosition = camera.ScreenToWorldPoint(Input.mousePosition);
    transform.Translate(mousePosition.normalized  * Stats.BulletSpeed * Time.deltaTime);
}

...zur Antwort
10-15 Stunden

Einmal habe ich das gemacht, welchen Anime weiß ich nicht mehr, könnte Soul Eater gewesen sein, morgens um 10 Uhr angefangen und abends so um 9-11 Uhr wieder aufgehört.

...zur Antwort

Löschen von nicht sichtbaren Objekten ist vielleicht der falsche Ansatz beziehungsweise ein Optimierungsdetail, was schlussendlich viel Aufwand mit wenig Nutzen bedeutet.

Schau dir beispielsweise Occlusion Culling an. Das macht schon so was in der Art, es "versteckt" Objekte, die nicht im sichtbaren Bereich sind.

Das Löschen von Objekten macht dann Sinn, wenn du beispielsweise ein fortlaufendes Level hast mit pseudo-unendlich vielen Objekten, so dass irgendwann keine Objekte mehr erstellt werden können. Das dauert allerdings sehr lange, bis man den Punkt mal erreicht hat.

...zur Antwort

Das ist ein bekanntes Problem, schau mal hier, die Person hatte das gleiche Problem. Es gibt verschiedene Lösungsansätze, die beispielsweise hier gelistet sind.

...zur Antwort

Probier mal die Lösungsvorschläge hier: Mouse cursor is invisible in unity

...zur Antwort