Du hast 2 Möglichkeiten.

  1. Level komplett neustarten
  2. GameObjekte nur deaktivieren

Zu 1. SceneManager.LoadScene(SceneManager.GetActiveScene().name);

Zu 2.

Object.SetActive(false);

Bei Neustart durch alle durchloopen und wieder aktivieren. Dazu solltest du aber vielleicht vorher alle zerstörbaren Objekte irgendwo ablegen. Ein Array oder eine List.

Nutzen dann eine for oder foreach schleife und aktiviere sie dann wieder mit true statt false, wenn der Spieler verloren hat oder was auch immer.

Da du Anfänger bist nutze vielleicht lieber 1.)

...zur Antwort

Eine float auf null testen geht meist nicht.

Was du machen kannst:

if(transform.position.y <= 0)
{
// tu was auch immer
}

Willst du was an der Transformation ändern musst du diese erst cachen:

Vector3 pos = transform.position;
pos.y = 0;//hier dann z.b. ändern

Danach kannst du sie zurückführen:

transform.position = pos; 
...zur Antwort

Es wird Zeit, dass du dich mit dem debugger auseinandersetzt.

1.) Wenn du eine Fehlermeldung in der Konsole hast, doppelklicke doch einfach drauf. Meistens zeigt dir das IDE die Probleme.

2.) Man kann im IDE immer mal build oft (F7 Taste) drücken, um zu schauen ob und vir allen welche Probleme auftauchen.

3.) Richte dein IDE so ein, dass autocomplete etc. funktioniert, dann wird dir schon bei schreiben oder Code kopieren mit rot markiert wo die Probleme sind.

...zur Antwort

Der Prusa Slicer ist super, kostenlos und einfach zu Handhaben.

Mit etwas mehr Aufwand bekommt mit dem Cura Slicer auch sehr schöne Drucke hin. Dieser ist ebenfalls kostenlos.

Beschäftigen musst du dich allerdings trotzdem mit der Materie.

...zur Antwort

Also generell solltest du mit solchen Aktionen die Update Loop meiden. Die sollte ausschließlich für Inputs oder im äußersten Notfall verwendet werden.

1* Time.deltaTime// macht übrigens keinen Sinn! Eine Zahl mal 1 ist immer die Zahl. Mathematik 3.Klasse
  1. Für Timer nutze lieber Co-Routinen.
  2. Bei Trigger Collision etwas an oder aus machen.

Quelle: https://docs.unity3d.com/ScriptReference/Collider.OnTriggerEnter.html

void OnTriggerEnter(Collider col)
{
//mit wem collidiere ich bzw. ist das was ich suche drauf
deinScript sc = col.gameObject.GetComponent<deinScript>();//cachen
if(sc!=null)//wenn das was ich suche auf dem collidierten object ist, also ist nicht null
    {
    //mach was auch immer... z.b. starte timer oder was auch immer
    }
}

Gleiches beim Exit

Quelle: https://docs.unity3d.com/ScriptReference/Collider.OnTriggerExit.html

void OnTriggerExit(Collider col)
{
//wer den Collider verlässt und das besagte script das ich suche hat
deinScript sc = col.gameObject.GetComponent<deinScript>();//cachen
if(sc!=null)//wenn das was ich suche auf dem collidierten object ist, also ist nicht null
    {
    //mach was auch immer... z.b. beende timer
    }
}

Spalte deine großen Probleme in viele kleine, dann kommst du einfacher zu Ziel.

Hier zum Thema Co-Routine: https://docs.unity3d.com/ScriptReference/Coroutine.html

Ja es ist schwer, aber sieh es immer von der logischsten Seite.

...zur Antwort

Das Canvas ist normal im Camera View zu sehen, es sei denn du bist im Free Aspect.

Bewegt man die Camera, sollte sich auch der Canvas bewegen, es sein denn es ist ein WorldSpace Canvas. Hier musst du dann die render Order berücksichtigen.

Ist es ein ScreenSpace Overlay Canvas sollte im Game View alles zu sehen sein.

Ist es ein Screen Space Camera, muss eine Camera erst zugewiesen werden.

...zur Antwort

Sollte es ein Bug sein, nutze mal:

transform.position = new Vector2(spawnX, spawnY);

...um den Bug zu verifizieren. Ggf. stimmen aber auch einfach deine World-Space Koordinaten nicht. In solch einem Fall empfiehlt sich Empty GameObjects als Spawn-Punkte nutzen, und dann den Vector des Objektes abzufragen.

...zur Antwort

Sieht so aus als wäre Light Generation aus. Geh auf Window>Rendering>Light Settings und ganz unten ein Haken bei Auto reinmachen.

Kann auch sein, dass die Light Settings wo anders sind. Wer suchet der findet ;)

...zur Antwort

Ich hab deine Frage nicht komplett verstanden, also was nicht geht, oder was schon geht.

Vielleicht reicht es dir das Objekt einfach an den Spieler zu parentieren? das Rigidbody solltest du dann aber kinematic machen beim tragen.

transform.position = col.transform.position;
transform.SetParent(col.transform);
rb2D.isKinematic = true;

https://docs.unity3d.com/ScriptReference/Transform.SetParent.html

Beim werfen machst du das dann rückgängig, und gibst deine force drauf also:

Transform playerTransform = transform.parent;
transform.SetParent(null);
rb.isKinematic = false;

Vector2 direction = new Vector2(playerTransform.forward * power,-0.2f)
rb2D.AddForce(direction, ForceMode2D.Impulse);

Das ist jetzt alles ungetestet, aber so würde ich es versuchen.

https://docs.unity3d.com/ScriptReference/Rigidbody2D.AddForce.html

https://docs.unity3d.com/ScriptReference/Rigidbody2D.html

...zur Antwort

Grundlegend solltest du erstmal Visual Studio Autocomplete usw. einrichten. So lange das nicht ist, suchst du dir jedes mal nen Wolf eh du den Fehler findest.

Als zweites siehst du, dass dein Script nicht richtig geladen werden konnte. Heist man nehme es runter und tue es wieder drauf.

Sollte sich der Klassenname vom Scriptnamen unterscheiden, oder es gibt den Klassennamen schon in einer der Unity Bibliotheken kommt es hier auch oft zu Konflikten.

Und drittens hilft bei möglichen Scripting-Fehlern die:

https://docs.unity3d.com/ScriptReference/Transform.Translate.html

...zur Antwort

void Start()//<< diese Funktion muss immer groß geschrieben werden, wenn sie beim Start ausgeführt werden soll, weil sie Teil von Monobehaviour ist.

https://docs.unity3d.com/ScriptReference/MonoBehaviour.Start.html

...zur Antwort

Das einfachste ist wohl einen Collider zu nutzen. Dann im OnTriggerEnter() OnTriggerStay() oder OnTriggerExit() ausführen was immer nötig ist.

Du kannst auch alle Gegner in Distanz holen mit Vector3.Distance() Dazu musst du dann aber alle kennen und irgendwo ablegen um messen zu können.

Oder nutzt den genannten Ray, und die Ray Länge musst du vorgeben als maximale. Origin ist der Spieler, direction eben die Position zu der gemessen werden soll. Und wenn der ray hitted mache dies ansonsten nichts.

...zur Antwort

Es gibt einige Wege.

Man schieße einen Ray auf ein Objekt, und bekommt info von dem RaycastHit zurück.

Man nutze einen OnPointerEnter/Exit Event.

Man nutze eine OnMouseOver Methode.

Alles hat seine Vor- und Nachteile. Such dir selbst eine raus. In der Scripting Reference gibt es so einiges zu lesen.

...zur Antwort

 abstract class Figur

   {

      public abstract int BerechneFlaeche();//<<<<< Schreibfehler

   }

...zur Antwort

Nein, so geht das nicht.

Du könntest das nur faken, und das pro Baum, bei 100 Bäumen ist sicher auch nicht so zu empfehlen. Aber schau dir das: https://www.youtube.com/watch?v=ogEx-gaNmVI mal an

...zur Antwort

Am besten speicherst du es irgendwo zwischen sobald du eine Instanz davon erstellst, und löschst es wann auch immer du musst.

GameObject tempObject;
public GameObject prefab;

void Erstelle()
{
tempObject = Instantiate(prefab);
}

void Lösche()
{
Destroy(tempObject);
}

Das kannst du auch mit mehreren machen, dazu diese einfach in einem Array oder einer List ablegen.

...zur Antwort