Jump to content
Unity Insider Forum

Garzec

Members
  • Content count

    291
  • 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,350 profile views
  1. Quaternion movementRotation = Quaternion.Euler(0, transform.rotation.eulerAngles.y, 0); rigid.velocity = movementRotation * movement; Ist des Rätsels Lösung
  2. Hallo, ich arbeite an einer FPS Steuerung, mit der ich den Spieler durch die Kamera rotiere. Dabei rotiert dieser sich, läuft aber weiterhin gerade aus, anstatt die neue Richtung der Kamera einzuschlagen. public class PlayerMovement : MonoBehaviour { private Vector3 movement; private Rigidbody rigid; private bool jumpPressed; private const int MOVEMENT_SPEED = 8; private const int JUMP_POWER = 20; private void Awake() { rigid = GetComponent<Rigidbody>(); } private void Update() { SetInputs(); } private void FixedUpdate() { Jump(); Move(); } private void SetInputs() { movement.x = Input.GetAxis("Horizontal") * MOVEMENT_SPEED; movement.y = rigid.velocity.y; movement.z = Input.GetAxis("Vertical") * MOVEMENT_SPEED; jumpPressed = Input.GetKeyDown(KeyCode.Space); } private void Jump() { if (jumpPressed && GroundCheck()) { movement.y = JUMP_POWER; jumpPressed = false; } } private void Move() { rigid.velocity = movement; } private bool GroundCheck() { return true; } } public class CameraMovement : MonoBehaviour { private Transform player; private Vector2 rotation; private Quaternion originalRotation; private const int HORIZONTAL_ROTATION_SPEED = 5; private const int VERTICAL_ROTATION_SPEED = 5; private const int VERTICAL_ROTATION_MIN = -80; private const int VERTICAL_ROTATION_MAX = 80; private void Awake() { player = GameObject.FindGameObjectWithTag("Player").transform; } private void Start() { originalRotation = transform.localRotation; } private void Update() { SetInputs(); RotateCamera(); RotatePlayer(); } private void SetInputs() { rotation.x = Input.GetAxisRaw("Mouse X") * HORIZONTAL_ROTATION_SPEED; rotation.y += Input.GetAxisRaw("Mouse Y") * VERTICAL_ROTATION_SPEED; rotation.y = Mathf.Clamp(rotation.y, VERTICAL_ROTATION_MIN, VERTICAL_ROTATION_MAX); } private void RotateCamera() { Quaternion verticalRotation = Quaternion.AngleAxis(rotation.y, Vector3.left); transform.localRotation = originalRotation * verticalRotation; } private void RotatePlayer() { player.localRotation *= Quaternion.AngleAxis(rotation.x, player.up); } } Das Ganze sieht dann so aus Ich habe schon versucht, die Velocity mit der Kamera Rotation zu multiplizieren, also rigid.velocity = movement * Camera.main.transform.rotation; Aber dann hebt der Spieler irgendwann in die Luft ab (Wie genau das zustande kommt muss ich noch herausfinden). Weiß jemand, welchen Fehler ich noch drin habe?
  3. Garzec

    worauf scripte ich in unity

    Für das gewisse Kleingeld gibt es auch Rider von Jetbrains. Die Tools von Jetbrains (es gibt tonnenweise Produkte für nahezu jede Sprache) sind extrem hochwertig, aber kosten leider auch. Wobei der Preis für Privatpersonen monatlich nicht sonderlich hoch ist, falls es einem wert sein sollte.... Ich selbst nutze privat aber ebenfalls VS, da es auch gut ist und eben kostenlos ist.
  4. Garzec

    mit Objekten interagieren

    Die Idee mit Triggern habe ich verworfen, da sich folgende Situation ergeben könnte (nur mal als Härtefall): Auf dem Tisch liegen 2 Schlüssel nebeneinander, der Spieler steht genau davor. Welcher Schlüssel gewinnt nun das Trigger Rennen? Oder der Trigger des Schlüssels ist so gering, dass der Spieler auf den Tisch springen müsste, um ihn aufzuheben.
  5. Garzec

    mit Objekten interagieren

    Die Idee finde ich nicht schlecht. Jetzt bin ich nochmal gespannt, ob eine ganz andere Lösung kommt
  6. Hallo, es geht um eine FPS Steuerung, der Spieler soll mit Gegenständen interagieren können. Beispiele wären Schlüssel aufheben, Türen öffnen, Kisten öffnen, Dinge schieben. Angenommen es liegt ein Schlüssel auf dem Tisch und der Spieler kommt dem Schlüssel ausreichend nahe, dann soll folgendes passieren: Der Schlüssel bekommt einen outline Shader Es erscheint der Text "Schlüssel aufheben" Zunächst habe ich ein Interface erstellt public interface IInteractable { string InteractabilityInfo { get; } void ShowInteractability(); void Interact(); } Dadurch kann ich das Interface dem Schlüssel Script hinzufügen public class Key : MonoBehaviour, IInteractable { public string InteractabilityInfo { get { return "Schlüssel aufheben"; } } public void ShowInteractability() { // Shader anzeigen beispielsweise } public void Interact() { // Den Schlüssel aufheben } } Zum Schluss brauche ich noch ein Script, das prüft, ob der Spieler in Reichweite eines interagierbaren Objektes steht und damit interagieren kann. Aufgrund der FPS Sicht habe ich das Script der Camera beigefügt, diese prüft das Ganze dann mit einem Raycast. public class InteractabilityCheck : MonoBehaviour { private const int RANGE = 3; private void Update() { RaycastHit hit; if (Physics.Raycast(transform.position, transform.forward, out hit, RANGE)) { IInteractable interactable = hit.collider.GetComponent<IInteractable>(); if (interactable != null) { interactable.ShowInteractability(); if (Input.GetKeyDown(KeyCode.E)) { interactable.Interact(); } } } } } Dieses Script versucht zu prüfen, ob das GameObject das Interface implementiert; trifft dieser Fall ein, so werden die Methoden des Interfaces aufgerufen. Der Code funktioniert wunderbar, trotzdem stört mich, dass 1x pro Frame der Raycast mit GetComponent läuft. Jetzt könnte man sagen das ist verkraftbar, aber vielleicht gibt es einen besseren Ansatz? Vielleicht eine ganz andere Herangehensweise / Lösung?
  7. Garzec

    vertikale Rotation bei Kamera limitieren

    Dankeschön funktioniert wunderbar
  8. Hallo, ich möchte eine FPS Kamera basteln und ihre vertikale Rotation auf -80 bis 80 Grad beschränken. Ein kurzes unsauberes Beispiel: public Transform player; private Vector2 rotation; private void Update() { rotation.x = Input.GetAxisRaw("Mouse X") * 5; rotation.y = Mathf.Clamp(Input.GetAxisRaw("Mouse Y") * 5, -80, 80); } private void LateUpdate() { transform.localRotation *= Quaternion.AngleAxis(-rotation.y, Vector3.right); player.localRotation *= Quaternion.AngleAxis(rotation.x, player.up); } Der Code funktioniert zwar, aber die Limitierung nicht. Das hängt wahrscheinlich damit zusammen, dass der Input nur zwischen -1 und 1 springt und erstmal nicht bis 80 Grad kommen wird. Aber wo muss ich mit der Limitierung nun ansetzen? 🤔
  9. Ich denke, wenn ich mal Zeit habe, schreibe ich ein eigenes Editor Fenster dafür Aber dann bleibe ich erstmal bei JSON
  10. 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?
  11. @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?
  12. 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?
  13. @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?
  14. @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.
×