Jump to content
Unity Insider Forum

Garzec

Members
  • Content count

    270
  • Joined

  • Last visited

  • Days Won

    1

Garzec last won the day on February 2 2017

Garzec had the most liked content!

Community Reputation

5 Neutral

About Garzec

  • Rank
    Advanced Member

Recent Profile Visitors

1,229 profile views
  1. Das Problem wurde schon teilweise gelöst. Der Code ist korrekt, ebenso sind die Felder im Inspector zugewiesen. Dennoch haben die Collectables als Objektreferenz der Highscore zuerst die richtige Instanz und danach eine .. warum auch immer .. nicht existierende Instanz. Das kam wohl dadurch zustande, dass Objekte in der Szene erstellt wurden, diese dann den Collectables zugewiesen wurden. Dann wurden diese Objekte zu Prefabs gemacht und gelöscht, dann wurde alles nochmal im Asset Ordner zugewiesen und wahrscheinlich ging es dann ein wenig durcheinander bei Unity, sodass bei seiner Version keine richtige Referenz mehr durch den Inspector besteht. Nimmt man die Inspectorzuweisung weg und lässt kurz per Tag suchen, funktioniert es.
  2. Hallo, ich habe hier ein Projekt eines Unity Anfängers hochgeladen. Das Minispiel ist ein typisches "Dinge fallen vom Himmel, du musst sie einsammeln, manche Dinge bringen Punkte, manche Dinge ziehen dir Punkte ab" - Spiel. Das Projekt an sich ist extrem simpel gehalten, in 5 min. nachgebaut etc. Nun gibt es zwei Probleme: 1. Das Highscore-Text-Element updated sich trotz txt.text = currentHighscore.ToString(); nicht. Obwohl er laut Debugger immer in die Methode reingeht. Das finde ich sehr komisch, da sich der Text im Spiel eigentlich verändern sollte, der Wert ist ja erstmal egal. Aber da er in die Methode reinkommt, sollte sich da am Canvas etwas tun. 2. currentHighscore wird bei jedem Spielstart nicht wieder auf 0 gesetzt, obwohl im Code bei der Initialisierung die Variable mit 0 beginnt. Die Variable merkt sich immer den Wert des letzten Spielstandes. Ebenfalls sehr komisch, da beim Spielstart, also ein kompletter Reset, ja nirgendwo Daten gespeichert werden. Man baut das Spiel ja quasi neu. Ich selbst habe das Ganze mal bei mir am PC nachgebaut (gleicher Code) und es funktioniert wunderbar. Hat jemand Interesse, über das Projekt drüberzuschauen und möglicherweise zu entdecken, wieso diese beiden Probleme auftauchen? Ich hoffe, dass es ein ganz dummer Fehler ist, aber bei meinem nachgebauten Projekt trat dieser nicht auf. Ich selbst bin nur etwas überfragt, wieso bei ihm Werte außerhalb der Laufzeit übernommen werden und sich sein Text Element nicht updatet... Feed_Me_Fool.rar
  3. Hallo, ich habe hier den A* Algorithmus angefangen. Das Ziel wird schon angelaufen (von unten links nach oben rechts). Es gibt verschiedene Feldkosten, der Wert 0 bedeutet nicht begehbar, da werde ich noch etwas passenderes wählen, aber das soll es erst einmal sein. An manchen Stellen springt der zu bewegende Gegenstand noch ein wenig hin und her, da noch nicht die einzig relevanten Felder in der Liste stehen. Hier zuerst mal der Code dazu, das map Objekt baut die Map auf und hält alle Zellen in einem 2D Array vom Typ Cell. Jede Zelle kennt dann ihre Feldkosten, ihren Index auf der Karte muss sie ja nicht kennen. private List<Vector2Int> openCells = new List<Vector2Int>(); private List<Vector2Int> closedCells = new List<Vector2Int>(); private void CalculatePath() { openCells.Clear(); closedCells.Clear(); openCells.Add(Settings.startPosition); Vector2Int currentCellPosition = Settings.startPosition; while (!PositionEquals(currentCellPosition, Settings.targetPosition) && openCells.Count > 0) { Vector2Int cheapestCellPosition = openCells .OrderBy(x => GetCostToTarget(x, Settings.targetPosition) + GetCell(x).Cost) .First(); AddNeighbourPosition(cheapestCellPosition, Vector2Int.up); AddNeighbourPosition(cheapestCellPosition, Vector2Int.left); AddNeighbourPosition(cheapestCellPosition, Vector2Int.down); AddNeighbourPosition(cheapestCellPosition, Vector2Int.right); closedCells.Add(cheapestCellPosition); openCells.Remove(cheapestCellPosition); currentCellPosition = cheapestCellPosition; } } private void AddNeighbourPosition(Vector2Int currentPosition, Vector2Int neighbourDirection) { Vector2Int targetPosition = currentPosition + neighbourDirection; if (CellExistsOnMap(targetPosition)) { if (CellIsWalkable(targetPosition)) { if (!CellExamined(targetPosition)) { openCells.Add(targetPosition); } } } } private bool PositionEquals(Vector2Int startPosition, Vector2Int targetPosition) { return startPosition.Equals(targetPosition); } private bool CellIsWalkable(Vector2Int position) { return GetCell(position).Cost != 0; } private Cell GetCell(Vector2Int position) { return map.Cells[position.x, position.y]; } private int GetCostToTarget(Vector2Int startPosition, Vector2Int targetPosition) { return Mathf.Abs(startPosition.x - targetPosition.x) + Mathf.Abs(startPosition.y - targetPosition.y); } private bool CellExistsOnMap(Vector2Int position) { int horizontalLength = Settings.fields.GetLength(0); int verticalLength = Settings.fields.GetLength(1); Rect mapRect = new Rect(0, 0, horizontalLength, verticalLength); return mapRect.Contains(position); } private bool CellExamined(Vector2Int position) { return openCells.Contains(position) || closedCells.Contains(position); } Nun habe ich gelesen, dass man sich im Algorithmus noch merken muss, wo man hergekommen ist und sich dementsprechend noch die bisher verbrauchten Kosten merkt und verrechnet. Das habe ich aber noch nicht so ganz verstanden, könnte mir jemand beim Algorithmus weiterhelfen?
  4. Hallo, ich würde gerne einen Vortex, bestehend aus einem Partikelsystem, erstellen. Aktuell habe ich folgende Einstellungen gesetzt Im Script rotiere ich noch das Transform. Als Ergebnis erhalte ich dann sowas Ich hätte gerne solch einen Strudel (von Rick und Morty) Mit diesem Bild wird es vielleicht deutlicher Und ich habe mal versucht, meine Gedanken in Kunst zu fassen Gibt es eine Möglichkeit, die Partikel zu einem Strudel anzuordnen? Ich habe es mal mit Noise probiert, die Unregelmäßigkeiten führen aber anscheinend nicht zum gewünschten Ergebnis. Die Partikel schwirren dann nur random herum. Danke schon einmal
  5. Habe es gekürzt bekommen, die Rotationen stimmen aber nicht. public class InterferometricCube : MonoBehaviour { [SerializeField] private Projectile projectileLeft; [SerializeField] private Projectile projectileRight; private void OnCollisionEnter(Collision collision) { HandleProjectile(collision); } private void HandleProjectile(Collision collision) { GameObject collidingObject = collision.gameObject; Projectile projectileComponent = collidingObject.GetComponent<Projectile>(); if (projectileComponent) { Vector3 hitNormal = collision.contacts.First().normal; Vector3 other = Vector3.Cross(hitNormal, collidingObject.transform.up); SpawnProjectile(projectileRight, other); SpawnProjectile(projectileLeft, -other); SpawnProjectile(projectileComponent, -hitNormal); } } private void SpawnProjectile(Projectile projectile, Vector3 direction) { Vector3 spawnPoint = direction + transform.position; projectile.InitProjectile(spawnPoint, Quaternion.Euler(direction)); /* -- InitProjectile -- transform.position = startPosition; transform.rotation = startRotation; currentMovementDirection = transform.forward; */ } } Ich verwende eine TopDown Sicht Egal, von welcher Seite ich auf den Würfel schieße, ein Projektil fliegt immer "nach oben". Das Projektil "nach unten" bleibt im Würfel stecken, da muss ich wohl für die Projektile noch einen Abstand für ihre Achse einberechnen. Das Projektil, mit dem ich auf den Würfel schieße, fliegt idR ebenfalls "nach oben". Hat jemand eine Idee?
  6. Hallo, schieße ich mit einem Projektil auf einen Würfel, so sollen über die getroffene Seite folgende Mittelpunkte berechnet werden: gegenüberliegenden Seite linke Seite rechte Seite Die drei neuen Punkte dienen mir danach als Grundlage für Spawnpositionen. Ich habe schon einmal den Code vorbereitet: public class InterferometricCube : MonoBehaviour { [SerializeField] private Vector3 cubeScale; // Größe des Würfels private const float SPAWN_SPACING = 1.5f; // Abstand zum Würfel private void OnCollisionEnter(Collision collision) { CheckProjectile(collision); } private void CheckProjectile(Collision collision) { Projectile projectileComponent = collision.gameObject.GetComponent<Projectile>(); if (projectileComponent) // ist das kollidierende Objekt ein Projektil? { Vector3 contactPoint = collision.contacts.First().normal - transform.up; Vector3[] directions = null; if (contactPoint == new Vector3(0, -1, -1)) // transform.forward // vorne { Vector3[] targetDirections = { -transform.forward, transform.right, -transform.right }; directions = targetDirections; } else if (contactPoint == new Vector3(0, -1, 1)) // -transform.forward // hinten { Vector3[] targetDirections = { transform.forward, transform.right, -transform.right }; directions = targetDirections; } else if (contactPoint == new Vector3(1, -1, 0)) // -transform.right // links { Vector3[] targetDirections = { -transform.forward, transform.right, transform.forward }; directions = targetDirections; } else if (contactPoint == new Vector3(-1, -1, 0)) // transform.right // rechts { Vector3[] targetDirections = { -transform.forward, transform.forward, -transform.right }; directions = targetDirections; } if (directions != null) { SpawnProjectiles(directions); } } } private void SpawnProjectiles(Vector3[] directions) { for (int i = 0; i < directions.Length; i++) { Vector3 currentDirection = directions[i]; // Spawnrotation Vector3 spawnPoint = currentDirection + transform.position + cubeScale; // Spawnposition spawnPoint *= SPAWN_SPACING; // Abstand setzen Debug.Log(spawnPoint); } } } Innerhalb von CheckProjectile berechne ich anhand der Normalen die anderen drei Seiten. Leider springt mir dort der doppelte Code ins Gesicht und möglicherweise kann man dies ja viel einfacher berechnen. Wäre super, falls mir jemand ein wenig mit Mathe aushelfen könnte, falls es einfacher gehen sollte
  7. Garzec

    Projektil reflektieren

    Ich habe es erstmal hinbekommen mit public void ReflectProjectile() { RaycastHit hit; Ray ray = new Ray(transform.position, currentMovementDirection); if (Physics.Raycast(ray, out hit)) { currentMovementDirection = Vector3.Reflect(currentMovementDirection, hit.normal); } }
  8. Garzec

    Projektil reflektieren

    Hallo, beim Abfeuern eines Projektiles verwende ich erstmal folgenden Code private Rigidbody rigid; private Vector3 currentMovementDirection; private void FixedUpdate() { rigid.velocity = currentMovementDirection; } public void InitProjectile(Vector3 startPosition, Quaternion startRotation) { transform.position = startPosition; transform.rotation = startRotation; currentMovementDirection = transform.forward; } Dabei verwende ich InitProjectile als Startmethode, weil ich die Projektile nicht zerstöre sondern recycle (Renderer disablen). Sobald das Projektil auf ein Objekt trifft, das dieses Projektil reflektieren kann, soll das Projektil reflektiert werden. Unity scheint dafür bereits etwas zu haben, https://docs.unity3d.com/ScriptReference/Vector3.Reflect.html Wenn die Collision also getriggert wird private void OnTriggerEnter(Collider other) { if (other.gameObject == projectile) { projectileComponent.ReflectProjectile(); } } Soll das Projektil seine Richtung und Rotation ändern. public void ReflectProjectile() { // Vector3.Reflect(... , ...); } Leider verstehe ich nicht so recht, welche Parameter dort übergeben werden müssen. Ich habe es auch mal auf anderem Wege probiert, indem ich die Velocity mit -1 multipliziere, logischerweise wird dann aber einfach die Bewegungsrichtung umgekehrt. Wäre super, wenn mir jemand mit der Reflektion helfen könnte
  9. Garzec

    Animierter SceneFader

    Oh, ja also die Fledermäuse habe ich, die hat ja unser Grafiker bereits erstellt. Ich baue jetzt erstmal nen 0815 SceneFader rein
  10. Garzec

    Animierter SceneFader

    Hm schade, ich hatte auf ein Partikelsystem oder sowas gehofft :/
  11. Garzec

    Animierter SceneFader

    Hallo, also wie ich einen SceneFader baue, der zb am Ende einer Szene das bild abdunkelt und beim Start einer Szene aufhellt weiß ich. Aber mich würde mal interessieren, ob es möglich ist, sowas zu bauen: https://www.youtube.com/watch?v=Bwj3Ki9jh3A&feature=youtu.be&t=36s Wie könnte man sowas in Unity machen? Ist das ein Gif? Eine Animation? Ein Partikelsystem? Vielleicht kann man solch einen Fader ja sogar so weit durch Code ausbauen, dass ein Schwarm unterschiedliche Start- und Endpunkte hat?
  12. Ne, genau das wundert mich, die Szene ist ja komplett unabhängig von allem. Das heißt ihr müsste es ja eigentlich egal sein, von wo sie geladen wird. Ich muss das nochmal debuggen ..
  13. @Sascha Ich habe noch ein interessantes Problem entdeckt .. Ich habe eine Levelauswahl und eine Weltenauswahl. Da beide bei mir technisch gesehen identisch sind, nutzen sie den gleichen Code. Starte ich das Spiel vom Hauptmenü aus, kann ich problemlos auf die Karte der Welten, dort eine Welt auswählen und dann zur Levelauswahl der Welt. Dort funktioniert die Steuerung problemlos. Starte ich das Spiel innerhalb eines Levels, gehe ins Ingame Menü, wähle "zurück zur Map", dann gelange ich zur Levelauswahl, aber der Spieler kann nicht mehr sliden, sondern bewegt sich gar nicht und beim zweiten Key dann instant. Gehe ich von dort zur Weltenauswahl, ist der Fehler auch dort anzutreffen. Gehe ich von dort zum Hauptmenü und dann wieder zur Weltenauswahl, bleibt der Fehler bestehen. Also starte ich das Spiel ordentlich vom Hauptmenü aus funktioniert es aber starte ich aus einem Level heraus und lade die "Weltenauswahl"-Szene, funktioniert das Sliden nicht mehr. Der restliche Code funktioniert aber. Nur die Coroutine möchte nicht ..
  14. Zu deiner letzten Frage: Weil dieses Script die Karte ist. Die Karte verwaltet die ganzen Punkte und sagt dem Spieler nur "beweg dich da hin". Der Spieler selbst hat dann das ganze Movement Zeug und soll später auch seine Animationen verwalten. Aber was die Punkte betrifft, liegt das bei der Karte. Natürlich müsste man den Input eigentlich bei dem Spieler abfragen, ja. Und zu deiner vorletzten Frage: Nein, ich war dumm Dankeschön.
  15. @Sascha Also ich bewege mich innerhalb eines Arrays von Index zu Index. Mit dem Index komme ich an das Objekt und somit auch an die Position des Objektes. Nun ist es so, dass dein Code fast funktioniert. Ich kann mich hin und her bewegen. Trotzdem gibt es ein paar Fehler, die Ausgangssituation ist, dass ich mich am letzten Element befinde, also der höchste Index ist aktiv. Bewege ich mich zurück und drücke schnell nochmal vorwärts, kann ich für einige Tastendrücke lang den Spieler gar nicht mehr bewegen. Ich habe deinen Code mal bei mir umgesetzt private void Update() { if (Input.GetKeyDown(KeyCode.A)) // nach links bewegen { MovePlayer(false); } if (Input.GetKeyDown(KeyCode.D)) // nach rechts bewegen { MovePlayer(true); } } private void MovePlayer(bool moveForward) { if (currentSmoothMovement == null) // kein SmoothMovement aktiv (1x) { bool validMovement = false; // kann sich der Spieler mit dem nächsten Index noch weiter bewegen? if (moveForward) // nächsten Index prüfen { if (currentPlaceIndex + 1 < places.Length) { currentPlaceIndex++; validMovement = true; } } else // vorherigen Index prüfen { if (currentPlaceIndex - 1 >= 0) { currentPlaceIndex--; validMovement = true; } } if (validMovement) // der Spieler darf sich noch bewegen { targetPlacePosition = places[currentPlaceIndex].PlacePosition; // die aktuelle Zielposition festlegen player.CurrentSmoothMovement = StartCoroutine(player.MoveSmoothlyToLevel(targetPlacePosition)); // Smooth Movement aktivieren forwardMovement = moveForward; } } else // SmoothMovement aktiv (2x) { if (moveForward == forwardMovement) { StopCoroutine(player.CurrentSmoothMovement); player.CurrentSmoothMovement = null; // SmoothMovement stoppen player.MoveInstantToLevel(targetPlacePosition); // "Teleport" } } } Ich vermute, ich habe forwardMovement = moveForward; noch nicht so ganz verstanden bzw. ich wende es falsch an.. ?
×