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

Martin Mundorf

Treue Seele

  • »Martin Mundorf« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Waldorf, Kr. Ahrweiler

Beruf: Althistoriker

  • Private Nachricht senden

11

21.10.2016, 20:13

aber wie löse ich dann das Problem?

Ich bin nicht anders vorgegangen als bis hier her auch... ?(
"Eine Signatur ist das Buchstaben-Zahlen-Zettelchen unten an ein einem Buch in der Bibliothek!"



was ich zur Zeit ausprobiere: 3rd person Shooter <- hierfür suche ich noch Unterstützung.


"Lehrjahre": Im Lande der Hasen
mein ewiges Spielprojekt "Straights & Rows".
meine Grafiken "ohne Verwendungszweck"

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

12

21.10.2016, 20:19

Ich hatte schon beim Lesen deines ersten Beitrags Schwierigkeiten, deine Probleme herauszulesen. Bitte beschreibe also einfach nochmal
  • Was wolltest du erreichen?
  • Welchen Lösungsanstz hast du verfolgt, um dies zu erreichen?
  • Auf welche Probleme bist du dabei gestoßen?
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Martin Mundorf

Treue Seele

  • »Martin Mundorf« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Waldorf, Kr. Ahrweiler

Beruf: Althistoriker

  • Private Nachricht senden

13

21.10.2016, 20:44

Im Prinzip wollte ich mir aufzählen lassen, wie viele "Feinde" mein Spielecharakter getötet hat.

Der Gegner hat ein eigenes health-Script (KLasse). Standardmäßig ist health = 4.
Jeder SchußTreffer zieht ihm -1 ab.
Und wenn health = 0, dann zerstört sich das GameObject "Enemy". Und genau in diesem Schritt, soll im PlayerControl-Script die Variable "kills" um +1 raufgesetzt werden.

aufgetrene Probleme: anstatt nach dem vierten Schuß war der Gegner schon nach einem Schuß weg - die Variable blieb aber null.

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



public class EnemyHealth : MonoBehaviour {
  
    public float health = 4;
    public PlayerController Player;
    
        void ApplyDamage (float damage)
    {
      
        health -= damage;

        if (health <= 0)
         
      Player .kills = Player .kills +1;
         Destroy(gameObject);
          
    }


}



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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class PlayerController : MonoBehaviour {
  public AudioSource shootSource;
    public float maxSpeed = 3.0f;
    public float jumpForce = 450f;
    public Transform groundCheck;
    public LayerMask whatisGround;
  public int kills = 0;
     public Text KillText;


    //***
    public int ammo = 9;
    public Text AmmoText;
    public Text endtxt;
    public AudioClip shootsound;
    public AudioClip pickupsound;

    public float damage = 2f;

  
    //***


    [HideInInspector]
    public bool lookingRight = true;

   public GameObject laserPrefab;
   public Transform spawnPoint;
   public float laserSpeed = 500f;

    private Rigidbody2D rb2d;

    private Animator anim;

    private bool isGrounded = false;
    private bool jump = false;
   private bool isAttacking = false;

    // ***
    private bool swordattack = false;
    private bool genugammo = true;
    //***


    // Use this for initialization
    void Start() {
        rb2d = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
      

        amotxt();
          }
            
            // Update is called once per frame
    void Update () {
    if (Input.GetButtonDown ("Jump") && isGrounded)
                jump = true;
     

        if (Input.GetButtonDown("Fire1") && !isAttacking)
         isAttacking = true;
       
        //***
        if (Input.GetButtonDown("Fire2") && !swordattack)
            swordattack = true;
        //***

      //  KillText.text = kills.ToString() ;
    
    }


    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;


 
        if (ammo <= 0)
        {
            genugammo  = false;

                   }



        if (isAttacking && genugammo)
        {

            anim.SetTrigger("Attack");
            GameObject laser = (GameObject)Instantiate(laserPrefab, spawnPoint.position, Quaternion.identity);

            if (lookingRight)  
                laser.GetComponent<Rigidbody2D>().AddForce(Vector3.right * laserSpeed);
            else
                laser.GetComponent<Rigidbody2D>().AddForce(Vector3.left * laserSpeed);

         ammo = ammo - 1;

            AudioSource.PlayClipAtPoint(shootsound, transform.position, 1);

            isAttacking = false;
            amotxt();
        }
          
        

     
        if ((swordattack) || (isAttacking && !genugammo))
            anim.SetTrigger("SwordAttack");
     
        // *** hier damage-Prozedur für Schwertattacke einfügen

      

        

        swordattack = false;
        isAttacking = false;
        //***


    }



    public void Flip()
    {

        lookingRight = !lookingRight;

        Vector3 myscale = transform.localScale;
        myscale.x *= -1;
        transform.localScale = myscale;


    }

    void OnCollisionEnter2D(Collision2D other)
    {

        if (other.gameObject.CompareTag("AmmoBox"))
        {
            ammo = ammo + 27;
            pickupsnd();
            amotxt();
        }


        if (other.gameObject.CompareTag("Magazin"))
        {
            ammo = ammo + 9;
            pickupsnd();
            amotxt();
        }


        if (other.gameObject.CompareTag("LevelExit"))
        {
            endtxt.text = "Ende!";
        }

    }

    
    void pickupsnd()
    {
        AudioSource.PlayClipAtPoint(pickupsound, transform.position, 1);

    }

    void amotxt()
    {
        AmmoText.text = ammo.ToString();
        genugammo = true;
        KillText.text = kills.ToString();

    }



}
"Eine Signatur ist das Buchstaben-Zahlen-Zettelchen unten an ein einem Buch in der Bibliothek!"



was ich zur Zeit ausprobiere: 3rd person Shooter <- hierfür suche ich noch Unterstützung.


"Lehrjahre": Im Lande der Hasen
mein ewiges Spielprojekt "Straights & Rows".
meine Grafiken "ohne Verwendungszweck"

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

14

21.10.2016, 20:56

Schau dir die Klammerung nach der Bedingung an. Was passiert, wenn eine Bedingung keinen eigenen Block (mit geschweiften Klammern) hat?
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Martin Mundorf

Treue Seele

  • »Martin Mundorf« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Waldorf, Kr. Ahrweiler

Beruf: Althistoriker

  • Private Nachricht senden

15

21.10.2016, 21:16

ah, kleiner Flüchtigkeitsfehler, sorry.

Aber das Grundproblem ist dann wieder wie eingangs beschrieben: mein prefab-Charakter zählt die kills, der im Spiel aber nicht.

Natürlich habe ich versucht, dem prefab-Enemy den tatsächlichen Spielecharakter auf den Slot zu ziehen, was aber nicht ging, also hab ich den prefab-Charakter draufgezogen...

und der zählt auch jeden Kill mit.

Allerdings: bei neustarten (neu testen) stehen dann die Kills aus dem vorigen Testlauf in der Anzeige (logisch, er saugt sich das wohl aus dem prefab). Aber warum kann ich meinen wirklichen Spielecharakter nicht als "Zielobjekt" für diese Funktion belegen? :hmm:
"Eine Signatur ist das Buchstaben-Zahlen-Zettelchen unten an ein einem Buch in der Bibliothek!"



was ich zur Zeit ausprobiere: 3rd person Shooter <- hierfür suche ich noch Unterstützung.


"Lehrjahre": Im Lande der Hasen
mein ewiges Spielprojekt "Straights & Rows".
meine Grafiken "ohne Verwendungszweck"

Martin Mundorf

Treue Seele

  • »Martin Mundorf« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Waldorf, Kr. Ahrweiler

Beruf: Althistoriker

  • Private Nachricht senden

16

21.10.2016, 21:51

Nachtrag: vielleicht verstehe ich nicht allzuviel Fachsprache, aber ich glaube ich bin durch langes beobachten drauf gekommen, was scaldur versuchte mir zu sagen:

Ich weise die Kill-punkte ja zur laufzeit zu, also muß der Adressat ja der Laufzeit Spielecharakter sein, und nicht der im prefab... ergo: kleine Anpassung im Code, und dann funktioniert auch "alles" so wie es soll :D

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 EnemyHealth : MonoBehaviour {

    public float health = 4;
    public PlayerController Player;
    public GameObject other;
    public  PlayerController gaco; 

    void Start()
    {
        other = GameObject.FindGameObjectWithTag("Player");
               
       gaco = other.GetComponent<PlayerController>();
    }

    


void ApplyDamage (float damage)
    {
      
        health -= damage;

        if (health <= 0)
        {
                    

           gaco.kills = gaco.kills + 1;
            Destroy(gameObject);
        }
    }


}
"Eine Signatur ist das Buchstaben-Zahlen-Zettelchen unten an ein einem Buch in der Bibliothek!"



was ich zur Zeit ausprobiere: 3rd person Shooter <- hierfür suche ich noch Unterstützung.


"Lehrjahre": Im Lande der Hasen
mein ewiges Spielprojekt "Straights & Rows".
meine Grafiken "ohne Verwendungszweck"

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

17

22.10.2016, 11:11

Besser wäre an der Stelle, wenn man "Inversion of Control" anwenden würde, der Enemy sich also nicht den Player raussucht, sondern diesem bei Instanziierung zugewiesen wird.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige