Jump to content
Unity Insider Forum

MustafGames

Members
  • Content Count

    406
  • Joined

  • Last visited

  • Days Won

    4

MustafGames last won the day on February 20

MustafGames had the most liked content!

Community Reputation

10 Gut

About MustafGames

  • Rank
    Advanced Member

Recent Profile Visitors

1,290 profile views
  1. Gruß, habe folgende Methode für meine Sammlung an nützlichen Methoden: public static IEnumerator StopCoroutineAfterDelay (Coroutine cor, float delay) { yield return new WaitForSeconds(delay); Camera.main.GetComponent<MonoBehaviour>().StopCoroutine(cor); yield break; } diese stopt die Coroutine aber leider nicht auch wenn ich statt Camera.main die Klasse angebe wo die Coroutine auch gestartet wurde. Als statische Methode wäre es schon ganz sinnvoll, sonst hätte ich in 10 Scripts die selbe Methode drin. Woran liegt das? Mfg Mustaf PS: Mir ist gerade aufgefallen wenn ich hier das DarkTheme auswähle als Webseitendesign, dann ist die Schrift vom "Folgen Button (wo man bei Antworten benachrichtigt wird)" unsichtbar.
  2. Danke klappt super, genau das was ich wollte. In nachhinein ist mir aber auch noch eingefallen, man könnte es sich ja einfacher machen und einfach paar mal die selben Objekte in die Liste setzen und so die Wahrscheinlichkeit einstellen und dann Random(0, listsize) nehmen.
  3. Gruß, using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Runtime.Serialization.Formatters.Binary; using System.IO; public class SaveAndLoad : MonoBehaviour { public void Save (Object data, string filename) { BinaryFormatter bf = new BinaryFormatter(); FileStream file = File.Create(Application.persistentDataPath + "Saves/" + filename + ".dat"); data.score = score; data.levelcount = levelcount; bf.Serialize(file, data); file.Close(); } public void Load (string filename) { if (File.Exists(Application.persistentDataPath + "/playerInfo.dat")) { BinaryFormatter bf = new BinaryFormatter(); FileStream file = File.Open(Application.persistentDataPath + "Saves/" + filename + ".dat", FileMode.Open); PlayerData data = (PlayerData) bf.Deserialize(file); file.Close(); score = data.score; levelcount = data.levelcount; } } } Habe dein Code jetzt nicht runtergeladen, am besten nutzt die Kopie & Paste und bei Beitrag bearbeiten das <> Symbol um deinen Code zu posten. Diesen hier habe ich im Netz gefunden und dieser Sieht bis auf PlayerData (was ein Custom Script ist) ganz sinnvoll aus, laut dem Schreiber kann man mit diesem Code auf jeder Plattform seine Sachen speichern, vielleicht kann mir jemand dazu eine Info geben.
  4. Gruß, habe da mal wieder etwas gefunden wo ich nicht weiter komme (Mathe halt): Angenommen wird haben eine Liste mit 8 Objekten, dann soll eine Methode per Zufall entscheiden welches Objekt genommen wird, dieser Zufall soll noch beeinflusst werden von der Position des Objektes in der Liste (Objekt 1 hat eine höhere Wahrscheinlichkeit als Objekt 2 usw..). public static int GetPercentageByList (int listSize) { if (listSize > 0) { for (int i = 0; i < listSize; i++) { float chance = (100.0f / (float)i) * 0.01f; if (Random.value <= chance) { return i; } } } return 0; } Liege ich mit meiner Variante richtig? MfG Mustaf.
  5. Nach reichlicher Suche habe ich nun mich entschieden ein Package zu integrieren was ein A* Pathfinding System für Tilemaps bietet, da sowas selber zuschreiben zu kompliziert ist und vielleicht am Ende nicht einmal so ausgereift wie es angeboten wird.
  6. Verstehe jetzt das Problem nicht ganz, meine Art und Weise mein Spiel zu entwickeln ist natürlich deutlich anders als bei allen anderen. Hab es nun anders gelöst, diese Variante das im Runtime eine Kopie erstellt werden soll wäre zwar für mich nicht übel aber im Moment nutze ich diesen Script (ScriptableObject) zum speichern von z.b. Spieleinstellungen, Allgemeine Werte (Minimale Angelzeit und Maximale Angelzeit).
  7. Also in meinem Fall ist es wie @Sascha gesagt hat, ich habe eine Methodensammlung und diese möchte ich nach Kategorien trennen (per Region), sonst verliere ich den Überblick wenn ich mal 1 Monat diese Klasse mir nicht angesehen habe. Eine etwas andere Frage wäre noch, wenn Visual Studio einen Script lädt, ist es da möglich alle Methoden eingeklappt zulassen am Anfang, normalerweise ist es ja so das beim laden eines Scriptes oder neuladen eines Projektes alle Methoden aufgeklappt sind?
  8. Genau das richtige Vielleicht gibt es ja noch weitere nützliche Funktionen die ich noch nicht kenne z.b #if
  9. Hier der aktuelle Scriptausschnitt: public static List<Vector2> GetWaypoints (Tilemap t, Vector2 startPos, Vector2 endPos) { CompositeCollider2D col = t.GetComponent<CompositeCollider2D>(); Vector3 cellStartPos = t.GetCellCenterWorld(t.WorldToCell(startPos)); Vector3 cellEndPos = t.GetCellCenterWorld(t.WorldToCell(endPos)); //Erstelle eine Liste aller möglichen Wegpunkte List<Vector2> possiblePoints = new List<Vector2>(); int dis = Mathf.RoundToInt(Vector2.Distance(cellStartPos, cellEndPos) * 10); for (int x = -dis; x <= dis; x++) { for (int y = -dis; y <= dis; y++) { Vector2 curPos = new Vector2(cellStartPos.x + (x * 0.16f), cellStartPos.y + (y * 0.16f)); if (!col.OverlapPoint(curPos)) { if (Vector2.Distance(cellStartPos, curPos) > 0 && Vector2.Distance(cellEndPos, curPos) > 0) { possiblePoints.Add(curPos); } t.SetColor(t.WorldToCell(curPos), Color.green); } else { t.SetColor(t.WorldToCell(curPos), Color.red); } } } //Funktioniert bis hier, es erstellt in jede Richtung von Start zu End eine Liste an möglichen Feldern zum Ziel. //Hier soll nun Stück für Stück (als würde man das Feld verschieben) von cellTempPos (als Start Position) bis cellEndPos (als Ziel Position) geprüft werden. List<Vector2> poses = new List<Vector2>(); Vector3 cellTempPos = cellStartPos; int waypoints = 0; while (Vector2.Distance(cellTempPos, cellEndPos) > 0 && waypoints < 1000) { waypoints++; for (int pp = 0; pp < possiblePoints.Count; pp++) { List<Vector2> neightbors = new List<Vector2>(); List<Vector2> tempPossibles = new List<Vector2>(possiblePoints); while (neightbors.Count < 8) { float lastDistance = 1000; Vector2 tempPos = tempPossibles[0]; //Bekomme die 8 Nachbarpunkte for (int i = 0; i < tempPossibles.Count; i++) { float dist = Vector2.Distance(cellTempPos, tempPossibles[i]); //float dist = DistanceBetweenTwo(cellTempPos, cellEndPos, possiblePoints[i]); if (dist < lastDistance) { lastDistance = dist; tempPos = tempPossibles[i]; } } tempPossibles.Remove(tempPos); neightbors.Add(tempPos); } //Überprüfe hier welcher Neightbor in Richtung EndPos liegt.. Vector2 dirToEndpos = (new Vector2(cellEndPos.x, cellEndPos.y) - new Vector2(cellTempPos.x, cellTempPos.y)).normalized; float lastNeightborDistance = 1000; foreach (Vector2 curPos in neightbors) { Vector2 dirFromCurPos = (curPos - new Vector2(cellTempPos.x, cellTempPos.y)).normalized; if (Vector2.Distance(dirFromCurPos, dirToEndpos) < lastNeightborDistance) { lastNeightborDistance = Vector2.Distance(dirFromCurPos, dirToEndpos); cellTempPos = curPos; } } possiblePoints.Remove(cellTempPos); poses.Add(cellTempPos); } } return poses; } Vielleicht kann jemand damit etwas anfangen, ich habe im Moment eine Liste an Punkten die mögliche Wegpunkte sein könnten, jetzt brauche ich den idealen Weg. So muss also für jeden "Nachbar Punkt" vom "aktuellen Punkt" (am Anfang StartPos) geprüft werden ob ein Nachbar in Richtung "EndPos" liegt.
  10. Gruß, ich suche eine Schreibmöglichkeit wo ich einzelne Funktionen in eine Gruppe setzen kann und dann in Visual Studio auf und zuklappen kann, so wie die Methoden einzeln man auf und zuklappen kann. Genau gesagt, wenn man in Visual Studio sich eine Void Methode ansieht, dann ist links vor "public void" ein - oder + zum aufklappen oder zuklappen, genau sowas bräuchte ich zur Übersichtlichkeit aber für mehrere Methoden (als Gruppe). Geht das mit // /*/ /// oder so? Mfg Mustaf
  11. Na das es beliebige Werte speichern kann ist nur die Bezeichnung, im script selber speichert es alle möglichen Werte (je nachdem was man vorgibt) und dann kann man sich einen Wert auswählen (für mich einfach als universelles ScriptableObject zum speichern von verschiedensten Werten in einem Objekt). Wie gesagt brauche ich nur von dem Objekt eine Kopie (welche dann genutzt wird im Runtime) beim Start (laden oder aufrufen des Objekts), kann man das nicht irgendwie machen?
  12. Danke für die Antwort, ich benutze keins der beiden, sind die den so gut das man das braucht? Mein Spiel basiert auf einer Tilemap, folgendes klappt bisher für mein PathFindingSystem: 1. vom Startpunkt zum Endpunkt wird ein Raster erstellt und dann werden in diesem Bereich alle Tiles abgefragt ob diese einen Collider haben, das ergibt dann eine Liste an Feldern die begehbar sind. 2. mit dieser Felderliste möchte ich nun den Weg erstellen, vom Startpunkt aus werden dann die 8 Nachbarfelder gespeichert und das für jedes Feld Schritt für Schritt. 3. es sollen dann vom Startpunkt beginnend bis zum Endpunkt immer der Nachbar genommen werden der in Richtung Endpunkt liegt, das wird dann der nächste punkt und man beginnt wieder bei 2. Kannst du mir soweit folgen?
  13. Weil ich brauch das genau so, den ich habe ein ScriptableObject welches verschiedenste Werte speichern kann, aber nur den ausgewählten Wert zurrückgibt und dazu den passenden CustomPropertyDrawer um es übersichtlich zu lassen. Problem ist nun nur noch das im Runtime die Werte temporär kopiert werden und nach beenden vom Spiel soll das ScriptableObject noch die originalen Werte haben.
  14. MustafGames

    Character Flip

    1. für mich als Anticheater ist das schon wichtig, per CheatEngine kann man die Spielgeschwindigkeit verändern und das wirkt sich nur auf Update aus soweit ich das probiert habe. 2. Wenn ich den ganzen Code für die Optic in FixedUpdate mit reinstecke dann erhöht sich die Auslastung deutlich als wenn ich das in Update lasse.
  15. MustafGames

    Character Flip

    Du kannst den Code hier im Forum auch per klicken auf das Symbol: <> einfügen dann kann man den editieren. if (Input...) { move = true; moveHorizontal = Input.GetAxisRaw("Horizontal"); } else { move = false; }
×
×
  • Create New...