Jump to content
Unity Insider Forum

Garzec

Members
  • Content count

    283
  • Joined

  • Last visited

  • Days Won

    1

Garzec last won the day on February 2 2017

Garzec had the most liked content!

Community Reputation

6 Neutral

About Garzec

  • Rank
    Advanced Member

Recent Profile Visitors

1,289 profile views
  1. Ich denke, wenn ich mal Zeit habe, schreibe ich ein eigenes Editor Fenster dafür Aber dann bleibe ich erstmal bei JSON
  2. Hallo, ich möchte eine Karte (Grid) anhand einer auszulesenden Datei generieren. Dabei hat das Grid m * n Zellen (Reihen und Spalten). Auf diesen Zellen können sich zu Beginn bereits Objekte befinden. Ich möchte mir die Level in externen Dateien abspeichern, möchte man also ein neues Level designen, so legt man einfach eine neue Datei an. Aktuell (ich weiß noch nicht, ob es mehr werden) muss ich mir 3 Informationen abspeichern Die ID des Zelltypen (Gras, Wasser, Wald, ...) Die ID des Objektes auf der Zelle, oder null, falls kein Objekt auf dem Feld ist Die Rotation dieses Objektes, falls eins drauf ist Ich dachte an JSON, aber ein Feld mit 4 Zellen, also 2x2 würde bereits so aussehen [ [ { "cellId": 0, "cellObject": { "id": 1, "rotationId": 1 } }, { "cellId": 0, "cellObject": null } ], [ { "cellId": 1, "cellObject": null }, { "cellId": 0, "cellObject": { "id": 3, "rotationId": 4 } } ] ] Bei normalen Karten mit 20x20 gäbe es also einen enormen Schreibaufwand. Dafür hat man bei JSON natürlich den Vorteil, einfach zu parsen. Ich habe IDs gewählt, damit ich innerhalb des Codes über Dictionaries mit den IDs die richtigen Objekte raussuchen kann. Gibt es Dateiformate, die sich für so etwas besser eignen bzw. den Schreibaufwand verkürzen und dadurch nicht unlesbar werden?
  3. @Mr 3d Vielleicht habe ich einen Knick in der Optik aber mir kommt die dunkelblaue Fläche minimal größer als die anderen vor. Die Größenangabe habe ich aber noch nicht so ganz verstanden. Wenn ich für die Textur und für das Sprite 512 mitgebe, für eine höhere Auflösung, und mein Sprite Transform ein Scale von (10,10,1) hat, wie halte ich die Größe der Textur gleich zum Scale / Größe des Sprites?
  4. Bzw. wenn ich als Size Parameter 96 mitgebe, dann passt es ungefähr von der Größe her. Aber diesen Wert kann ich doch bestimmt aus der Transform Größe des Kreises bestimmen lassen oder?
  5. @Mr 3d Ich kann teilweise nachvollziehen, was sie macht. Also für den genauen Ablauf fehlt mir das mathematische Wissen. Aber du gehst per Bogenmaß über die "Gradflächen" und färbst dort die Pixel farbig ein. Zwei Fragen hätte ich noch, - wenn ich als Parameter für die Größe ebenfalls 512 mitgebe, werden die Kanten ordentlicher / feiner. Der Kreis wird dadurch aber natürlich auch größer. Wo wird denn die Größe der Textur innerhalb von GenerateCircleTexture bestimmt? - füge ich mehr Farben hinzu, im späteren Spielverlauf hinzu, so kann es sein, dass eine Farbe eine größere Fläche einnimmt. Kommt das durch Rundungsfehler zustande?
  6. @Mr 3d erstmal vielen Dank für deine Lösung Trotzdem habe ich noch Fragen dazu: Ich finde es clever, die aktuelle Farbe direkt zu berechnen, ohne Hilfsobjekte. Aber was ist der private Color GetCurrentColor(float rot) rot Parameter bei dir? transform.eulerAngles.z ? Ebenfalls bin ich dir für die Textur dankbar. Ich wusste gar nicht, dass sowas möglich ist. Ich dachte entweder trickse ich mit dem Canvas oder ein Shader muss her. Ebenso weiß ich noch nicht, wie ich deine Methode anzuwenden habe. Ist der size Parameter der Radius? Oder der Durchmesser? Und wie wende ich diese Methode, die eine Textur zurückliefert, auf das Element an? Ich habe mal GetComponent<Renderer>().material.mainTexture = generateCircleTexture(5); probiert, aber da hat sich am Sprite nichts getan.
  7. Also die Farbberechnung habe ich schon einmal. Für jede Farbe, die der Kreis haben soll, erzeuge ich mir folgendes Objekt public class RouletteColor { public RouletteColor(int colorIndex, Color color, int maxColors) { float step = 360 / maxColors; rangeMin = step * colorIndex; rangeMax = step * (colorIndex + 1); currentColor = color; } private float rangeMin; public float RangeMin { get { return rangeMin; } } private float rangeMax; public float RangeMax { get { return rangeMax; } } private Color currentColor; public Color CurrentColor { get { return currentColor; } } } und füge dieses Objekt der Liste hinzu. Wenn ich die aktuelle Farbe abfragen möchte, frage ich die aktuelle Rotation ab private Color GetCurrentColor() { float currentRotation = transform.eulerAngles.z; RouletteColor rouletteColor = rouletteColors .Where(x => x.RangeMin < currentRotation && x.RangeMax >= currentRotation) .First(); return rouletteColor.CurrentColor; } Fehlt nun noch der Shader, den ich dann wohl mit dem ShaderGraphen bauen werde.
  8. Hallo, ich habe einen Kreis (Sprite), der sich durchgehend dreht. private void Update() { transform.Rotate(0, 0, 10 * Time.deltaTime); } Die Komponente auf dem Kreis erhält zu Beginn ein Array vom Typ <Color>. Ich möchte diesen Kreis in gleichmäßige Stücke mit diesen Farben aufteilen private void SetColors(Color[] colors) { // das Sprite mit Farben einteilen } Wenn ich beispielsweise die Farben rot, blau, grün, gelb im Array habe sollte der Kreis so aussehen Dabei ist die Anzahl der Farben unbegrenzt. Der Kreis selbst hat einen Trigger, wird dieser ausgelöst, soll der Kreis wissen, welche Farbe "getroffen" wurde. private void OnTriggerEnter2D(Collider2D col) { if (col.gameObject == ball) { // Color hitColor = die Farbe, die getroffen wurde } } Der Kreis wird immer von oben getroffen ( x-Koordinate ist 0 ) Meine Fragen lauten: 1. Wie kann ich den Kreis passend einfärben? 2. Wie kann ich herausfinden, welche Farbe momentan "oben" war. Meine Überlegung zur Farbeinteilung: Die Einteilung der Farben dient ja nur der Optik, also nicht der Logik selbst. Ist es möglich, einen Shader über diesen Kreis zu legen und die Farben zu simulieren? Meine Überlegung zur Farbabfrage: Da die Farben wahrscheinlich im Uhrzeigersinn eingeteilt werden und ich die Anzahl der Farben kenne kann ich ja folgendes aufstellen.. Ich habe n Farben. Jede Fläche nimmt also (360 / n) Grad ein. Wenn ich den Kreis wie oben beschrieben rotiere, kann ich doch bestimmt berechnen, wann sich welche Farbe wo befindet?
  9. Garzec

    Relative Bewegung zur Kamera (CubeWorld)

    Der Spieler kann zwar rotieren, aber nicht "schräg" gucken, heißt er rotiert nur nach vorne, links, rechts oder nach hinten. Steht er diagonal, rotiert er von selbst wieder "gerade". private Quaternion GetRotation(Vector2 movementDirection) { Vector3 worldDirection = new Vector3(movementDirection.x, 0, movementDirection.y); Vector3 eulerRotation = CameraMovement.Instance.transform.rotation.eulerAngles; eulerRotation.x = 0; eulerRotation.z = 0; Vector3 relativeRotation = Quaternion.Euler(eulerRotation) * worldDirection; return Quaternion.LookRotation(relativeRotation, Vector3.up); }
  10. Garzec

    Relative Bewegung zur Kamera (CubeWorld)

    Also ich weiß schon einmal, dass TransformDirection() einen Vector3 erwartet und ich gebe nur einen Vector2 rein. Das ändert aber nichts am Verhalten.
  11. Garzec

    Relative Bewegung zur Kamera (CubeWorld)

    Ne, das wäre schon nicht möglich, weil der Spieler ja auf die Kamera zulaufen kann. Also die Kamera dann rückwärts nach hinten fährt.
  12. Hallo, ich versuche eine Steuerung, wie man sie in CubeWorld wiederfindet. Ich kann den Spieler über die Inputs bewegen und die Kamera um den Spieler rotieren. Mein einziges Problem dazu ist grade noch die Spieler Rotation. public class CameraMovement : MonoBehaviour { private float currentRotationX; private float currentRotationY; private Transform playerTransform; private const float FOLLOW_DISTANCE = 10; private const float VERTICAL_ROTATION_SPEED = 5; private const float HORIZONTAL_ROTATION_SPEED = 10; private const float VERTICAL_ROTATION_MIN = 10; private const float VERTICAL_ROTATION_MAX = 80; private static CameraMovement instance; public static CameraMovement Instance { get { return instance; } } private void Awake() { instance = this; } private void Start() { playerTransform = PlayerMovement.Instance.transform; } private void Update() { SetInputs(); } private void LateUpdate() { FollowTarget(); LookAtTarget(); } private void FollowTarget() { transform.position = GetFollowPosition(); } private Vector3 GetFollowPosition() { Vector3 direction = new Vector3(0, 0, -FOLLOW_DISTANCE); Quaternion cameraRotation = Quaternion.Euler(currentRotationY, currentRotationX, 0); return playerTransform.position + cameraRotation * direction; } private void LookAtTarget() { transform.LookAt(playerTransform); } private void SetInputs() { currentRotationX += Input.GetAxis("Mouse X"); currentRotationY += Input.GetAxis("Mouse Y"); LimitVerticalRotation(); } private void LimitVerticalRotation() { currentRotationY = Mathf.Clamp(currentRotationY, VERTICAL_ROTATION_MIN, VERTICAL_ROTATION_MAX); } } public class PlayerMovement : MonoBehaviour { private Rigidbody rigid; private float horizontalInput; private float verticalInput; private bool jumpPressed; private static PlayerMovement instance; public static PlayerMovement Instance { get { return instance; } } private void Awake() { instance = this; } private void Start() { rigid = GetComponent<Rigidbody>(); } private void Update() { SetMovementInputs(); } private void FixedUpdate() { Move(); Rotate(); } private void Move() { rigid.velocity = GetMovement(); } private void Rotate() { // transform.rotation = GetRotation(); } private Vector3 GetMovement() { Vector2 movementDirection = GetMovementDirection(); float verticalMovement = rigid.velocity.y; Vector3 movement = new Vector3(movementDirection.x, verticalMovement, movementDirection.y); return movement * PlayerProfile.Instance.MovementSpeed; } //private Quaternion GetRotation() //{ // Vector2 movementDirection = GetMovementDirection(); // Vector3 rotationDirection = CameraMovement.Instance.transform.TransformDirection(movementDirection); // rotationDirection.y = 0; // Vector3 targetRotation = rotationDirection.normalized * movementDirection.magnitude; // targetRotation *= PlayerProfile.Instance.RotationSpeed; // return Quaternion.LookRotation(targetRotation, Vector3.up); //} private Vector2 GetMovementDirection() { return new Vector2(horizontalInput, verticalInput); } private void SetMovementInputs() { horizontalInput = Input.GetAxis("Horizontal"); verticalInput = Input.GetAxis("Vertical"); } } Ich habe die Methode GetRotation mal auskommentiert. Benutze ich diesen Code, behält der Spieler seine Rotation nicht bei, sondern rotiert nur zur Seite, wenn ich den Button gedrückt halte (der Input 1 ist). Könnte mir jemand dabei helfen? :)
  13. 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.
  14. 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
×