Jump to content
Unity Insider Forum

Brighthell96

Members
  • Posts

    29
  • Joined

  • Last visited

  • Days Won

    2

Brighthell96 last won the day on January 24

Brighthell96 had the most liked content!

Recent Profile Visitors

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

Brighthell96's Achievements

Member

Member (2/3)

2

Reputation

  1. Das mit der Datei finde ich cool! Danke! Schade nur dass es da nichts von Unity selbst gibt.. 100 nicht.. aber so 3 stück hab ich wöchentlich minimum schon. ich nehme wöchentlich an sehr vielen kleinen Gamejams teil. Daher hab ich sehr viele Projekte die nur über mehrere Tage gehen^^ das werde ich mir wohl auch mal ansehen müssen. Habe aktuell noch keine ahnung wie man Unity Pakete macht.
  2. Hi, mache gerade für die Weekly Game Jam ein 2d isometic Game mit einem Raster / Grid Movement. und einer tilemap. das Movement vom Boot hab ich mit folgendem Code soweit hinbekommen: void Update() { if(Input.GetKeyDown(KeyCode.LeftArrow)) { transform.position += new Vector3(-0.5f, 0.295f, 0); animator.SetFloat("Horizontal", -1f); animator.SetFloat("Vertical", 0f); } else if(Input.GetKeyDown(KeyCode.RightArrow)) { transform.position += new Vector3(0.5f, -0.295f, 0); animator.SetFloat("Horizontal", 1f); animator.SetFloat("Vertical", 0f); } else if(Input.GetKeyDown(KeyCode.UpArrow)) { transform.position += new Vector3(0.5f, 0.295f, 0); animator.SetFloat("Horizontal", 0f); animator.SetFloat("Vertical", 1f); } else if (Input.GetKeyDown(KeyCode.DownArrow)) { transform.position += new Vector3(-0.5f, -0.295f, 0); animator.SetFloat("Horizontal", 0f); animator.SetFloat("Vertical", -1f); } } aber leider kann das boot aktuell noch wilkürlich über die grasblöcke "laufen" es soll aber nur über wasser fahren können. Wie macht man bei solchen games die collision? wenn es nichtgridbased movement wäre könnt ich einfach einen tilemap colider benutzen aber das ist hier nicht wirklich möglich. vielen dank im vorraus lg Marc
  3. Hi again, oh junge ich weiß nicht so wirklich wo ich anfangen soll mit meiner Frage. Ich habe mich wiedermal dazu breitschlagen lassen ein neues Projekt anzufangen. ein platformer mit ihm als hauptcharakter: dieser Charakter soll in der lage sein, sein schwert (welches er im spielverlauf zu beginn findet) auszurüsten aber auch abzulegen: Anhand dessen ob er das Schwert equipped hat oder nicht soll er zwischen schwertkampf und faustkampf wechseln können. Diese unterscheiden sich nicht nur optisch sondern haben auch teilweise andere Eigenschaften. als Schwerkämpfer kann er z.b. so Zelda like einen Drehangriff machen oder nach vorne Dashen. Im Faustkampf hingegen kann man neben der standart 3teiligen angriffscombo auch Kicks benutzen. so viel zum Konzept aber leider bringt das einige Probleme mit sich von denen ich keine Ahnung habe wie ich sie alle sinnvoll gelöst bekomme: 1. Animation Wie schaffe ich es dass der Spieler das schwert optisch ablegt und wieder ausrüstet? ich habe das Schwert zwar in Aseprite auf einem eigenen Layer gepackt wodurch ich es innerhalb von Aseprite sichtbar und unsichtbar machen kann aber wenn ich eben diese Layer in unity übertragen will müsste ich vermutlich das Schwert als ein eigenes Childobjekt vom Char machen welches dann seine KOMPLETT eigenen animationen parallel zu denen des Hauptchars abspielen müsste was meinen arbeitsaufwand an animationen praktisch verdoppelt. Eine andere Idee wäre vermutlich nicht das Schwert einzeln zu animieren sondern den Spieler komplett die animationen wechseln lassen abhängig davon ob er das schwert an hat oder nicht aber auch hier würde wieder gelten: Doppelter Arbeitsaufwand, Doppelter Code, Doppelte Fehlerquelle, etc. Praktisch ein komplettes moveset mit schwert und eins ohne welches ich dann z.b. mit nem bool hasSword oder was weiß ich toggle. Evtl helfen mir auch Secondary Textures bei dem Problem mit dem ich das Schwert als 2. Texture festlege welches ich dann sichtbar und unsichtbar machen kann. Aber leider es gibt gefühlt garkein Tutorial auf Youtube wie diese Teile genau funktionieren. 2. Logik Das alles ist deckt aber so far nur die animation ab aber noch nicht die logik dahinter. Das behavior des Chars verändert sich ja komplett mit einem Schwert. er hat andere moves, stats, hitzones usw. Wie zur Hölle soll ich das alles in ein Script verpacken? Ich hab mich dazu auch schon online schlau gemacht und ich kam immer wieder zum Konzept von Statemachines zurück mit denen ich das behavior meines chars scheinbar komplett ändern kann wenn gewisse Kriterien erfüllt sind. Das Problem an der Geschichte ist dass die Tutorials die ich über Statemachines gefunden habe mein aktuelles Skilllevel total übersteigen. Ich fühle mich unwohl dabei, Dinge zu nutzen die ich nicht voll und ganz verstehe. Zumal sich ein Freund von mir mal gefühlt das Leben zur Hölle gemacht hat dadurch dass er Statemachines benutzt hat. Bevor ich mir das alles aneigne wüsste ich daher gerne erstmal ob ich Recht habe mit meiner Vermutung dass diese Statemachines eine gute Lösung für mein Problem wären. Evtl habe ich das Konzept auch komplett falsch verstanden und Sie haben andere Anwendungsbereiche. 3. Erweiterbarkeit Das hier aufgezählte Beispiel mit dem Schwert ist zwar bisher das Einzige aber wenn ich später noch andere Waffen/States wie bogen, zauber, oder andere RPG Elemente hinzufügen möchte? Dann stehe ich vor dem gleichen Problem. Am liebsten wäre mir daher wirklich ein "modulares" System dass ich auf weitere Fälle erweitern kann ohne alles neu machen zu müssen. z.B. wenn der Spieler wählen kann zwischen Unbewaffnet, Bewaffnet, Zauber, Fernkampf anhand der Waffe die er trägt. Ich hoffe sehr das erklärt mein Problem ausführlich und es findet sich jemand der mich versteht und eine Lösung für mich hat. ich bin leider nicht so der gute Erklärer darum weiß ich nicht ob ich es ausführlich genug erklärt habe.. der Charakter ist übrigens kostenlos erhältlich: https://rvros.itch.io/ vielen Dank im vorraus Marc
  4. Hi! Ich hoffe das ist der richtige Forumsbereich ich fand jetzt nichts was zu dem Thema besser passen würde außer evtl. "Unity Benutzeroberfläche". und zwar wollte ich Fragen ob es einen Weg gibt die Standard Projektstruktur eines neuen Projekts anzupassen? Meine Unity Projekte haben eigentlich immer grob das selbe Format und daher hab ich mir ein "leeres Projekt" erstellt mit folgender Projektstruktur die ich dann verwende: Assets ├── Scenes ├── Prefabs ├── Scripts ├── Fonts ├── usw. │ └── . . . und diese Ordner Copy paste ich immer in mein neues Projekt aber das ist nicht nur total nervig sondern vermutlich sehr unschön geregelt. Da man die default dateien für newbehavior scripts ändern kann dachte ich dass es dafür bestimmt auch einen Weg gibt? Online habe ich viele Seiten dazu gefunden wie man ein Projekt strukturieren SOLLTE aber nicht wie man eben das Standard Projekt ändern kann. vielen Dank im vorraus Marc
  5. alles klar dankeschön! hab jetzt ein system hinbekommen mit dem system von dir in der fixedUpdate und dem bool. danke danke danke ❤️
  6. hallo sascha danke erstmal dass du mir noch so spät so schnell antwortest. genau. ob der Spieler springt, rennt, fällt soll keinen Einfluss haben ob die Kiste bei Kontakt kaputt geht oder nicht. Daher konnte ich das relativeVelocity nicht benutzen. das Problem ist dass man Kisten auch schieben kann und sollten sie irgendwo runterfallen dann können sie dadurch auch kaputt gehen. Sorry dass ich das nicht erwähnt habe vorher. Jedenfalls scheint dein Ansatz eigentlich zu passen für mich.. Aber kann sowas nicht zu Problemen führen wenn die fps mal dropen oder so? Sorry bin was performence und so Zeugs angeht noch Frischling in Unity Außerdem wollte ich fragen was es mit dem "new" keyword beim rigidbody aufsich hat. Hab das nämlich nicht stehen bei mir. Sollte man das benutzen bei den eigenen Komponenten? Hat zwar nichts mit dem Thema zu tun aber das interessiert mich jetzt
  7. Hi, in meinem 2D Platformer Game habe ich Kisten: und Gegner die diese Kisten auf den Spieler werfen können: + = Ich möchte dass diese Boxen wenn sie mit einer gewissen Wucht auf etwas stoßen (Terrain oder Spieler) zerstört werden. Dafür hatte ich erst die OnCollisionEnter2D Funktion benutzen. Das sah dann so aus: private void OnCollisionEnter2D(Collision2D collision) { if (!collision.collider.isTrigger && !collision.collider.CompareTag("Enemy")) { //wenn die Velocity x oder y größer als 5 ist. if (Mathf.Abs(collision.relativeVelocity.x) > 5 || Mathf.Abs(collision.relativeVelocity.y) > 5) { if (collision.collider.CompareTag("Player")) { collision.collider.GetComponent<Player>().TakeDamage(1); } DestroyBox(); } } } Das Problem hierbei ist dass die Kiste auch zerstört wird wenn der Spieler sie berührt wärend er rennt oder draufspringt, da die Velocity der collision (in dem fall dem Spieler) genommen wird. Daher hab ich mir dann eine andere Methode ausprobiert und zwar mit der Funktion onTriggerEnter2D: private void OnTriggerEnter2D(Collider2D collision) { if (!collision.isTrigger && !collision.CompareTag("Enemy")) { if (Mathf.Abs(rb.velocity.x) > 5f || Mathf.Abs(rb.velocity.y) > 5f) { if (collision.CompareTag("Player")) { collision.GetComponent<Player>().TakeDamage(1); } DestroyBox(); } } } Aber um ehrlich zu sein finde ich diese Methode sehr unschön. Außerdem wird die Box schon kurz vor dem Impact zerstört was man zwar nicht wirklich merkt aber ich weiß es und das stört mich. Darum wollte ich fragen ob es da einen schöneren weg gibt. ich habe online immer nur diese 2 Methoden gefunden.
  8. naja mehr oder weniger. Unity empfiehlt diese LTS Versionen ja wenn man Unity neu Installiert. Ob das jetzt LTS ist oder nicht ist mir eigentlich egal ich verstehe eh nicht genau was es dmait auf sich hat. Außerdem habe ich das Gefühl dass die 2020er Versionen deutlich langsamer auf meinem Computer laufen. Evtl auch nur Einbildung. Ich arbeite oft an meinem sehr schwachen Laptop evtl kommt der auch einfach nicht klar mit den neuen Versionen. heißt ich soll die Warnings einfach ignorieren? mich stören sie ja nicht sonderlich aber ich dachte dass sie evtl negative Auswirkungen auf das Game später haben.
  9. hi, ich bekomme seit ich mein Projekt auf die Version 2019.4 geupdated habe immer genau 5x folgene Nachricht wenn ich Unity bzw das Projekt starte: was genau ist dieses SendMessage und wie kann ich verhindern dass es random genau 5x gecalled wird? Ich bin alle meine Skripts nochmal durchgegangen und finde keine Stelle wo ich irgendwo was mit SendMessage benutze. Wenn müsste es also vermutlich von einem Importierten Skript kommen aber In meinem Projekt benutze ich eigentlich nur A* Pathfinding, Textmeshpro, URP und Inputsystem als Addons/packages.
  10. Ich habe meinen Fehler dank dieser Seite hier: https://forum.unity.com/threads/learning-new-inputsystem-when-and-how-is-the-cancelled-callback-used.969501/ endlich funden. Mein Fehler war scheinbar dass ich statt Action Type: "Button" den Action Type: "Pass Through" verwenden musste. ich verstehe nicht so ganz warum aber scheinbar resettet "performed" nicht wenn man Button als action type hat. bei "Pass Through" schon. Aber damit dass passiert muss man statt "Hold" bei Pass Through wohl für den selben Effekt "Slow Tap" benutzen (Siehe Bild). ich werd niemals schlau aus dem Inputsystem... x.x Wollte jedenfalls trotzdem antworten für den Fall der Fälle das das Problem wieder jemand haben sollte.
  11. hast du es mal mit "passh through" probiert? funktioniert wunderbar bei mir. Hier die Klasse: public class FooBar : MonoBehaviour, InputManager.IMouseClickTestActions { private InputManager input; void Awake() { input = new InputManager(); input.MouseClickTest.SetCallbacks(this); } public void OnClick(InputAction.CallbackContext context) { Vector2 selectPosition = Camera.main.ScreenToWorldPoint(context.ReadValue<Vector2>()); Debug.Log($"Select position is: {selectPosition.x}|{selectPosition.y}"); } private void OnEnable() { input.MouseClickTest.Enable(); } private void OnDisable() { input.MouseClickTest.Disable(); } } (das Interface heißt natürlich anders bei dir) dasselbe kannst du natürlich auch über die Player Input Component machen anstatt über das interface. mir ist das interface einfach lieber.
  12. okay das stimmt natürlich. aber du hast ja bereits eine Action auf deiner Map die du per event triggern kannst: public void Select(InputAction.CallbackContext context) { if(//Device ist Maus) { Vector2 selectedPosition = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue()); Debug.Log($"Select position is: {selectPosition.x}|{selectPosition.y}"); } else if(//Device ist Touchscreen) { Vector2 selectedPosition = Camera.main.ScreenToWorldPoint(Touchscreen.current.position.ReadValue()); Debug.Log($"Select position is: {selectPosition.x}|{selectPosition.y}"); } }
  13. Ich habe wiedermal meine Probleme mit dem (neuen) Inputsystem wofür ich leider online keine Lösung finde. Also im ernst ich bin aktuell am überlegen das Inputsystem wieder zu wechseln. Weil fürs alte gibt es genügend spezifische Tutorials und Hilfestellungen. Und zwar bin ich aktuell an einem 2D Platformer am arbeiten. Da ich meine Jump performence ein wenig aufpolieren wollte habe ich mir ein paar Tutorials auf YT angeguckt und bin dann bei dem hier: hängen geblieben da mir das Konzept sehr gut gefällt. Nun.. leider benutzt er in seinem Video das alte InputSystem und dadurch kann ich das nicht alles so übernehmen wie ich es gern hätte. Um genau zu sein geht es um diese Stelle: if(rb.velocity.y < 0) { rb.velocity += Vector2.up * Physics2D.gravity.y * (fallMultiplier - 1) * Time.deltaTime; } else if (rb.velocity.y > 0 && !Input.GetButton("Jump")) { rb.velocity += Vector2.up * Physics2D.gravity.y * (lowJumpMutliplier - 1) * Time.deltaTime; } die ich versuche in meinem Projekt einzufügen. Es geht praktisch darum dass wenn man im laufe eines Jumps nicht mehr die Taste zum Springen drückt wird der Jump frühzeitig abgebrochen was einen High-Jump simuliert wenn man die Taste gedrückt hält. Nun aber zu meinem Setup: Wie ihr sehen könnt habe ich eine Action "Jump" mit der "Hold"-Interaction. Dies sollte es mir eigentlich ermöglichen in Folgender Funktion: public void OnJump(InputAction.CallbackContext context) { if (context.started && canMove && isGrounded && !PauseMenu.gameIsPaused && !isDead) { Debug.Log(context.phase); rb.velocity = new Vector2(rb.velocity.x, playerData.jumpForce * Time.deltaTime); } else if(context.canceled && canMove && !PauseMenu.gameIsPaused && !isDead) { Debug.Log(context.phase); rb.velocity += Vector2.up * Physics2D.gravity.y * (15f - 1) * Time.deltaTime; } else if (context.performed && canMove && !PauseMenu.gameIsPaused && !isDead) { Debug.Log(context.phase); } } welche vom folgenden Interface vererbt wird: public class Player : MonoBehaviour, InputManager.IPlayerActions die Methoden zu nutzen: context.started //Wenn Taste gedrückt wird. context.performed //Wenn die "Hold"-Duration von 0.4 sekunden erfüllt wird. context.canceled // Wenn die Taste released wird bevor "performed"erfüllt ist. performed brauche ich in dem Fall nicht. Ich hab nur testweise mal performed Debugged um zu gucken ob es überhaupt ausgeführt wird. So und jetzt zum eigentlichen Problem. Alle 3 States scheinen soweit zu funktionieren. Drücke ich die Taste kommt "started" durch das Debug.Log. Lasse ich sie frühzeitig los kommt "canceled". Lasse ich sie für 0.4 sekunden gedrückt kommt "performed" wie man hier sehen kann: allerdings hab ich nun das weirde Behavior dass die Komplette Aktion "Jump" egal welchen Button, welche Taste ich drücke komplett deaktiviert wird nachdem auch nur 1x die Phase "performed" erfüllt wird. Das bedeutet ich kann ab da nicht mehr Jumpen. Er führt die OnJump Methode scheinbar nicht mehr aus. Aber warum passiert das ? Muss ich die Phase "performed" irgendwie manuell zurücksetzen? oder hab ich evtl die komplett falsche herangehensweise gewählt? Ich bin leider total überfragt. vielen Dank im vorraus LG Marc
  14. verstehe ich das richtig dass du einen Mauscklick erfassen willst und seine Position in einer variable Speichern willst? wenn das alles ist brauchst du nur folgende Line: Vector2 selectedPosition = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue()); zumindest Klappt das für die Maus. mit Touchscreen hab ich mich nicht befasst aber da gibts safe auch eine Methode die ähnlich aussieht. Musst dafür auch keine Actions für deine Map festlegen aber würde sich je nachdem anbieten wenn du verschiedene Controls benutzt. Edit: für den Touchscreen wäre das Äquivalent wohl: Vector2 selectedPosition = Camera.main.ScreenToWorldPoint(Touchscreen.current.position.ReadValue()); bzw Vector2 selectedPosition = Camera.main.ScreenToWorldPoint(Touchscreen.current.startPosition.ReadValue()); wenn du nur die Position des Fingers brauchst als du den Touchscreen das erste mal berührt hast. (ändert sich nicht wenn du den Finger bewegst wärend Touch. Das ganze kannst du auch hier nachlesen: https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/Touch.html
×
×
  • Create New...