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

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

51

23.01.2018, 23:27

Nachfrage: läufts denn nun bei dir flüssiger als vorher? ich habe ja einie Update-Abfragen abgespeckt...

Ja, läuft sehr gut. Allerdings weiß ich nicht, ob es an deinen Optimierungen liegt oder an meiner neuen Grafikkarte (oder an beidem).

Übrigens: Wie hast du eigentlich das Schießen mit automatischen Waffen implementiert? Mir kommt es so vor, als ob die Schussfrequenz von der Framerate abhängt. Machst du das in Update (wird einmal pro Frame aufgerufen) oder in FixedUpdate? Wenn ersteres: Berücksichtigst du die seit dem letzten Update vergangene Zeit und feuerst ggf. direkt mehrere Schüsse ab, wenn das letzte Update zu lange her ist? (für's erste wäre es einfacher, das in FixedUpdate zu machen, denn das wird immer gleich oft pro Sekunde aufgerufen - egal wie hoch die visuelle Framerate ist)

Martin Mundorf

Treue Seele

  • »Martin Mundorf« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Waldorf, Kr. Ahrweiler

Beruf: Althistoriker

  • Private Nachricht senden

52

23.01.2018, 23:52

Das istne gute Frage... das programmatische Gerüst dazu stammt aus dem Ursprungs-Tutorial, an dem ich mich orientiert habe.

die Waffe(WeaponSkript) erhält ihren Schießbefehl vom Weaponhandlerskript, das wiederum vom AI-Skript oder dem UserInput-Script gesteuert wird.
der Feuerbefehl sitzt zb in letzterem in einer Funktion WeaponLogic(), die über das Update ausgeführt wird.
D.h. ich kann nicht so mal eben schnell eine Funktion "fire()" ins fixedUpdate auslagern... :hmm:

das muß ich mir entweder angucken, wenn ich mit meinem Level-Quest-Teil durchbin, oder ein erfahrener Revisor macht sich mal die Mühe, und schaut "von außen" nach.... :wacko: :whistling:
"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"

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

53

27.01.2018, 14:50

Hey,
du hattest im Depri-Thread angemerkt dass du dich mit deinem Quest-System verzettelst. Ich gebe dazu auch mal meinen Senf ab :)

Zitat


nuja, es ist so:

meine Quests eine simple Liste an Gameobjekten, die mit der Art der Aufgabe (finden, zerstören, zu Zone bringen) an den Levelcontroller übergeben werden.
Gleichzeitig hat der Levelcontroller diverse Listen, auf denen die unterschiedlichen Quests dann gespeichert werden. wenn der Quest dann erfüllt ist, wird in der betreffenden Liste -=1 runtergerechnet - bis "alle Aufgaben" = 0 ist.
(dann Mission: geschafft).

natürlich soll das auch so funktionieren, das nicht bloß -1 gerechnet wird, sondern nur da, wenn auch tatsächlich dieser Quest erledigt wurde. das scheint auch zu funktionieren.

Aber hinzu kommt: was, wenn ich ein Objekt schon vor Annahme des Quests gefunden oder zerstört habe? (was ja passieren kann) Lösung: dann löscht der Quest sich selbst. Aber nach der Annahme des Quests (mal angenommen ich soll einen heiligen Stein finden, nehme den Quest an, zerstöre den Stein aber, bevor ich ihn gefunden habe? Dann müßte sich der Quest auch löschen, und dann mein Levelcontroller die Listen nochmal neu durchlaufen - auch das müßte eigentlich funktionieren.

wichtiger KasusKnacktus ist aber: diese Quests werden mir von NPCs angeboten.
ich kann aber in meinem Levelcontroller auch von vorneherein Aufgaben an den Spieler stellen... ohne, das ein Quest (-Objekt) dafür nötig ist... und irgendwie zerhackts mir da meine Prüfziffer- ints :hmm:


Wie wäre es denn wenn du das ganze etwas datenorientierter angehen würdest. Bestimmte Aktionen die durchgeführt werden können ja Events auslösen. Diese Events werden von deinem Aufgabensystem überwacht und dort passend ausgewertet. Mal ein simples Beispiel welches man aus Spielen wie WoW und Co kennt. Ziel einer Quest ist es 10 Gegner vom Typ A zu töten. Jedes mal wenn ein Gegner vom Typ A getötet wird wird ein Event an das Quest System gesendet dass dieser Gegner eben getötet wurde. Aus dem Event muss ersichtlich sein dass Gegner Typ A ein wiederkehrender Gegner ist. Das bedeutet, findet dein Quest-System eine aktive Quest die das töten von Gegnern vom Typ A erfordert, so wird der getötete Gegner verrechnet. Ist keine Quest aktiv die so etwas erfordert dann passiert einfach nichts.
Ein weiteres Beispiel, bezogen auf deinen heiligen Stein der vernichtet werden muss. Wird der zerstört dann feuert er ein Event das dem Questsystem sagt dass er zerstört wurde und dass er ein einzigartiges Objekt ist. Dein Quest-System kann jetzt passend darauf reagieren. Die Möglichkeiten dafür sind unterschiedlich. Ist die Quest aktiv so ist die Behandlung an sich einfach. Das Quest-System kann die Quest als abgeschlossen markieren und gut. Interessanter wird es ja wenn die Quest noch nicht angenommen/gefunden wurde. Hier mal ein paar Möglichkeiten:
1: Das Questsystem löscht die Quest einfach. Das heißt die Quest kann nachträglich nicht mehr angenommen werden.
2: Das Questsystem merkt sich dass der Stein zerstört wurde. Wenn die Quest nachträglich angenommen wird kann sie daraufhin direkt als gelöst markiert werden. Dafür reicht es wenn bei der Annahme einer Quest das Quest-System die gespeicherten Events durchläuft.
3: Wie bei 2, nur dass die Quest möglicherweise gar nicht erst angenommen werden muss. Der Questgeber könnte einen anderen Text aufsagen und dem Spieler direkt für seine Hilfe danken. Es ist natürlich viel mehr Aufwand wenn du für diese Art von Quests jeweils einen alternativen Text schreiben musst.

Was zu beachten gilt. Möchtest du den Eintrag löschen, sodass das Quessystem vergisst dass der Stein zerstört wurde, so darf der Stein natürlich nicht für weitere Quests von belang sein. Wenn du zum Beispiel zwei Quests haben solltest die die Zerstörung von dem Stein als Unterziel haben, dann darfst du den Eintrag erst dann löschen wenn alle Quests davon abgeschlossen sind. Oder du behältst diese Einträge einfach bei.

Das schöne bei der ganzen Sache ist dass du Quests und solche Events theoretisch in Textdateien auslagern kannst. Ich habe sowas mal mit dem JSON Format gemacht. Du kannst verschiedene Event Typen anlegen.
Beispiele: Töte Gegner, Finde Item, Spreche mit Person XY.
Ein Event weiß ob es einmalig oder mehrfach auslösbar ist. Das bezieht sich auf die beiden Beispiele oben. Den Stein kannst du nur ein mal zerstören, die Gegner aber mehrfach töten.
Möglicherweise werden Sonderdaten gespeichert wie zum Beispiel eine ID eines NPC, der Typ eines Items oder eines Gegners oder was auch immer du benötigst.
Theoretisch könnte ein Event auch nur für eine bestimmte Zeit gelten. In Zelda Ocarina of Time musste man in einer Quest eine Suppe abholen und in einer bestimmten Zeit abliefern damit sie nicht kalt wird. Das Event "hat Suppe aufgenommen" könnte die Zeit speichern. Das Quest-System könnte diese Zeit dann nutzen und weiter verarbeiten. Nach der abgelaufenen Zeit wird dann ein weiteres Event getriggert dass die Quest als fehlgeschlagen markiert.

Eine Quest muss jetzt im Prinzip nur wissen welche Events zum erfüllen getriggert werden müssen. Zusätzlich kann gespeichert werden ob die Reihenfolge wichtig ist oder nicht, was die Belohnung ist, wo die Quest angenommen und wo abgegeben werden soll, welche Texte der Questgeber sagen soll und vieles mehr. Möchtest du Quests mit Unterquests haben kannst du das ganze als Kompositum anlegen. Das bedeutet dass eine Quest entweder eine Atomare Quest ist oder eben aus mehreren Quests besteht. Das ganze lässt sich übrigens auch mit JSON ausdrücken.

Quellcode

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
{
  "type": "composite",
  "data": { ... },
  "children": 
    [
      {
        "type": "atom",
        "data": { ... }
      },
      {
        "type": "composite",
        "data": { ... },
        "children":
        [
          {
            "type": "atom",
            "data": { ... }
          },
          {
            "type": "atom",
            "data": { ... }
          }
        ]
      },
      {
        "type": "atom",
        "data": { ... }
      }
    ]
}

Das ist nur ein sehr einfacher beispielhafter Aufbau. Du musst die Daten natürlich nicht auslagern, das ganze macht dein System aber flexibler.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Martin Mundorf

Treue Seele

  • »Martin Mundorf« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Waldorf, Kr. Ahrweiler

Beruf: Althistoriker

  • Private Nachricht senden

54

27.01.2018, 20:19

Hallo,


ich habe mir deine Ideengänge sorgsam durchgelesen.
beim zweiten oder drittenmal hab ich ansatzweise verstanden, was du meinst, und ich glaube, ich habe das auch so ähnlich umgesetzt, wie du vorgeschlagen hast.
Allerdings bin ich auf zwei Probleme gestoßen:

1.) Das Problem ist nicht mehr das zerstören des Steins vor Annahme des Quests (dieser wird dann erst freigeschaltet), sondern danach.
Wenn ein Quest-Objekt zerstört wird, löscht sich der Quest. Allerdings wird dann Hauptzähler nicht -=1 gesetzt, was bedeutet: Die Mission kann nicht komplett gelöst werden.

2.) ich könnte nun hingehen, und die Quests in "missionswichtig" und "missions-unwichtig" unterteilen (mit einem bool). Dann müßte ich aber noch mehr gliedern und auflisten...das erscheint mir grade etwas horrormäßig.

Jetzt, wo ich das schreibe, kommt mir die Idee zu 1.)
wenn ich nun doch dann den Hauptzähler bei Löschung eines unerfüllten Quests um 1 runter setze, dann kann ich die Mission immer nochlösen.
Da mein Spielecharakter "erfüllte Quests" mitzählt, kann ich dann beim Missionsende auswerten und vergleichen. Dort stünde dann:

"Mission erfolgreich 5/5 Quests erfüllt"
, oder, im Falle, das ich den Stein (unabsichtlich) zerstört habe, bevor ich ihn gefunden habe (Quest gelöscht -=1)
"Mission erfolgreich 4/5 Quests erfüllt"

Ich glaube, das probiere ich mal aus... :hmm: ***

Weiterhin habe ich ein Problem: wenn ich eine (oder mehrere) Personen bewachen soll(müssen überleben). Ob ich nun das schon bei Levelbeginn oder im Spiel über einen Quest mache: die Zahl wird +1 gesetzt, aber nie erfüllt, da ja das überleben "in der Unendlichkeit" (Missionsende) eintritt (ich habe noch keinen Suppe-wird-kalt-Timer).
Wenn der/den Person/en was passiert (health <=0) - dann ist die Mission eh gelaufen.

...ich überlege, as passiert, wenn ich bei Annahme eines Person-muß-überleben-Quests einfach dieses +1 rauslasse :hmm: ...dann muß sich der Spieler halt so merken, auf wen er aufpassen soll...wenn ers nicht tut, wird er es merken :?: :rolleyes:

Ich hoffe ich habe deinen Ansatz richtig interpretiert, und der geneigte Leser hat verstanden, was ich meine



*** Nachtrag: es hakt an der einen Stelle: nachdem sich der Quest gelöscht hat, müßte ich mit dem Befehl
lc.setnewChallenge (); alles wieder in die Bahn bekommen. Und zwar abgefeuert aus dem nicht-erfüllbaren Quest.
Diesen muß ich aber vorher löschen, damit er nicht wieder neu registriert wird. Da ich ihn aber gelöscht habe, kann ich
lc.setnewChallenge() nicht mehr abfeuern... 8|
Das ist grad des Pudels Kern...

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
public  bool CheckFoundObjects()
    {
        for (int i = 0; i < questObjects.Length  ; i++) 
        {
            if (questObjects [i] == null) 
            {
                Debug.Log ("Questfail");

                lc.challenges.ObjectFindQuests -= 1;
                vorundnach .hatAuswirkungen = false;
                destroyME ();
                break;
            }

            if (!questObjects [i].GetComponent <StaticObjectTopFind > ().einstellungen.wurdeBereitsGefunden) 
            {   
                return false;
            }

        }

    return true;
    }
"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"

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Martin Mundorf« (27.01.2018, 20:26)


Martin Mundorf

Treue Seele

  • »Martin Mundorf« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Waldorf, Kr. Ahrweiler

Beruf: Althistoriker

  • Private Nachricht senden

55

28.01.2018, 14:37

ich blick nicht mehr durch

Ich vestehe mein eigenes Skript nicht mehr. Bzw: Ich verstehe es schon,
aber ich bin mit der mir unbekannten Fülle möglicher Fälle (Quest angenommen, aber nicht erfüllt) überfordert.
Außerdem wenn ich zum Levelstart im levelConttroller Aufgaben manuell eintrage (also Aufgaben, die nicht durch NPCs gestellt werden), dann steigt die Zahl der Möglichkeiten ins Unermeßliche?logarithmisch?exponentiell?

Wenn man alle Aufgaben der Reihe nach löst, ohne davon abzuweichen, gehts gut. aber nur dann.
Schorschs Datenauslagerung habe ich nicht verstanden.

Bei mir sind Quests prefabs mit individuell einstellbaren Spezifikationen, die zu Speilbeginn vom Levelcontroller registriert werden. Soweit komm ich noch mit.

aber dann hörts auf. Ich kann die Komplexität auch hier schwer erklären - dazu müßtet ihr mein Unity sehen. (ich fürchte da bringen meine Skripte nicht viel). wie im depri-Thread aschon angemerkt: Ich schaffs imemr nur bis zu den 80% - für die restlichen 20 fehlt mir offenbar das Informatiker und Unity-Gen.
(kann nicht einer mal auf nen Kaffee vorbeikommen?)

falls es doch hilfreich sein sollte: hier mal mein LevelController und mein Quest-Skript:

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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LevelController : MonoBehaviour 
{


    [System .Serializable ]
    public class Aufbau
    {
        [Header ("Teleport")]
        public Teleporter [] Teleporter;
        public TeleZIEL [] TeleporterZiele;

        [Header("Wegpunkte")]
        public KI_Wegpunkt[] Wegpunkte ;
    
        [Header("Spawnpunkte")]
        public Spawn[] Spawnpunkte;

        [Header("Positionen")]
        public STARTPOS StartPosition;
        public TargetZone targetZone;   

    }
    public Aufbau aufbau ;
    [SerializeField ]

    [System.Serializable ]
    public class Personen
    {
        [Header("Survive")]
        public List <CharacterStats> MustSurviveThisMission = new List<CharacterStats> ();
        public bool survived = true;

        [Header("Reach Zone")]
        public List <GameObject  > MustReachTargetZone = new List<GameObject > ();
        public bool reached = false;

        [Header("Kill")]
        public bool KillAllEnemies = true;
        public bool KillSpecificVillain = false;
        public CharacterStats  Villain;
        public bool VillainKilled = false;
        public bool Allkilled = false;

        [Header("to find")]
        public bool thereArePeopleToFind = false;
        public List <GameObject > PersonsToFind = new List<GameObject> ();
        public bool AllPeopleFound = false;
        public string specificPersonName;

        [Header("Auftraggeber")]
        public List <string> Auftraggeber = new List<string> ();
        public List <Quest > AngenommeneAufträge = new List <Quest > ();
    
    }
    public Personen personen;
    [SerializeField ]

    [System .Serializable ]
    public class Challenges
    {
        [Header("Point Goals")]
        public bool Culture = false;
        public float CulturePointsToBreak = 0;
        public bool Detection = false;
        public float DetectSkillToBreak = 0;
        public bool Loyality = false;
        public float LoyalitySkillToBreak = 0;
        public bool Shooting = false;
        public float ShootSkillToBreak = 0;
        public bool CurrentPoints = false;
        public float CurrentPointsToBreak = 0;

        [Header("bring Object to Person")]
        [Tooltip ("Questobjects [0] = zielperson, alle weiteren sind die zu bringenden Objekte")]
        public ItemManager Reciever;
        public List <Item> bringsel = new List<Item> ();
        public int bringselCount = 0;
        public bool delivered = false;
        

        [Header("Static Objects Finding")]
        public List < StaticObjectTopFind> ObjectsToFind = new List<StaticObjectTopFind> ();
        public bool allfound = false;
        public int totalFound = 0;

        [Header("ObjectDestruction")]
        public bool SpecificObjectToDestroy = false;
        public zzz SpecificObject;
        public string SpecificObjectName;
        public bool specificObjectDestroyed = false;

        [Header("Drops collected")]
        public int DropsCollected = 0;
        public List <BonusDrops > BonusDrops = new List<BonusDrops> ();
        public int TotalBonusDrops = 0;
        public bool allDropsFound = false;

        [Header("angenommene Quests")]
        public int CharacterQuests = 0;
        public int PointQuests = 0;
        public int ObjectFindQuests = 0;
        public int ObjectDestructQuests = 0;
        public int PersonFindQuests = 0;

        [Header("All Quests in Level")]
        public int AllQuestsInThisLevel = 0;
        public List <Quest> Questlist = new List<Quest> ();

    }
    public Challenges challenges;
    [SerializeField ]

    [System .Serializable ]
    public class Collections
    {
        public int Artefacts = 0;
        public int Tools =0;
        public int Boni =0;
        public int Hints = 0;
    }
    public Collections collections;
    [SerializeField ]

    [System .Serializable ]
    public class Settings
    {
        public AudioClip QuestSuccessSND;
        public AudioClip MissionSuccessSND;
        public AudioClip MissionFailSND;
    }
    public Settings settings;
    [SerializeField ]

    private GameController gc;
    private bool missionfailed = false;
    private CharacterStats Player;
    public int checkint = 0;
    private  InfotextScript  Anzeige; 
    private InfotextScript Anzeige2_unten;
    private InfotextScript Anzeige3;
    public bool missionAccomplished = false;
    public int storageObjects;
    private Quest[] qL;
    private BonusDrops[] bD;
    public int total;
    private int startaufstellung;

    void Start () 
    {
        gc = GameObject.FindObjectOfType <GameController > ();
        Player = GameObject.FindGameObjectWithTag ("Player").GetComponent <CharacterStats> ();
        Anzeige = GameObject.FindGameObjectWithTag ("InfoText").GetComponent <InfotextScript > ();
        Anzeige2_unten  = GameObject.FindGameObjectWithTag ("DialogText").GetComponent <InfotextScript > ();
        Anzeige3 = GameObject.FindGameObjectWithTag ("QuestText").GetComponent <InfotextScript > ();
        qL = GameObject.FindObjectsOfType <Quest> ();
        foreach (Quest q in qL) 
        {
            challenges.Questlist.Add (q);
        }

        dropSetup ();
        challenges.TotalBonusDrops = challenges.BonusDrops.Count;

        getPositions ();
        getTransporters ();
        getWaypoints ();
        checkint = 0;
        challenges.AllQuestsInThisLevel = challenges.Questlist.Count + challenges .CharacterQuests +challenges .PointQuests + challenges .ObjectFindQuests +challenges .ObjectDestructQuests + challenges .PersonFindQuests  ;
        startChallenges ();
        storageObjects = challenges.ObjectsToFind.Count;
        total = checkint;
        startaufstellung = checkint;
        if (personen.MustSurviveThisMission.Count > 0) 
        { // das ist für den Fall, das wenn bei Start bereits eine Person überleben soll, der quest in dem Moment ja schon gewonnen wurde.
            Player.egS.accomplished_Quests += 1;
        } 
        if (checkint == 0) //Für den Fall, das keine Aufgabe zu Levelbeginn besteht. nach dem ersten gelösten Quest wäre die Mission gewonnen, unabhängig wieviele Quests im Level sind.
        { 
            // um das zu verhindern gibts hier die Pro-forma Aufgabenstellung für jedes Level: Spieler muß Zielgebiet erreichen. 
            personen .MustReachTargetZone .Add (Player .gameObject );
            startChallenges ();
            total = checkint;
            startaufstellung = checkint;
        }
    
    
    }

    void Update () 
    {
        SurvivalTest ();
        TestTargetZoneReached ();
        KillAllTest ();
        KillSpecificTest ();
        DestroySpecificObject ();
        Pointchecks ();
        checkObjects ();
        PersonFindTest ();
        BringselTest ();
        DropsManagement ();
        missionCheck ();

    }
    // werden die Bonusdrops eigentlich im Missionserfolg berücksichtigt?
    public void dropSetup()
    {
        bD  = GameObject.FindObjectsOfType <BonusDrops > ();
        foreach (BonusDrops  b in bD ) 
        {
            challenges.BonusDrops .Add (b);
        }
    }

    void getTransporters()
    {

        aufbau.Teleporter = GameObject.FindObjectsOfType <Teleporter > ();
        aufbau.TeleporterZiele = GameObject.FindObjectsOfType <TeleZIEL > ();
    }

    void getWaypoints()
    {
        aufbau.Wegpunkte = GameObject.FindObjectsOfType <KI_Wegpunkt > ();

    }

    void getPositions()
    {
        aufbau.StartPosition = GameObject.FindObjectOfType <STARTPOS > ();
        aufbau.targetZone = GameObject.FindObjectOfType <TargetZone > ();

    }

    void BringselTest()
    {
        if (challenges.Reciever == null)
            return;
        
        if (challenges.bringsel.Count == 0 && challenges .Reciever != null) 
        {
            challenges.delivered = true;
        }

        if (challenges.delivered )
        {
            Erfolgsmeldung ("alle Bringesl abgegeben", 0, settings .QuestSuccessSND );
            Debug.Log("alle Bringesl abgegeben");
            challenges.CharacterQuests -= 1;
        }



    }


    void SurvivalTest()
    {
        if (personen.MustSurviveThisMission.Count  == 0 || personen .survived)
            return;


        foreach (CharacterStats c in personen .MustSurviveThisMission) 
        {
            if (c.egS.health <= 0) 
            {
                personen.survived = false;
                missionFail ();
                break;
            }
        }


    }

    void TestTargetZoneReached()
    {
        if (personen.MustReachTargetZone.Count == 0 || personen .reached)
            return;
        
//      foreach (GameObject g in personen .MustReachTargetZone) 
//      {
//          CharacterStats cS = g.GetComponent <CharacterStats > ();
//          if (!personen.MustSurviveThisMission.Contains (cS)) 
//          {
//              personen.MustSurviveThisMission.Add (cS); // damit dieZonen Personen auf jeden Fall am Leben bleiben, bis sie in der Zone sind
//          }
//      }

        Checkmatch ();

        if (Checkmatch () && !personen.reached) 
        {
            Erfolgsmeldung ("Alle Personen im Zielgebiet", 0, settings .QuestSuccessSND );
            Debug.Log("Person angekommen");
            challenges.CharacterQuests -= 1;
            personen .reached = true;
        }
    }

    public  bool Checkmatch()
    {
        if (aufbau.targetZone .PersonsInTargetZone .Count != personen .MustReachTargetZone .Count )
            return false;

        for (int i = 0; i < personen .MustReachTargetZone .Count ; i++) 
        {
            foreach (GameObject P in aufbau.targetZone .PersonsInTargetZone) 
            {
                if (P == personen .MustReachTargetZone [i])
                    return true;
            }
        }
        return false;
    }

    void KillAllTest()
    {
        if (personen.Allkilled || !personen .KillAllEnemies)
            return ;

        if (personen.KillAllEnemies) 
        {
            if (gc.teamSP.Feinde.Count == 0) 
            {
            //  Erfolgsmeldung + 1;
                Erfolgsmeldung ("Alle Gegner " +  " sind tot!", 0 , settings .QuestSuccessSND );
                challenges.CharacterQuests -= 1;
                personen.Allkilled = true;
            }

        }

    }

    void KillSpecificTest()
    {
        if (personen.Villain != null) 
        {
            personen.KillSpecificVillain = true;
        }

        if (!personen.KillSpecificVillain || personen .VillainKilled )
            return;

        if (personen.Villain.egS.health <= 0) 
        {
            // Erfolgsmeldung +1;
            Erfolgsmeldung (personen.Villain.egS.Name  + " ist tot!", 0 , settings .QuestSuccessSND );
            challenges.CharacterQuests -= 1;
            personen .VillainKilled = true;
        }
    }

    void DestroySpecificObject()
    {
        if (challenges .SpecificObject != null) 
        {
            challenges .SpecificObjectToDestroy  = true;
        }

        if (!challenges.SpecificObjectToDestroy || challenges.specificObjectDestroyed) 
        {
            challenges.SpecificObjectToDestroy = false;
            return;
        }

        if (challenges .SpecificObject.ges <= 0) 
        {
            challenges.SpecificObject = null;
            challenges.ObjectDestructQuests -= 1;
            challenges  .specificObjectDestroyed  = true;
            Erfolgsmeldung (challenges.SpecificObjectName  +  "zerstört!", 0 , settings .QuestSuccessSND );
            challenges.SpecificObjectName = null;
    
        }
    }




    void checkObjects()
    {
        if (!challenges .allfound && challenges.ObjectsToFind.Count == 0 && challenges .ObjectFindQuests > 0) 
            {
                Erfolgsmeldung ("Alle Objekte gefunden!", 0, settings.QuestSuccessSND);
                storageObjects = 0;
                challenges.ObjectFindQuests -= 1;
                challenges.allfound = true;
            }
    
    }


    void PersonFindTest()
    {
        if (personen.thereArePeopleToFind) 
        {
            if (personen.PersonsToFind.Count == 0 && !personen.AllPeopleFound) 
            {
                Erfolgsmeldung (personen.specificPersonName + " gefunden!", 0, settings.QuestSuccessSND);
                challenges.PersonFindQuests -= 1;
                personen.AllPeopleFound = true;
                personen.thereArePeopleToFind = false;
                personen.specificPersonName = "";
            }

        }

    }

public  void startChallenges()
    {
        if (personen.PersonsToFind.Count > 0) 
        {
            challenges.PersonFindQuests += 1;   
        }

        if (challenges.Reciever != null)
            challenges.CharacterQuests += 1;

        
        if (personen.MustReachTargetZone.Count > 0) 
            challenges.CharacterQuests += 1;
        
//      if (personen.MustSurviveThisMission.Count > 0) // bleibt, für den Fall, das im Verlauf eines Levels eine Figur unter Schutz gestellt werden muß.
//          challenges.CharacterQuests += 1;
        
        if (personen.KillAllEnemies) 
            challenges.CharacterQuests += 1;
        
        if (personen.KillSpecificVillain || personen.Villain != null) 
        challenges.CharacterQuests += 1;


        if (challenges .SpecificObjectToDestroy  || challenges .SpecificObject  != null) 
        challenges.ObjectDestructQuests  += 1;
        

        if (challenges .Culture )
            challenges.PointQuests  += 1;
        
        if (challenges .Detection )
            challenges.PointQuests  += 1;

        if (challenges .Loyality )
            challenges.PointQuests  += 1;

        if (challenges .Shooting )
            challenges.PointQuests  += 1;

        if (challenges .CurrentPoints)
            challenges.PointQuests  += 1;

        if (challenges.ObjectsToFind.Count > 0)
            challenges.ObjectFindQuests +=1 ;

    //challenges .AllQuestsInThisLevel = challenges.Questlist.Count ;
        challenges.AllQuestsInThisLevel = challenges .CharacterQuests +challenges .PointQuests + challenges .ObjectFindQuests +challenges .ObjectDestructQuests + challenges .PersonFindQuests  ;
        checkint = challenges .AllQuestsInThisLevel ;
}

    void Pointchecks()
    {
        
        if (challenges.Culture) 
        {
            if (Player.egS.culture >= challenges.CulturePointsToBreak) 
            {
                Erfolgsmeldung ("Kulturziel erreicht" + "\n" + "neuer Wert: "+ Player.egS .culture.ToString () , 0,settings .QuestSuccessSND );
                challenges.PointQuests -= 1;
                challenges.Culture = false;
            }
        }
        if (challenges.Detection ) 
        {
            if (Player.egS.detecting >= challenges.DetectSkillToBreak ) 
            {
                Erfolgsmeldung ("SpähSkills verbessert" + "\n" + "neuer Wert: "+ Player.egS .detecting .ToString (),  0,settings .QuestSuccessSND );
                challenges.PointQuests -= 1;
                challenges.Detection = false;
            }
        }
        if (challenges.Loyality ) 
        {
            if (Player.egS.loyality  >= challenges.LoyalitySkillToBreak ) 
            {
                Erfolgsmeldung ("Loyalität verbessert" + "\n" + "neuer Wert: "+ Player.egS .loyality.ToString () ,  0,settings .QuestSuccessSND );
                challenges.PointQuests -= 1;
                challenges.Loyality  = false;
            }
        }
        if (challenges.Shooting ) 
        {
            if (Player.egS.shooting  >= challenges.ShootSkillToBreak) 
            {
                Erfolgsmeldung ("SchießSkills verbessert" + "\n" + "neuer Wert: "+ Player.egS .shooting .ToString () ,  0,settings .QuestSuccessSND );
                challenges.PointQuests -= 1;
                challenges.Shooting = false;
            }
        }
        if (challenges.CurrentPoints ) 
        {
            if (Player.egS.currentPoints >= challenges.CurrentPointsToBreak) 
            {
                Erfolgsmeldung ("Punkestand verbessert" + "\n" + "neuer Wert: "+ ((float)Player.egS .currentPoints ).ToString () , 0, settings .QuestSuccessSND );
                challenges.PointQuests -= 1;
                challenges.CurrentPoints = false;
            }
        }

    }

    void DropsManagement ()
    {
        if (challenges.TotalBonusDrops == 0)
            return;

        if (challenges.DropsCollected == challenges.TotalBonusDrops && !challenges.allDropsFound  )
        {
        //Erfolgsmeldung ("Alle BonusDrops gefunden!", 0, settings .QuestSuccessSND );
            Anzeige .DisplayInfo ("Alle BonusDrops gefunden!");
            AudioSource.PlayClipAtPoint (settings.QuestSuccessSND, Player.transform.position, 1);
            challenges.allDropsFound = true;

        }

    }


    void Erfolgsmeldung(string was, float wert, AudioClip snd)
    {
        if (challenges.AllQuestsInThisLevel > 0 && checkint > 0)
            checkint -= 1;

        AudioSource.PlayClipAtPoint (snd, Player.transform.position, 1);
        Anzeige3.DisplayInfo (was);
    }

    public void missionFail()
    {
        if (!missionfailed) 
        {
            Anzeige .DisplayInfo ("Mission failed");
            AudioSource.PlayClipAtPoint (settings.MissionFailSND , Player.transform.position, 1);
            missionfailed = true;
        }
    }

    void missionCheck()
    {


        if (checkint == 0 && !missionAccomplished && challenges .AllQuestsInThisLevel > 0) 
        {
            missionVictory ();
            missionAccomplished = true;
        }

    }

    void missionVictory()
    {
        if (!missionAccomplished) 
        {
            Erfolgsmeldung ("Mission erfolgreich!", 0, settings.MissionSuccessSND);
            Anzeige2_unten . DisplayInfo (Player.egS .accomplished_Quests + startaufstellung  + " / " + total + " Quests erfüllt!");
            Invoke ("EndGame", 5.0f);
        }
    }

    void EndGame()
    {
        Application.Quit  ();
    }
}


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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine .UI;

public class Quest : MonoBehaviour 
{
    private GameController gc;
    private LevelController lc;
    private Radar radar ;
    public string Titel;

    public enum Type
    {
        PointsTobreak, ObjectsToFind, PersonToKill, PersonToProtect, KillAllEnemies, PersonToZone, DestroySpecificObject, PersonToFind, DeliverToPerson
    }
    public Type type;

    public enum Points
    {
        JustPoints, Shooting, Loyality, Detecting, Culture
    }
    public Points points;

    public bool AufgabeAngenommen = false;
    public GameObject [] questObjects;
    public int pointstobreak;
    public string []Message;
    private string  Auftraggeber;
    private KI_dialog parent;
    private CharacterStats  player;
    private TargetZone tZ;

    [System .Serializable ]
    public class VorundNachher
    {
    
        [Header ("Bedingungen und Auswirkungen")]
    public bool imDone = false;
    public bool hatAuswirkungen = false;
    public bool hatVorbedingungen = false;
    public List <GameObject > AuswirkungsObjekte = new List<GameObject> ();
    public List <GameObject> VorbedingungsObjekte = new List <GameObject>();

        public enum StateVor
        {
            SetActive, SetInactive, Destroy, Instantitate, SetToFollow
        }
        public StateVor stateVor;
        public enum StateNach
        {
            SetActive, SetInactive, Destroy, Instantitate, SetToFollow
        }
        public StateNach stateNach;
    }
    [SerializeField ]
    public VorundNachher vorundnach;


    private InfotextScript  dtx;

    void Awake()
    {
        if (Titel != null)
            this.gameObject.name = Titel;

        gc = GameObject.FindObjectOfType <GameController> ();
        lc = GameObject.FindObjectOfType <LevelController > ();
        radar = GameObject.FindObjectOfType <Radar> ();
        parent = GetComponentInParent <KI_dialog > ();
        if (parent == null) {
            Auftraggeber = "Gott";
        } 
        else 
        {
            Auftraggeber = parent.GetComponentInParent <CharacterStats > ().egS.Name;
        }

        player = GameObject.FindGameObjectWithTag ("Player").GetComponent<CharacterStats > ();
        tZ = GameObject.FindObjectOfType <TargetZone > ();
        dtx = GameObject.FindGameObjectWithTag ("DialogText").GetComponent <InfotextScript >();
    }


    void Update()
    {
        if (!AufgabeAngenommen) { // was passiert, wenn vor der Annahme des Quests eines der Questobjekte weg ist
            
            foreach (GameObject g in questObjects) 
            {
                if (g == null) 
                {
                    destroyME ();
                }
            }
        }
        else  // nach annahme des Quests
        {
            switch (type) 
            {
            case Type.ObjectsToFind:
            vorundnach.imDone = CheckFoundObjects ();
                break;
            case Type.PersonToFind :
                vorundnach .imDone = CheckFoundPersons ();
                break;
            case Type.PointsTobreak:
                PointCheck ();
                break;
            case Type.PersonToKill:
                vorundnach .imDone = checkVillain ();
                break;
            case Type.KillAllEnemies:
                vorundnach .imDone = CheckDeadEnemies ();
                break;
            case Type.PersonToZone:
                vorundnach .imDone = personZoneCheck ();
                break;
            case Type.DestroySpecificObject :
                vorundnach .imDone =  checkObjectToDestroy();
                break;
            case Type.DeliverToPerson :
                vorundnach .imDone =  DeliveryCheck();
                break;
            }

        }


        if (vorundnach .imDone) 
        {
            player.egS.accomplished_Quests += 1;


            if (vorundnach .hatAuswirkungen)
                Auswirkung();
            
            vorundnach .imDone = false;
            destroyME ();
        }

    }

    void destroyME()
    {
        if (parent == null)
            return;
        
        lc.challenges.Questlist.Remove (this);
        parent.basics.quest.Remove (this);
        parent.basics.Questnummer -= 1;
        Destroy (this.gameObject);
    }


public  void LogToLevel()
    {
        AufgabeAngenommen = true;
        lc.total += 1;

        if (vorundnach .hatVorbedingungen)
            Vorbereitung  ();

        switch (type) 
        {
        case Type.ObjectsToFind:
            Objects ();
            break;
        case Type.PersonToFind:
            Personen ();
            break;
        case Type.PointsTobreak:
            reachPoints ();
            break;
        case Type.PersonToKill:
            KillVillain ();
            break;
        case Type.KillAllEnemies:
            KillAllEnemies ();
            break;
        case Type.PersonToProtect:
            protectPerson ();
            break;
        case Type.PersonToZone:
            persontozone ();
            break;
        case Type.DestroySpecificObject:
            destroieObject ();
            break;
        case Type.DeliverToPerson:
            Delivery ();
            break;
        }

    }

    void Delivery()
    {
        lc.challenges.Reciever  = questObjects [0].GetComponent <ItemManager >();

        foreach(GameObject g in questObjects )
        {
            Debug.Log (g);
            if (g.GetComponent <Item> ()) 
            {
                g.GetComponent <Item> ().besitzergefunden = false;
                g.GetComponent <Item> ().itemSetup.Besitzer = questObjects [0];
                lc.challenges.bringsel.Add (g.GetComponent <Item> ());
                Radar.RemoveRadarObjekt (g);
                Radar.RegisterRadarObjekte (g, radar.Radarmarker [5]);
            }
        }

    
        setnewChallenge ();
    }


    bool DeliveryCheck()
    {
        foreach (Item i in lc.challenges .bringsel) 
        {
            Debug.Log ("Testlauf1");
            if (i.besitzergefunden) 
            {

                lc.challenges.bringsel.Remove (i);

            }

        }

        if (lc.challenges.bringsel.Count == 0) 
        {
            Debug.Log ("Testlauf2");
            lc.challenges.delivered = true;
            return true;
        }
        return false;
    }



    // finden von Personen //
    void Personen()
    {
        lc.personen.thereArePeopleToFind = true;
        foreach (GameObject g in questObjects) 
        {

            g.GetComponent <CharacterStats > ().egS .wurde_gefunden = false;
            lc.personen.specificPersonName = g.GetComponent <CharacterStats > ().egS.Name;
            lc.personen .PersonsToFind.Add (g);
            Radar.RemoveRadarObjekt (g);
            Radar.RegisterRadarObjekte (g, radar.Radarmarker [5]);

        }
        setnewChallenge ();

    }

    public  bool CheckFoundPersons()
    {
        for (int i = 0; i < questObjects.Length  ; i++) 
        {
            if (!questObjects [i].GetComponent <CharacterStats  > ().egS .wurde_gefunden) 
            {   
                return false;
            }

        }

        return true;
    }

    // Objekte //
    void Objects()
    {
        
        foreach (GameObject g in questObjects) 
        {
            StaticObjectTopFind stof = g.GetComponent <StaticObjectTopFind > ();
            stof.einstellungen.wurdeBereitsGefunden = false;
            lc.challenges.ObjectsToFind.Add (stof);
            Radar.RegisterRadarObjekte (g, radar.Radarmarker [5]);

        }
        setnewChallenge ();

    }

    public  bool CheckFoundObjects()
    {
        for (int i = 0; i < questObjects.Length  ; i++) 
        {
            if (questObjects [i] == null) 
            {
                Debug.Log ("Questfail");
                lc.challenges.ObjectFindQuests -= 1;
                vorundnach .hatAuswirkungen = false;
                destroyME ();
                break;
            }

            if (!questObjects [i].GetComponent <StaticObjectTopFind > ().einstellungen.wurdeBereitsGefunden) 
            {   
                return false;
            }

        }

    return true;
    }

    // All Enemies //
    void KillAllEnemies()
    {
        lc.personen.KillAllEnemies = true;

        setnewChallenge ();
    }

    public bool CheckDeadEnemies()
    {
        if (gc.teamSP.Feinde.Count == 0) 
        {
            return true;
        }
        return false;
    }

    // Objekt zerstören //
    void destroieObject ()
    {

        if (questObjects [0] == null)  //falls schon tot zerstört 
        {
            return;
        }

        lc.challenges .SpecificObjectToDestroy = true;
        lc.challenges .SpecificObject = questObjects [0].GetComponent <zzz >();
        lc.challenges.SpecificObjectName = questObjects [0].GetComponent <zzz > ().Bezeichnung;
        lc.challenges.specificObjectDestroyed = false; // was, wenn der oberbösewicht schon tot ist?
        Radar.RegisterRadarObjekte (lc.challenges .SpecificObject .gameObject , radar.Radarmarker [7]);
        setnewChallenge ();

    }

    bool checkObjectToDestroy()
    {
        if (questObjects [0] == null || questObjects [0].GetComponent <zzz >().ges  <= 0)  
        {
            return true;
        }
        return false;
    }

    // Bösewicht //
    void KillVillain ()
    {

        if (questObjects [0] == null)  //falls der schon tot ist 
        {
            return;
        }

        lc.personen.KillSpecificVillain = true;
        lc.personen.Villain = questObjects [0].GetComponent <CharacterStats >();
        lc.personen.VillainKilled = false; // was, wenn der oberbösewicht schon tot ist?

        setnewChallenge ();

    }

    bool checkVillain()
    {
        if (questObjects [0] != null && questObjects [0].GetComponent <CharacterStats >().egS .health <= 0)  
        {
            return true;
        }
        return false;
    }

    // braucht nicht auf done gesetzt zu werden , da eh bestanden, solange die leben. falls nicht, ists eh aus
    void protectPerson()
    {
        foreach (GameObject g in questObjects) 
        {
            CharacterStats cS = g.GetComponent <CharacterStats > ();
            if (cS.egS.health <= 0) //wenn einer der zu beschützenden schon tot sein sollte
            {
                lc.missionFail ();
                break;
            }

            lc.personen.MustSurviveThisMission.Add (cS);
        }

        setnewChallenge ();
    }   


    // Punkte erreicht //
    void reachPoints()
    {

        switch (points) 
        {

        case Points.Culture:
            lc.challenges.Culture = true;
            lc.challenges.CulturePointsToBreak += pointstobreak;
            setnewChallenge ();
            break;
        case Points.Detecting:
            lc.challenges.Detection = true;
            lc.challenges.DetectSkillToBreak += pointstobreak;
            setnewChallenge ();
            break;
        case Points.Shooting:
            lc.challenges.Shooting = true;
            lc.challenges.ShootSkillToBreak += pointstobreak;
            setnewChallenge ();
            break;
        case Points.Loyality:
            lc.challenges.Loyality = true;
            lc.challenges.LoyalitySkillToBreak += pointstobreak;
            setnewChallenge ();
            break;
        case Points.JustPoints:
            lc.challenges.CurrentPoints = true;
            lc.challenges.CurrentPointsToBreak += pointstobreak;
            setnewChallenge ();
            break;

        }
    }

    void PointCheck()
    {
        switch (points) 
        {

        case Points.Culture:

            if (player.egS.culture >= pointstobreak)
                vorundnach .imDone = true;
                break;
        case Points.Detecting:

            if (player.egS.detecting >= pointstobreak)
                vorundnach .imDone = true;
                    break;
        case Points.Shooting:

            if (player.egS.shooting >= pointstobreak)
                vorundnach .imDone = true;
                    break;
        case Points.Loyality:
            
            if (player.egS.loyality >= pointstobreak)
                vorundnach .imDone = true;
            break;
        case Points.JustPoints:

            if (player.egS.currentPoints >= pointstobreak)
                vorundnach .imDone = true;

            break;

        }
    }

    // persons in Zone
    void persontozone()
    {

        TargetZone t = GameObject.FindObjectOfType <TargetZone > ();


        foreach (GameObject g in questObjects) 
        {
            CharacterStats cS = g.GetComponent <CharacterStats > ();
            if (cS.egS.health < 0 ) 
            {
                lc.missionFail ();
                break;
            }

            if (!lc.personen.MustReachTargetZone.Contains (g))
            lc.personen.MustReachTargetZone.Add (g);
//
//
//          if (!lc.personen .MustSurviveThisMission .Contains (cS))
//              lc.personen.MustSurviveThisMission.Add (cS); // damit dieZonen Personen auf jeden Fall am Leben bleiben, bis sie in der Zone sind
            
        }
        lc.personen.reached = false;
        setnewChallenge ();
    }

    bool  personZoneCheck()
    {
        for (int i = 0; i < questObjects .Length ; i++) 
            {
            foreach (GameObject P in tZ .PersonsInTargetZone) 
                {
                    if (P ==questObjects[i])
                        return true;
                }
            }
            return false;
    }


    void setnewChallenge()
    {
        lc.personen.Auftraggeber.Add (Auftraggeber);
        lc.storageObjects = lc.challenges.ObjectsToFind.Count;
        lc.checkint = 0;
        lc.challenges.PersonFindQuests = 0;
        lc.challenges.CharacterQuests = 0;
        lc.challenges.PointQuests = 0;
        lc.challenges.ObjectDestructQuests = 0;
        lc.startChallenges ();
    }


    void Auswirkung ()
    {
        dtx.DisplayInfo (Auftraggeber + ": "+ Message  [3]);
        foreach (GameObject g in vorundnach .AuswirkungsObjekte  )
        {
            switch (vorundnach .stateNach ) 
        {
            case VorundNachher   .StateNach .SetActive:
                g.SetActive(true);
                break;
            case VorundNachher .StateNach.SetInactive:
                g.SetActive(false);
                break;
            case VorundNachher .StateNach.Instantitate:
                ins (g);
                break;
            case VorundNachher .StateNach.Destroy:
                Destroy (g);
                break;
            case VorundNachher .StateNach.SetToFollow:
                GameObject p = GameObject.FindGameObjectWithTag ("Player");
                p.GetComponent <Squad_Manager > ().TeamMitglieder.Add (g);
                g.GetComponent <AI> ().teamS.Kapitän =p.transform;
                g.GetComponent <AI> ().teamS.follow_in_team = true;
                g.GetComponent <AI> ().SetState (AIState.Follow);
                g.GetComponent<AI>().navmesh.SetDestination(p.transform.position);
                if (Vector3.Distance(p.transform.position , g.transform.position ) < g.GetComponent<AI>().navmesh.stoppingDistance)
                {
                    g.transform.root.GetComponent<AI>().forward = g.transform.root.GetComponent<AI>().LerpSpeed(g.transform.root.GetComponent<AI>().forward, 0, 15);
                }           
                Radar.RemoveRadarObjekt (g);
                Radar .RegisterRadarObjekte (g, radar .Radarmarker [2]);
                break;

        }
        }

    }


    void ins(GameObject g)
    {
    //  g = Instantiate (g, null, Quaternion.identity);
    }

    void Vorbereitung()
    {
        dtx.DisplayInfo ( ": "+ Message  [3]);
        foreach (GameObject g in vorundnach .VorbedingungsObjekte  )
        {
            switch (vorundnach .stateVor ) 
            {
            case VorundNachher   .StateVor .SetActive:
                g.SetActive(true);
                if (g.GetComponent <CharacterStats > ()) 
                {
                    Radar.RemoveRadarObjekt (g);
                }



                break;
            case VorundNachher .StateVor.SetInactive:
                g.SetActive(false);
                break;
            case VorundNachher .StateVor.Instantitate:
                ins (g);
                break;
            case VorundNachher .StateVor.Destroy:
                Destroy (g);
                break;
            case VorundNachher .StateVor.SetToFollow:
                GameObject p = GameObject.FindGameObjectWithTag ("Player");
                p.GetComponent <Squad_Manager > ().TeamMitglieder.Add (g);
                g.GetComponent <AI> ().teamS.Kapitän =p.transform;
                g.GetComponent <AI> ().teamS.follow_in_team = true;
                g.GetComponent <AI> ().SetState (AIState.Follow);
                g.GetComponent<AI>().navmesh.SetDestination(p.transform.position);
                if (Vector3.Distance(p.transform.position , g.transform.position ) < g.GetComponent<AI>().navmesh.stoppingDistance)
                {
                    g.transform.root.GetComponent<AI>().forward = g.transform.root.GetComponent<AI>().LerpSpeed(g.transform.root.GetComponent<AI>().forward, 0, 15);
                }           
                Radar.RemoveRadarObjekt (g);
                Radar .RegisterRadarObjekte (g, radar .Radarmarker [2]);
                break;

            }
        }
    }
}
»Martin Mundorf« hat folgendes Bild angehängt:
  • lc.png
"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

56

04.02.2018, 15:12

die erste kleine Test-Kamapgne :)

Hallo zusammen,

hier die erste kleine Test-Kampagne. Viel Spaß beim testen! ^^

eine Anleitung liegt bei, die erläutert auch Details bei bugs etc.


Hier zum Download
»Martin Mundorf« hat folgendes Bild angehängt:
  • scrsh1_sp.png
"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"

mercuryus

Treue Seele

Beiträge: 189

Wohnort: Bayern

Beruf: IT

  • Private Nachricht senden

57

04.02.2018, 17:13

Bewegung mit WASD /Mouse

aus der Anleitung:
Bewegung mit WASD /Mouse

kannst du auch die Cursor-Tasten unterstützen?
Dann könnte ich (als Linkshänder) auch spielen. :this:

Martin Mundorf

Treue Seele

  • »Martin Mundorf« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Waldorf, Kr. Ahrweiler

Beruf: Althistoriker

  • Private Nachricht senden

58

04.02.2018, 17:25

auch mit Cursortasten läßt sich das spielen.
Siehe dazu in dem Unity-Start-Kasten den Reiter "Input" :)

Nachtrag: die Kamera-Vertikal-Steuerung läßt sich mit "Y" umkehren.
"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"

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

59

04.02.2018, 17:29

Apropos Reiter "Input": Den könntest du mal aufräumen bzw. deutlicher machen, was eigentlich was ist.

Martin Mundorf

Treue Seele

  • »Martin Mundorf« ist der Autor dieses Themas

Beiträge: 262

Wohnort: Waldorf, Kr. Ahrweiler

Beruf: Althistoriker

  • Private Nachricht senden

60

05.02.2018, 18:06

Kleiner Zwischenruf: Ich tüftele wieder mal an meinem KI-Skript rum :crazy:

vielleicht mach ich nebenbei auch noch die Tastaturbelegung "übersichtlicher", auch wenn ich da grad keinen nerv für hab, mich damit zu befassen ;(



OK... hiermit also offiziell:

ICH SUCHE EINEN SKRIPT-REVISOR.

Nachdem mich schon zweimal Leute haben hängen lassen, versuche ich es nun offiziell mit einem "Stellenangebot".
Da das ganze ein Hobbyprojekt ist, kann ich leider keine Bezahlung offerieren, außer Lob und Ruhm im Erfolgsfall. ;)

Kenntnisse, die hilfreich wären: C# und Unity. (ggf. dort auch mit Animator-IK).

Da ich dieses Projekt so ziemlich alleine in Angriff genommen habe, und es zwar langsam "wird" - wird es eben auch langsam zu viel für einen allein.
ich suche jemanden, der nicht nur sagt, er "guckt mal drüber", sondern jemanden, der unter Umständen auch ein Skript mal durchliest und verbessert/neuschreibt.
ich bin durchaus ein friedlicher Mensch, geduldiger Zuhörer und stehe auch gerne per Skype zur Verfügung - sowohl zum erklären, was ich eigentlich will und zum zuhören/lernen.

Momentan ist es einfach das Skript für die Bewegungen/Aktionen der KI. Wenn ich ein Teil funktionierend gemacht habe, haperts am andern Ende. Und umgekehrt.
ich möchte ein Projekt ungern drangeben - denn es steckt grad in einem "Flaschenhals" - das sind die KI und der Questmanager.

nach diesen rein "mechanischen" Hürden könnte es eeeendlich mit Kreativ-Arbeit weitergehen. ich fänds schade, aber ich komme alleine so einfach nicht mehr weiter. :S
"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"

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Martin Mundorf« (05.02.2018, 19:39)


Werbeanzeige