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

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

1

27.05.2013, 14:21

[Unity3D + C#] C# Code funktioniert nicht richtig

Ich habe vor kurzem angefangen mit Unity3D zu arbeiten, zurzeit schaue ich mir einige Youtube Tutorials an um den Umgang mit Unity3D richtig zu lernen, jedoch sind meine C# Kenntnisse fast gleich 0 (ich habe mir bisher das meiste von C++ abgeleitet).

Ich habe das Simple Ego-Shooter Tutorial angeschaut und mir von hier das Projekt gedownloadet : http://quill18.com/unity_tutorials/


Nun hab eich den Code von FPS Shooting so verändert das er so aussieht:



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
using UnityEngine;
using System.Collections;

public class FP_Shooting : MonoBehaviour {
    
    public GameObject bullet_prefab;
    public bool automatic = true;
    float bulletImpulse = 80f;

    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
        
        if( Input.GetButtonDown("Fire2") && automatic == false) {
            automatic = true;
        }
        
        if( Input.GetButtonDown("Fire2") && automatic == true ) {
        automatic = false;  
        }
        
        if( Input.GetButtonDown("Fire1") && automatic == false ) {
            Camera cam = Camera.main;
            GameObject thebullet = (GameObject)Instantiate(bullet_prefab, cam.transform.position + cam.transform.forward, cam.transform.rotation);
            thebullet.rigidbody.AddForce( cam.transform.forward * bulletImpulse, ForceMode.Impulse);
        }
        
        if( Input.GetButton("Fire1") && automatic == true ) {
            Camera cam = Camera.main;
            GameObject thebullet = (GameObject)Instantiate(bullet_prefab, cam.transform.position + cam.transform.forward, cam.transform.rotation);
            thebullet.rigidbody.AddForce( cam.transform.forward * bulletImpulse, ForceMode.Impulse);
        }
    }
}


Dieser Code soll dafür sorgen das man mit der rechten Maustaste zwischen einem Vollautomatischen- und einem Halbautomatischenmodus wechseln kann.
Es funktioniert nur eingeschränkt, wenn ich am Anfang Vollautomatisch eingestellt hab klappt es wenn ich dann die rechte Maustaste drücke wechselt er in den Halbautomatischen so weit funktioniert es, wenn ich jedoch zurück in den Vollautomatischen will funktioniert es nicht.
Wenn ich aber im Unity Editor manuell die Variable verändere (sie ist ja public) funktioniert es.
Meine Frage ist wieso es in die eine Richtung funktioniert aber in die andere nicht?

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

27.05.2013, 15:19

C#-Quelltext

1
2
3
4
5
6
7
        if( Input.GetButtonDown("Fire2") && automatic == false) {
            automatic = true;
        }
        
        if( Input.GetButtonDown("Fire2") && automatic == true ) {
        automatic = false;  
        }

In diesem Codeabschnitt steckt der Fehler.

Nachtrag:
Ich möchte außerdem noch anmerken, dass dich wohl nicht interessiert, ob die taste in dem Frame sich im Zustand "heruntergedrückt" befindet, sondern ob es seit dem letzten Frame eine Änderung in diesen Zustand gab. Ansonsten könnte es sein, dass es in jedem Frame wechselt, solange die Taste gedrückt wird.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

3

27.05.2013, 22:38

Ich weiß schon das da der Fehler liegt nur wie behebe ich ihn? Ich habe jetzt nur noch GetButton anstatt GetButtonDown so wie du es mir geraten hast es hilft jedoch nichts.

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

4

27.05.2013, 23:37

else if anstatt if, ansonsten wird automatic immer auf false gesetzt.

5

28.05.2013, 08:08



else if anstatt if, ansonsten wird automatic immer auf false gesetzt.

Das hilft zwar "kurz", da automatic nicht direkt wieder false gesetzt wird, aber spätestens beim nächsten Aufruf von update wird automatic wieder verändert. Sacaldur hat die Lösung schon gennannt.

imakemygame

Treue Seele

Beiträge: 141

Wohnort: Hamburg

Beruf: Fachinformatiker // Service Techniker

  • Private Nachricht senden

6

28.05.2013, 08:15

else if anstatt if, ansonsten wird automatic immer auf false gesetzt.

genau das ist die Lösung. So würde ich es auch machen.

Else if wird nur ausgeführt, wenn die Bedingung dafür erfüllt ist UND die Abfragen davor nicht erfüllt waren. Das könnten vorher mehrere else if´s und oder dein eines if sein

imakemygame

Treue Seele

Beiträge: 141

Wohnort: Hamburg

Beruf: Fachinformatiker // Service Techniker

  • Private Nachricht senden

7

28.05.2013, 08:22



else if anstatt if, ansonsten wird automatic immer auf false gesetzt.

Das hilft zwar "kurz", da automatic nicht direkt wieder false gesetzt wird, aber spätestens beim nächsten Aufruf von update wird automatic wieder verändert. Sacaldur hat die Lösung schon gennannt.

Ich glaube das ist aber nicht seine Fragestellung gewesen.

Falls doch könnte die Lösung wie folgt aussehen

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private bool wasReleased = true;

        if( Input.GetButtonDown("Fire2") && automatic == false && wasReleased == true) {
            automatic = true;
            wasReleased = false;
        }
        
        else if(Input.GetButtonDown("Fire2") && automatic == true && wasReleased == true ) {
        automatic = false;  
        wasReleased = false;
        }
        if(Input.GetButtonUp("Fire2")){
        wasReleased = true;
        }

8

28.05.2013, 08:49

Ah okay, mein Fehler. Ich dachte getButtonDown würde solange true liefern wie der Button gedrückt wird. Scheinbar liefert die Funktion aber nur in dem einen Frame true, wenn der Button "down" gedrückt wurde.

edit: Mir scheint die Wahl der Methodennamen bei Unity in dem Fall nicht ganz so glücklich. getButton soll wiederum true liefern während der Button gedrückt wird...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Misant« (28.05.2013, 09:00)


imakemygame

Treue Seele

Beiträge: 141

Wohnort: Hamburg

Beruf: Fachinformatiker // Service Techniker

  • Private Nachricht senden

9

28.05.2013, 09:11

Ah okay, mein Fehler. Ich dachte getButtonDown würde solange true liefern wie der Button gedrückt wird. Scheinbar liefert die Funktion aber nur in dem einen Frame true, wenn der Button "down" gedrückt wurde.

edit: Mir scheint die Wahl der Methodennamen bei Unity in dem Fall nicht ganz so glücklich. getButton soll wiederum true liefern während der Button gedrückt wird...

Also da du mich eben auch nochmal verunsichert hast (ich arbeite derzeit mit GUI.Button, deshalb habe ich da auch nicht so die Erfahrung) habe ich nochmal nachgeschaut

es gibt:

getButton - liefert immer True wenn in diesem Frame der Button gedrückt ist
getButtonDown - liefert nur True im ersten Frame wo der Button gedrückt wird
getButtonUp - liefert nur True im ersten Frame wo der Button released wird

Insofern kann mein Code verbessert werden, in dem man das wasReleased entfernt, da dies ja schon durch die richtige Wahl der getButton-Methode implizit passiert

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

10

28.05.2013, 11:10

So verwirrend ist es doch nicht, getButtonDown liefert true zurück, in genau dem Frame, in dem der Button heruntergrdrückt wird, getButton liefert einfach den Zustand des Buttons, getButtonUp liefert true zurück, in genau dem Frame, in dem der Button losgelassen wird. Insofern sollte meine Lösung korrekt sein.

Werbeanzeige