Beiträge von JonnyMachony

    hm, ok,


    Ich hab ein Array voller erfasster Gegnern, die aber aus dem Array nicht mehr verschwinden?


    Alles was ich will, ist ein Boolean "bCanSeePlayer" zu haben, das erfasst, wann ein Gegner sichtbar wird und wann es wieder außer Sichtweite ist.

    Im zweiten Schritt hätte ich gerne, dass er immer den am nächsten gelegenen nimmt.


    Kannst du mir bitte, oder jemand, ein ganz einfaches Beispiel aufschreiben?

    Auf Grundlage dieser Funktion:


    void AEnemyController::PerceptionUpdated(const TArray<AActor*>& UpdatedActors)

    {


    }

    ich verstehe dieses Wahrnehmungssystem einfach nicht, ich mache folgendes:


    void AEnemyController::PerceptionUpdated(const TArray<AActor*>& UpdatedActors)

    {

    int32 Anzahl = UpdatedActors.Num();


    UE_LOG(LogTemp, Warning, TEXT("Ich sehe soviele %d"), Anzahl);

    }


    und er spuckt mir ständig nur 1 aus.

    Das Array müsste doch größer oder kleiner werden, je nachdem ob einer in Sichtweite kommt oder die Sichtweite verlässt.

    Kann mir das einer erklären???

    wie bekomme ich zum Beispiel jeden einzelnen im Sichtfeld befindlichen Actor in das Blackboard als Key.

    und wie löscht sich wieder jeder einzelne Actor aus dem Blackboard, wenn er das Sichtfeld wieder verlässt?

    Hi Jungens, ich bin an einem Punkt, an dem es mich frustriert.


    Ich suche jemanden, der mir über Discord oder so paar Sachen zeigen und erklären kann. Das ewige Suchen im Netz nervt.

    Thema ist AIPerception in C++


    Gerne auch gegen Geld.

    ah vielen dank, jetzt geschnallt.

    Zu meiner zweiten Frage, das raffe ich einfach nicht, wie merken eure AI's, dass kein Gegner mehr in Sicht ist?

    Ich checke nämlich mein Array, ob Gegner in Sicht sind, sobald etwas in Sicht ist, löst die Funktion aus, alles prima. Aber wie oder was löst aus, wenn dieses etwas das Sichtfeld wieder verlässt, was löst dann aus?

    Ich finde einfach auch im Netz keine vernünftige Antwort.

    Hallo, wie geht ihr da vor?

    1. Frage:

    ich habe diese Funktion:


    void PerceptionUpdated(const TArray<AActor*>& UpdatedActors);


    //In "UpdatedActors" werden alle Actoren gesammelt, die von der AI erblickt werden. Ist vielleicht eine Grundlegende Frage, aber ich frage mich gerade, da ich diese Funktion im AIController erstellt habe, woher weiß diese Funktion, dass sie in ihrem "UpdatedActors" Actoren sammeln soll? Es ist ja meine frisch erstellte Funktion.


    2. Frage:

    sobald die AI jemanden sieht in ihrer Sichtweite, kann ich zum Beispiel die Location des Gesichteten in ihr Blackboard speichern. Wie gehe ich nun vor, dass die AI auch merkt, wenn der Gesichtete wieder weg ist?

    Jugens, Arrays sind neu für mich, for Schleifen guck ich mir auch gerade an.

    Folgender Sachverhalt:

    Meine AI sieht ein Haufen Gegner, diese Gegner werden in das Array "UpdatedActors" gepackt.

    Wie lese ich nun dieses Array aus? Ich will von jedem einzelnen Gegner, den Standort, auch überprüfen, dass es kein Nullpointer ist usw...???



    void AEnemyController::PerceptionUpdated(const TArray<AActor*>& UpdatedActors)

    {



    }

    Hallo Leutz, ich hatte mich früher mal mit AI in Unreal beschäftigt und will es nun auch wieder tun.

    Ich weiß dass es da zwei verschiedene gab, wenn es darum geht, wie der NPC den Spieler sieht, im Sichtfeld etc.

    Das eine hieß "PawnSensingComponent" und das andere war "AIPerceptionComponent"

    Ich wollte nochmal fragen, welches der beiden findet ihr besser, welches hat welche Vor und Nachteile.

    Wie sind eure Erfahrungen?

    Das Problem ist nicht, dass der Schuss erst nach 0.3 Sekunden kommt. Aber interessant ist trotzdem dein Ansatz, eine Dauerschleife zu nutzen, bei der alle 0.3 sekunden ein bool auf true gesetzt wird.

    Eine Art Cooldown, ich kann während dessen so oft klicken wie ich will, es passiert nichts, bis die 0.3 sek wieder um sind. Klingt genau richtig, was ich brauche. Jetzt ist die Frage, wie verwirkliche ich das in C++. Ich muss mal überlegen oder ich such im Netz nach Cooldown in C++. Ich glaub du hast mir geholfen, kann diese Cooldown Funktion eh später gebrauchen, Vielen Dank :thumbup: :)

    Es ist eine Laserwaffe, die alle 0.3 Sekunden einen Schuss schießt, wenn man die Taste hält.


    Ich machs in C++


    ich übersetze es mal in Sprache



    Von Anfang an ist:

    "boolVariable2" ist gleich true




    In Funktion "LinksklickPressed"

    "boolVariable1" wird true

    Funktion "GeschossSpawnen" wird ausgeführt.


    in Funktion "GeschossSpawnen"

    Wenn "boolVariable1" ist true und "boolVariable2 ist true" dann...

    spawne das Geschoss mit Sound und Partikel etc...

    führe auch folgende Funktion: "GeschossSpawnen" aus mit einer 0.3Sek Verzögerung


    //Damit hätte ich schonmal ein automatisches Feuern mit einer 0.3Sek Feuerrate. Es geht nun weiter.


    In Funktion "LinksklickReleased"

    "boolVariable2" wird false

    führe auch folgende Funktion: "Delay" aus mit einer 0.2Sek Verzögerung


    in Funktion "Delay"

    "boolVariable2" wird true


    //Wenn ich nun die Taste loslasse, dann wird die "boolVariable2" false und er feuert nicht mehr. Nach 0.2 Sek wird die Variable automatisch wieder true.


    //So, das ist Stand der Dinge. Ich halte den FeuernKnopf, er feuert im Dauerfeuer alle 0.3 sek einen Schuss. Soweit so gut. Wenn ich jetzt allerdings oft auf und ab die Taste klicke, dann schießt er einmal und dann nicht mehr, weil ja immer wieder neu die 0.2sek Dauer, in der "boolVariable2" false ist, kein Schuss abgefeuert werden kann.

    Klar, kann ich im 0.2 Takt selber die Taste klicken, dann gehen wieder Schüsse raus.

    Ziel ist aber nun, dass selbst wenn ich schnell auf und ab klicke, die Schüsse rausgehauen werden, aber in der Feuerrate wie im automatischen Feuermodus.

    Du musst sie nach Abschluss des Events halt auch wieder freigeben.


    Also nehmen wir mal an sie heißt bCanFire oder so, also ist auf true, wenn der Spieler feuern kann und auf false, wenn er es nicht kann. Dann musst du nach Ablauf des Timers sie natürlich wieder auf true setzen.

    hab ich, hab ich. Die Sache ist, wenn der Spieler jetzt oft hintereinander schnell klickt, dann wird diese Sperrzeit genauso oft hintereinander ausgelöst. Dann kommt halt kein Schuss raus, außer der Spieler wartet diese Sperrzeit ab und drückt dann.

    Das ist aber nicht das Verhalten, das man aus Games kennt. Da kann man auch oft hintereinander schnell klicken, exakt die bestimmte Feuerrate kommt dann raus.

    Du könntest zum Beispiel noch eine boolsche Variable als Sperrvariable nutzen, damit das Event halt nicht ständig aufgerufen wird.


    Oder du baust in das Spiel halt ein, dass sie bei falschem Gebrauch blockiert und erst wieder mit ein paar Handgriffen und dem Verlust eines Schusses wieder hergestellt werden muss, so als Strafe halt. Also, dass du dann vom Spieler auch spieltechnisch das Event zurücksetzt.

    Diese boolsche Sperrvariable hab ich ja gemacht. Wie schon beschrieben, Problem dabei ist aber, dass überhaupt nicht mehr gefeuert wird, wenn man schnell dauernt klickt. Stattdessen soll ja die normale Feuerrate abfeuern. Wie kriegt man das hin?

    Hi Jungens,

    wer schonmal nen Shooter programmiert hat, sollte auch schon vor dem Problem gestanden haben.

    Ich habe nen Gewehr, das mit einer bestimmten Schussrate schießt, wenn ich die Feuerntaste gedrückt halte.

    Der Spieler soll aber nicht durch ständiges klicken der Feuerntaste, diese Schussrate überlisten können.

    Wie setze ich das um?

    Ich hab ne Lösung gefunden, aber ist nicht wirklich befriedigend. Ich hab nen Zeitfenster(Timer) eingebaut, das die SchussFunktion bei Taste Loslassen deaktiviert für eine kurze Zeit. Aber dann durch ständiges Drücken feuert der Char garnicht mehr, weil er immer wieder dieses Zeitfenster aufruft. Ich hätte aber dann gerne, dass dann die beabsichtigte Schussrate auch funtkioniert.

    Jungens, zum Thema Partikel weiß ich noch sehr wenig. Hier mein neues Problem:

    Das Geschoss spawnt richtig aus dem Lauf der Waffe, aber das Leuchtspurpartikel wird halt sofort in voller Länge erzeugt, das sieht dann etwas komisch aus, wie auf dem Foto zu sehen. Ziel ist, dass das Partikel, wenn das Geschoss aus dem Lauf kommt erst sehr klein ist und erst mit der Zeit immer größer wird. Hat einer ne Idee, wie man das einfach verwirklichen kann?

    Bralligator

    ich liebe dich man^^, endlich bewegt sich die Figur, hehe.

    Wenn dich damit bisschen auskennst, hast Lust, du machst mir nen kurzes Video, Animation erstellen, die wichtigen hotkeys, Animation von Unreal laden und bearbeiten. Ich zahl dir was für die Mühe, ich zahl gut, als Dankeschön.

    Interesse?

    Ich habe gute Animationen, muss sie aber noch anpassen.

    Erstes Hindernis ist zum Beispiel: hier sind so rote Kugel am Mannequin, mit dem man das Mannequin bewegen können muss, was muss ich genau drücken, hotkey oder so, dass ich die roten Kugeln dafür verwenden kann???