Jump to content
Unity Insider Forum

Mr 3d

Members
  • Content count

    667
  • Joined

  • Last visited

  • Days Won

    24

Mr 3d last won the day on August 18

Mr 3d had the most liked content!

Community Reputation

136 Excellent

About Mr 3d

Profile Information

  • Gender
    Male
  • Location
    Bayern

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Ich fände es auch schön, wenn hier mal wieder mehr gepostet werden würde. War immer sehr interessant zu sehen woran andere hier grade so arbeiten.. Hier mal wieder ein Update zu meinem Blutfluss Shader..
  2. Tatsache.. ich würde auch sagen, dass die dunkelblaue Fläche größer ist.. Ich schätze mal das liegt daran, dass zwischen der blauen und roten Fläche genau ein Streifen an Pixeln liegt, der theoretisch zu beiden Farben 50% gehört. Aber jeder Pixel muss sich für eine Farbe entscheiden und somit ist Blau um einen Pixel breiter.. Den Effekt kannst du minimieren, indem du eine höhere Auflösung verwendest. Dann hat der eine Pixel weniger Einfluss.. private Sprite generateCircleSprite(Color[] colors, int resolution) { Color[] pixels = new Color[resolution * resolution]; Vector2 center = new Vector2(resolution / 2f, resolution / 2f); float anglePerColor = 360f / colors.Length; for (int y = 0; y < resolution; y++) { for (int x = 0; x < resolution; x++) { Vector2 dir = new Vector2(x + .5f, y + .5f) - center; float angle = -Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg + 90; angle = (angle < 0 ? 360 + angle : angle); int colorIndex = Mathf.Min((int)(angle / anglePerColor), colors.Length - 1); pixels[x + y * resolution] = dir.magnitude < resolution * .5f ? colors[colorIndex] : Color.clear; } } Texture2D tex = new Texture2D(resolution, resolution); tex.SetPixels(pixels); tex.Apply(); return Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(.5f, .5f), resolution); } Diese Methode gibt dir ein Sprite zurück, dass immer 1 Unit hoch/breit ist. Weil die Höhe/Breite in Pixeln der Textur gleich der PixelPerUnit des Sprites entspricht.. Dann kannst du die Größe deines Rades einfach mit der Transform Scale bestimmen.
  3. Die Größe des Sprites wird nicht in 'GenerateCircleTexture' bestimmt. Der Parameter setzt nur die Auflösung der Textur.. Bei 'Sprite.Create()' steht der letzte Parameter für die Anzahl der Pixel, die in 1 Unit gepackt werden. Wenn zb. deine Textur 1024 Pixel breit ist, und dein Sprite 512 PixelPerUnit hat, ist dein Sprite 2 Units groß.. Ich weiß ja nicht wie viele Farben du hinzugefügt hast, aber bei mir sehen die alle gleich groß aus..
  4. Kannst du trotzdem nachvollziehen was die Methode macht? Im 'pixels' Array sind die Farben aller Pixel gespeichert. Dann wird jeder Pixel angeschaut und berechnet wo er im Kreis liegt und dann entsprechend eingefärbt.
  5. Ja, 'rot' war kurz für 'rotation' bzw. die Gradzahl um die sich die Scheibe gedreht hat. Also in deinem Fall 'transform.eulerAngles.z' Der 'size' Parameter steht für die Höhe&Breite in Pixeln des Kreises. Ist vtl. nicht so sinnvoll das als Parameter zu übergeben. Um die Textur als Sprite verwenden zu können, musst du erst daraus ein Sprite generieren.. (https://docs.unity3d.com/ScriptReference/Sprite.Create.html) etwa so: Texture2D tex = generateCircleTexture(512); Sprite circleSprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(.5f, .5f), 512); //letzter Parameter sind Pixel pro Unit, also ist das Sprite 1 Unit groß Dann musst du von deinem Sprite Objekt auf die Image Componente zugreifen und das neue Sprite setzen.. (nicht vergessen 'using UnityEngine.UI') using UnityEngine.UI; public Image GluecksradGraphic; //-- GluecksradGraphic.sprite = circleSprite; // edit Du benutzt ja gar nicht UI.. Dann musst du auf die SpriteRenderer Componente zugreifen und den 'sprite' Parameter ändern, nicht die Textur vom Material.. GetComponent<SpriteRenderer>().sprite = circleSprite;
  6. Das ist zwar nicht falsch, aber etwas umständlich.. public Color[] colors; private Color GetCurrentColor(float rot) { float currentRotation = rot % 360; float anglePerColor = 360f / colors.Length; int ColorIndex = (int)(currentRotation / anglePerColor); return colors[ColorIndex]; } Und um den Kreis zu malen kannst du natürlich einen Shader verwenden.. aber wie thewhiteshadow schon geschrieben hat wird es nicht ganz einfach eine dynamische Anzahl an Kreissektoren mit einem Shader zu generieren.. Ich würde einfach am Anfang die Kreistextur einmal generieren lassen.. private Texture2D generateCircleTexture(int size) { Color[] pixels = new Color[size * size]; Vector2 center = new Vector2(size / 2f, size / 2f); float anglePerColor = 360f / colors.Length; for (int y = 0; y < size; y++) { for (int x = 0; x < size; x++) { Vector2 dir = new Vector2(x + .5f, y + .5f) - center; float angle = -Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg + 90; angle = angle < 0 ? 360 + angle : angle; int colorIndex = Mathf.Min((int)(angle / anglePerColor), colors.Length - 1); pixels[x + y * size] = dir.magnitude < size * .5f ? colors[colorIndex] : Color.clear; } } Texture2D tex = new Texture2D(size, size); tex.SetPixels(pixels); tex.Apply(); return tex; }
  7. Mr 3d

    Denkfehler beim Ray

    Erstmal ist das '== true' unnötig.. ^^ Was macht denn 'SchienenAchsentestZ()' ? Kann es sein, dass er nur einmal in die 'if' rein geht? Dann setzt er 'rayCasting' auf 'true', aber der Raycast selbst wird noch nicht durchgeführt, weshalb 'rayAufschlag' noch (0, 0, 0) ist bzw. 'zielPosition' (0, 1, -2). Danach wird der Raycast in FixedUpdate aufgerufen und 'rayAufschlag' gesetzt, aber die Zielposition wird nicht neu berechnet. Warum ziehst du denn den Raycast in die FixedUpdate? Nur weil er über 'Physics' aufgerufen wird, müssen Raycasts nicht automatisch in die FixedUpdate. Das machen sie im Beispiel in der Dokumentation zumindest auch nicht so..
  8. Mr 3d

    Vector3.Lerp nur die x achse abfragen

    Rein nach deiner Logik suchst du wohl nach 'Mathf.Lerp(float, float, float);' object.transform.position.x = Mathf.Lerp(object.position.x,transform.position.x,2 * Time.deltaTime); Nur wird das so nicht klappen, weil du, um die Position zu ändern, den ganzen Vektor überschreiben musst. Nur eine einzelne Komponente zu ändern funktioniert leider nicht. Hier eine ganz gute Erklärung dazu: https://answers.unity.com/questions/427769/gameobjecttransformpositionx-.html Du musst also erst deinen Start/End X-Wert in Vector3s umwandeln und dann den ganzen Positionsvektor überschreiben. object.transform.position = Vector3.Lerp(new Vector3(object.position.x, 0, 0), new Vector3(transform.position.x, 0, 0), 2 * Time.deltaTime); Oder du lerpst den X-Wert und wandelst ihn danach in einen Vektor um (sogar bisschen schöner): object.transform.position = new Vector3(Mathf.lerp(object.position.x,transform.position.x,2 * Time.deltaTime), 0, 0); /edit: dreifach hält besser..
  9. Mr 3d

    Text von Listenfeld ausgeben

    Und wenn du dir beim Befüllen mal die Werte von "NSumX" und "NbSumX" ausgeben lässt, nehme ich mal an, dass die Differenz genau das ist, was am Ende ausgegeben wird, oder? Wo werden denn die Werte für die PlayerPrefabs berechnet?
  10. Mr 3d

    Text von Listenfeld ausgeben

    Dann ist der Fehler beim Befüllen der Liste.. Kannst du den Code dafür mal posten? Oder hast du die Werte per Hand gesetzt?
  11. Mr 3d

    Problem mit Variable auf 0 zu setzen

    Time.time "This is the time in seconds since the start of the game." In der zweiten Szene bekommst du also nicht die Zeit seit dem Beginn des 2. Levels, sondern seit Start des Spieles. Ich würde einfach jeden Frame die vergangene Zeit seit dem letzten Frame zu 'zeit' addieren. Also: zeit += Time.deltaTime;
  12. Mr 3d

    texttafel anzeigen lassen

    Du kannst mit 'GetComponentsInChildren<T>()' eine Referenz zu allen Renderern der Kinderobjekte bekommen https://docs.unity3d.com/ScriptReference/Component.GetComponentsInChildren.html Und die dann aktivieren/ deaktivieren. Renderer[] renderers; private void Awake(){ renderers = GetComponentsInChildren<Renderer>(); setVisibility(false); } private void setVisibility(bool visible){ foreach(Renderer renderer in renderers) renderer.enabled = visible; } }
  13. Mr 3d

    texttafel anzeigen lassen

    Warum denn nicht? Du kannst dein Canvas auf 'World Space' umstellen und dann in deiner Scene platzieren. Ansonsten könntest du auch ein TextMesh verwenden https://docs.unity3d.com/Manual/class-TextMesh.html Die aktuell geladene Scene kannst du per 'SceneManager.GetActiveScene()' bekommen. https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager.GetActiveScene.html (nicht vergessen den 'UnityEngine.SceneManagement' namespace zu inkludieren ^^ )
  14. Mr 3d

    Boolean als Trigger (gelöst)

    Observer Pattern hatten wir letztes Jahr in der Schule angesprochen, aber nie implementiert.. Ich bin jetzt spontan auf das hier gekommen: using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public struct Boolean { private bool _Value; public bool Value { get { return _Value; } set { if(_Value != value) { _Value = value; if (OnValueChanged != null) { OnValueChanged(); } } } } public event Action OnValueChanged; } public class BooleanObserver : MonoBehaviour{ public Boolean myTestBool; private void Awake() { myTestBool.OnValueChanged += boolChanged; } private void Update() { myTestBool.Value = Input.GetKey(KeyCode.Space); } private void boolChanged() { Debug.Log("Bool changed!"); } } Das scheint ganz gut zu funktionieren, aber ist es auch eine korrekte Anwendung des Patterns? ^
  15. Mr 3d

    Boolean als Trigger (gelöst)

    Normalerweise speichert man doch einfach den letzten Status der Variable und überprüft im nächsten Update ob er immer noch gleich ist.. oder hab ich die Frage falsch verstanden? ^ bool wert; bool lastWert; void Update(){ if(wert != lastWert){ //geändert lastWert = wert; } }
×