Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

17.05.2016, 16:32

Unity 5 - 2D - Charakter Controller hängt in "Jump" Animation trotz Rigidbody 2D

Hey liebe Community,
leider hänge ich bei meinem Projekt, ein 2D Sidescroller mit Unity5,zu erstellen bei einem Problem.
Mein Charakter Controller hängt bei Play in der Luft und ist zuerst in einer Idle Animation, geht dann in eine Loop Jump Animation und sinkt nicht zu Grund trotz Rigidbody 2D.
Wenn ich den Animator beim Controller heraus nehme, sinkt dieser und ist steuerbar jedoch ohne Animationen was ja nicht der Sinn und Zweck sein soll.
Ohne Rigidbody 2D kommen folglich Script Probleme da ich diesen miteingebunden habe.
Bin noch grün hinter den Ohren was das Programmieren betrifft und habe keine großen Ambitionen.
Hoffe ihr könnt mir dennoch helfen.
Danke schonmal :)

Hier nun mein bisheriges Script:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour {

    public float maxSpeed = 4;
    public float jumpForce = 550;
    public Transform groundCheck;
    public LayerMask whatIsGround;
    
    [HideInInspector]
    public bool lookingRight = true;
    
    private Rigidbody2D rb2D;
    private Animator anim;
    private bool isGrounded = false;
    private bool jump = false;
    
    // Use this for initialization
    void Start () { 
        rb2D = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
    }
    
    // Update is called once per frame
    void Update () {
        if (Input.GetButtonDown("Jump") && isGrounded)
            jump = true;
    }
    
    
    void FixedUpdate()
    {
        float hor = Input.GetAxis("Horizontal");
        
        anim.SetFloat("Speed",Mathf.Abs(hor));
        
        rb2D.velocity = new Vector2(hor * maxSpeed, rb2D.velocity.y);
    
        isGrounded = Physics2D.OverlapCircle (groundCheck.position, 0.15F, whatIsGround);
        
        anim.SetBool("IsGrounded", isGrounded);
        
        if ((hor > 0 && !lookingRight) ||(hor < 0 && lookingRight))
            Flip ();
        
        if(jump)
        {
            rb2D.AddForce(new Vector2(0,jumpForce));
            jump = false;
        }
    }
    
    public void Flip()
    {
        lookingRight = !lookingRight;
        Vector3 myScale = transform.localScale;
        myScale.x *= -1;
        transform.localScale = myScale;
    }
}

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

18.05.2016, 01:10

Unity Tutorial: 2D CHARACTER CONTROLLERS (sofern noch nicht gesehen)

In deinem Code fällt mir aber auf: Du prüfst im normalen Update, ob die Sprungtaste gedrückt wurde, statt in FixedUpdate selbst, wo es verwendet wird. Gibt es einen bestimmten Grund dafür?
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

3

18.05.2016, 16:44

Hatte gehört das es bei der normalen Updatefunktion genauer sein soll da ja nur der Moment des Herunterdrückens der Taste entscheidend ist und nicht wie bei fixed Update wo man die "laufen" Taste gedrückt halten muss. Bin mir nich sicher ob das so gut oder richtig ist.
Im Video find ich leider mein Problem nicht :(

4

18.05.2016, 17:51

Du manipulierst über den Animator höchstwahrscheinlich die transform x/y und setzt sie jeden frame/tick auf 0/whatever.
Das überschreibt auch die Position des rigidbody, wodurch die Figur natürlich hängen bleibt.

Eine einfache Lösung ist es, diese Dinge zu trennen. Bau deine Figur z.B. so auf:
Player
- Body
- Sprite

Ich trenne in meinen Spielen oft Sprite nochmal in SpriteBase->Sprite ein, wodurch ich z.B. Rotation und Bewegung getrennt haben kann.

5

19.05.2016, 16:30

Also ich hab die sprites/textures als child object in meinem player und die einzelnen texturen haben bis auf einen sprite renderer keine komponenten falls das deine vermutung war

Hab jetzt mal andere Animationen mit Sprites gemacht und nun scheint es zu funktionieren, also war entweder was beim Animator oder bei den Animationen selbst nicht in Ordnung, weiß jedoch nicht genau was. Mal wieder typisch :P

Aber vieeeelen Dank an euch :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Tyeona« (20.05.2016, 17:24)


Werbeanzeige