Jump to content
Unity Insider Forum

Unity - "Wechsel-Funktion" erstellen


Keisi

Recommended Posts

Hallo liebe Leserinnen und Leser,

ich versuche mich an meinem ersten eigenem Spiel. Es soll relativ simpel werden, Grundidee: Es handelt sich um einen Platformer. Der Spieler steuert einen Würfel. Dieser Würfel kann zwischen den Farben schwarz und weiß per linker Maustaste wechseln (Diese Funktion habe ich noch hinbekommen). Nun kommt allerdings mein Problem: Ich möchte, dass der Spieler die Farbe des Würfels der Plattform anpassen muss um darauf landen zu können. Sollte er beispielsweise versuchen mit dem weißen Würfel auf einer schwarzen Plattform zu landen, soll er schlicht und einfach durch die Plattform fallen.

Ich sitze nun schon seit mehrern Tagen daran, diesen Zusammenhang zwischen Farbe und BoxCollider herzustellen und es mag einfach nicht funktionieren. Ich wäre für eure Hilfe sehr dankbar! ;D

Im Anhang findet ihr das Script zum Farbwechsel.

Screenshot (37).png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moinsen!

Benutze für Code bitte gerne den Code-Tag (<> neben dem Unity-Symbol über dem Textfeld), dann kann man besser über den Code reden als mit Screenshots ;)

"Nicht mehr mit Dingen kollidieren" kann man auf mehrere Arten machen:

  1. Mit Physics.IgnoreCollision die Kollision zwischen zwei Objekten ausschalten. Das ist hier weniger sinnvoll, da es um ganze Gruppen von Objekten geht und das ein bisschen oft ausgeführt werden müsste.
  2. Mit der Layer Collision Matrix arbeiten. Auf dem Bild der Anleitung sieht man ganz gut, wie die funktioniert: Du packst ein oder mehrere Objekte in Layer A, dann noch ein oder mehrere in Layer B und schaltest die Kollision zwischen Layern A und B aus. Das ist hier keine schlechte Variante. Du kannst dann einfach deinen Spieler zwischen den Layern "schwarz" und "weiß" wechseln lassen (gameObject.layer = layerBlack, und layerBlack stellst du über eine LayerMask im Inspektor ein).
  3. Etwas krasseres. Jedes GameObject kann nur genau einen Layer haben, wodurch du dir mit Variante 2 die Möglichkeit verbaust, Layer für etwas anderes zu benutzen. Außerdem gibt es nur 32 mögliche Layer. 2 funktioniert also, hat aber potentielle Nachteile. Wenn du diese auf dich zukommen sehen kannst, dann müsste man sich etwas anderes überlegen. Möglich wäre zum Beispiel, dass auf allen Plattformen ein Script ist (klingt krasser, als es ist, wäre nicht unüblich), das sich selbst in eine von mehreren Listen einträgt (eine Liste pro Plattformfarbe). Dann kann dein Player zu diesen Listen gehen und sagen "Alle Plattformen in Liste 'Schwarz' schalten ihren Collider aus". Dadurch würde dann auch die Kollision mit allen anderen Objekten flöten gehen. Wenn das nicht akzeptabel ist, könnte man diese Lösung mit Variante 1 kombinieren und schauen, wie das mit der Performance aussieht.
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 14 Stunden schrieb Sascha:

Benutze für Code bitte gerne den Code-Tag (<> neben dem Unity-Symbol über dem Textfeld), dann kann man besser über den Code reden als mit Screenshots ;)

Alles klar, werde ich mir merken! ;D

Ich habe es mit den Layers schon probiert, allerdings gab es da immer ein Problem. Wenn mein Spieler mit dem weißem Würfel auf ein weißes Feld springt klappes alles, dann wechselt er die Farben und somit auch die Layers, dann klappt auch alles. Wenn mein Spieler jetzt aber wieder auf den weißen Würfel wechselt ist die Layer nicht mehr aktiv durch Physics2D.IgnoreLayer... und ich bräuchte quasi ein Code, welcher dieses Physics2D.Ignore... wieder annuliert quasi.

Gibt es sowas? xD

Wenn ich etwas flasch erkläre / verstanden habe entschuldige ich mich im vorraus dafür! 😜

LG Keisi

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

public class ColorSwap : MonoBehaviour
{
    public Material[] materials;
    public Renderer myRenderer;

    private int index = 1; // dadurch muss man nur einmal auf die Maus drücken, um zu wechseln

    

    private void Start()
    {
        myRenderer = GetComponent<Renderer>(); // lässt mich auf den Renderer zugreifen
        myRenderer.enabled = true; // macht das gerenderte 3D Objekt sichbar, wenn aktiviert
        
    }

    void Update()
    {
        if (materials.Length == 0) // wenn kein Material ausgewählt ist, passiert nichts
        {
            return;
        } 
    
        if (Input.GetMouseButtonDown(0))
        {
            index += 1;  // wenn der Klick erfolgt, geht es auf die nächste Stufe
            if (index == materials.Length + 1)
            {
                index = 1;
            }
            
            myRenderer.sharedMaterial = materials [index - 1];
        }
    
    
    }   
        
}

Nochmal den Code ;D

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 13 Minuten schrieb Keisi:

und ich bräuchte quasi ein Code, welcher dieses Physics2D.Ignore... wieder annuliert quasi.

Die Methode hat einen bool-Parameter. Ist er true, wird ignoriert, rufst du mit denselben Collidern noch einmal, aber mit false, auf, dann wird wieder kollidiert.

Ich würd's aber, wenn nichts (wie beschrieben) explizit dagegenspricht, mit der Layer Collision Matrix-Variante probieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eine andere Methode wäre noch immer zu prüfen, ob die Farbe des Würfels der Farbe der Plattform entspricht auf dem der Würfel landen möchte. Dies könnte man über einen Raycast in Flugrichtung des Würfels (der Velocity seines RB) oder der Steuerrichtung des Spielers herausbekommen. Wenn die Farbe des Würfels nicht passt, dann wird der Collider des Würfels einfach deaktiviert. Das klappt aber nur, wenn der Würfel nur auf einer Plattform landen kann, sobald 2 Plattformen aneinander grenzen können oder der Raycast nicht exakt entscheiden kann wo der Würfel landen wird, dann wird es denke ich mit dieser Methode schwierig. Du musst halt schauen was sich am besten eignet. Jede Methode hat seine Vor- und Nachteile.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ansonsten gibt es glaub noch OnTriggerEnter und du machst den Collider vom Trigger ein wenig weiter nach unten so das er Zeit hat die Plattform zu prüfen.

Dann gibt es noch OnCollisionEnter ich glaube das ich gleich zu behandeln wie mit dem OnTriggerEnter.

Dabei aber nicht den Collider für die eigentliche Kollision nutzen sondern einen zweiten.

Finde aber das meine weg nicht gerade Professionell sind, so hätte ich es aber gemacht :P

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...