Created some spawners for my enemy actors so that I could place the enemies in their correct locations in editor but spawn them at a later time using triggers. But they only function properly when I trigger them on level load.
--The Problem I am having.--
So I have several classes that I am working with. A parent class that powers the functionality of the actor being spawned and which all child classes will be derived from. So far I have only one child class which is the actor that is being spawned. A class that consists of an open spline. Another class that consists of a spline but this one is closed loop. And finally a class that I use as the spawner.
The way it is supposed to work is that the child is supposed to spawn and follow the open spline, when it gets to the end of that spline it should become tied to the closed loop spline and stay on that for the rest of the game or until it is destroyed. It works perfectly when the child spawns on "Begin Play" but as soon as I try to spawn it at a later time with a trigger it screws up.
From what I observe it completely skips over the open spline and spawns at the closed loop spline, and even worse when I tie spawner to just the close loop spline, totally bypassing the open spline, is sets the child actor location to 0,0,0 and just stays there.
--Screenshots of my event graphs and Default menus.--
Spawner Event Graph
Spawner Defaults Menu
Parent Class Event Graph
Open Spline Defualts Menu
--How my actors work--
The way it is set up is that the spawner is just an actor with a billboard component that I can place in world with the editor. It has some variables that I exposed on spawn. The two main ones being 1.) An actor class variable so I can set it to whatever class of enemy I want to spawn in the defaults menu. And 2.) An actor reference so that I can select the spline to tie my child actor to. The spawner has everything tied to "Event Begin Play" but uses a bool to prevent it from triggering the spawn actor node so that I can choose whether or not to spawn at the beginning or later. If I spawn later I set the bool to false so it does nothing on level load and waits for a custom event that is also plugged into the "spawn actor from class" node that I can then trigger from the level blueprint.
When it spawns the child actor the spawner takes the return value and casts to the parent class passing all the variables that the spawner was given from the default menu to the parent.
The parent has all the functionality to make the child follow the spline that you would expect, using nodes such as "get location/rotation at distance along spline" and whatnot.
The open spline class itself only has the spline component and an actor reference that is exposed on spawn so that I can point to which actor is the next spline to use.
The way this works is that in the parent class it moves the child along the open spline using the event tick as well as the actor reference (of the open spline actor) given to it by the spawner, once it reaches the end (by checking if the spline distance is greater than or equal to the length of the spline) it goes through a branch that is powered by bool "HasIncoming?" which I set in the defaults of the spawner and is sent to the parent class on spawn of child actor. If false (meaning the child is currently on a closed loop spline) it sets spline distance back to zero, if true (meaning child is currently on an open spline and will need to change spline actor references once it reaches the end) it casts to the open spline class, gets the actor reference to the closed loop spline from the open spline actor and sets the actor reference in the parent class to that closed loop spline....and then sets the spline distance to zero.
At least this is what it's supposed to be doing. Somehow the variables are getting mixed around on spawn. I know they exist somewhere in the aether because when it malfunctions the child ties itself to the closed loop spline so it knows its supposed to end up there but it shouldn't be spawning there when I have "Has Incoming?" set to true and tied it to the open spline.
The way I am testing the delayed spawn is just to get a reference to the spawner in the level blueprint then trigger the custom event that calls the spawn actor from class node in the spawner event graph. And I call that with the level blueprint's event begin play node plus a few second delay between them.
asked Dec 31 '16 at 01:10 PM in Blueprint Scripting
Follow this question
Once you sign in you will be able to subscribe for any updates here