AMANDA: Hey, folks! This summer, we
asked 1,000 artists if they wanted to learn Unreal
Engine in four weeks, and boy, did they ever! Feast your eyes on some of
the incredible projects that came out of Escape's most
ambitious bootcamp to date in our "Summer of
Unreal" sizzle, now on the Unreal
Engine YouTube channel. One of the most common questions
we hear about digital twins is, "How do I get started?" While a digital twin is
usually a large-scale project, there are many steps
you can take right away. Explore our guide
on the Unreal Engine feed to learn how to
start prototyping today! With Unreal Engine 4.27,
both the Path Tracer and GPU Lightmass received
enhancements--the Path Tracer makes it viable to create
final pixel output, typically reserved for offline
renderings and GPU Lightmass reduces the time needed to
bake your lighting in complex scenes. Check out the brief overview
of these updated features to 4.27 on the YouTube
channel as well. And now over to this
week's top karma earners. Many, many thanks to: Everynone, Shadowriver,
ClockworkOcean, B O B c a t, BotsU1e, Powill, Jnat, miyagi1,
Dokoro36, and terishrimp. Onto this week's community
spotlights--J Hill is showing off his character creating
muscles with FLEX, a spunky cyborg. Created to play with
features in Unreal Engine, head over to his ArtStation page
to see how the mighty FLEX was developed and see more of
their outstanding artistry. Congrats to Mpact Games! After 14 years in
the making, Hanako: Honor & Blade officially
released into the wild! Developed as a passion
project to remember those lost to cancer, take up arms
to cleanse the scourge of Japan to restore peace and
beauty to the land. Download Hanako: Honor
& Blade on Steam now. And coming next year, take
a look at Icelandic studio Parity's Island of
Winds, an adventure set in a fantastical
17th century Iceland. Assume the role of Brynhild,
the Balance Keeper, who sets out on a
journey of discovery where she'll face creatures of
legend and challenging puzzles. Stay up to date on
their development at islandofwinds.com. Thanks for watching this week's
News and Community Spotlight! [AUDIO OUT] KYLE ERF: Hey. AMANDA SCHADE: [AUDIO OUT] KYLE ERF: My audio is
not coming through. [AUDIO OUT] AMANDA SCHADE: Oh. How about now? Sorry about that, folks. KYLE ERF: Inside Unreal. AMANDA SCHADE:
We're doing it live. OK. Yeah, all right, good. Thanks, everyone. It's always an exciting
start to our Wednesdays but-- or Thursdays. Well, let's nail it. Again welcome to Inside Unreal,
a weekly show where we learn, explore, and celebrate
everything Unreal. As I said, I'm your
host Amanda Schade and we're really, really excited
to bring the team from Moving Pieces on the show today. So we have Patrick
McAvena, President. And Kyle Erf, Director
of Technology. KYLE ERF: Hey there. AMANDA SCHADE: So, if
you all are unfamiliar, Moving Pieces team is the
creators of two really, really awesome games. So we have Dodo Peak,
which is your, what? Vibrant, I would say,
retro platformer? And then you're
currently working on Shoulders of Giants,
the action roguelike, which seems to feature the friendship,
or at least camaraderie, between a frog and a robot. We're really, really excited
to hear, not only how you got started as
a studio, but it sounds like there are some
much requested how-tos that you're going to be
sharing with us today. KYLE ERF: Right. PATRICK MCAVENA: Excited
to show those, off. Yes. Awesome. So, Amanda, thanks so
much for having us. We're really excited
to be here and to share a couple of projects, and
just our general game dev history with everyone. So to start things
off, just to tell you a little bit about the
studio, we started off in 2019 with Dodo Peak. Which, as Amanda said, is
a Retro Arcade platformer, which is out on Apple
Arcade and Nintendo Switch. And Dodo Peak actually started
as my first game project ever in 2017. I didn't have any programming
or game development experience. I had been tinkering around
in Unreal a little bit, and did a couple
really interesting first projects that
I won't show anyone. AMANDA SCHADE: Like prototypes? PATRICK MCAVENA:
Yeah, prototypes. Just kind of learning
and seeing what I can do. I did have a lot of
experiences with 3D artists, working in commercials
and visual effects. So I did understand how 3D
works and all that stuff. So that definitely helped me
out starting to learn Unreal. But because of my lack of
game development experience, and also programming
experience, everyone tells you, OK, when you
make your first game, you should make
it really simple. You should have a
very small scope. So I tried to do that. I tried to do something that
I was excited about making, but also I felt
like I could make. So I started developing
Dodo Peak, with a friend, James, who did a lot of the
design and UI and characters. We collaborated on
the game design. And like I said, I was
actually the only developer and programmer on the
project up until 2019, when we brought Kyle on board. Dodo Peak interestingly was
actually started as a AR game. We were really excited
about Apple's AR kits. So we're like, OK, maybe we
could do something in AR. I don't know if it's easy
to transition to my screen. But I do have a picture
of the early AR demo. If we can show that. KYLE ERF: Also-- PATRICK MCAVENA: Yeah, awesome. So yeah, this was the crazy-- you could play Dodo Peak on
the floor in the living room. Sorry, Kyle. What were you going to say? KYLE ERF: I was going
to say, I don't know if we played the teaser yet. So if we want to also
provide a before and after? PATRICK MCAVENA: Oh, yeah. That's probably smart. Yeah, actually, if we could go
ahead and play the teaser now-- the trailer, that's probably
a good place to do it. [MUSIC PLAYING] KYLE ERF: Straightforward
game with influences like the arcade
platformers of the 1980s. AMANDA SCHADE: It seemed
like it translated to that AR experience pretty well, though. PATRICK MCAVENA: Yeah. I think I have
just kind of always been fascinated with
like, little worlds, where you could just look at
them and move around. And it kind of seemed
like it made sense. Some of the challenges
with this game mode was we wanted to
ship with an AR mode. And also a normal mode that
you could play on your phone. So because of this 360
degree level, and you could-- the camera kind of,
like, swam around. It was a little vomity. So when people played
that, they were like, I don't know if
this actually makes for a really good, normal game. It's cool if you are in AR. So we actually decided
just to cut the scope and let's just make it a
non-AR game, and just take it where we can. So in 2019 we actually
had the opportunity to scale up the team,
add a lot more content and polish to the game. And at the time there were a
lot of technical challenges that I was already facing,
with my lack of programming experience. So I actually took
a Unity course, which is where I met
Kyle, ironically. And I could see that he was
actually a really, really good programmer. So I bought him a pumpkin
spice latte at Starbucks, and I sat him down, and I was
like, you should join our team. And you should make
this game really cool. And if we can-- actually, I'm
going to open up to editor now. If we can just
switch to my screen. So with a long project-- it had been in development
for about a year and a half, and like I said
before, I didn't really have a lot of
programming experience. So this is kind of what happens. So this is basically
the player controller. We call it the mother
Blueprint, where basically a lot of the player logic happens. So as you can see, there's
definitely a little bit of spaghetti going on. So when Kyle started
I think he kind of had to make some decisions
like, OK, do we clean up some of the code? There's a lot of moving
things going here. Do we just keep adding
features to the game? Or what do we do? So, Kyle, what was your kind
of on-boarding experience like? KYLE ERF: Well I mean
look at this, Pat. What do you think? PATRICK MCAVENA: [LAUGH] True! KYLE ERF: So first of all, I
like that you're showing this. I want this to be
sort of unfiltered. And I really like-- there's
another Inside Unreal with the Mortal Shell people. It's a really great one. People should check it out. I mean, keep watching this
stream, but after that. And they show some stuff
that's like Blueprints, that you wouldn't
normally show in a talk. But this all shipped. And what Patrick had on his
screen just now all shipped. So coming on, I should
say a couple of things just for some more context. When I came onto the
project there was maybe-- I think we were like three
months and some change away from when we
needed this out. So the approach you
have to take when you're in that sort of
situation is less like-- if I had a year, yeah,
we would probably rewrite a lot of the code. But because there were
all these requirements-- and I'll get to those
requirements in a second-- you kind of just
leave what works. And as hard as Patrick's initial
code is to follow, it works. And you know, God bless him. He figured out a
lot just for someone who didn't know how to program. And I'm actually
curious, Patrick. How did you learn
any of this stuff? Because you did Blueprints,
you also learned some C++, which you had never done. PATRICK MCAVENA: I did. I actually ended up writing
my first code on the project. Like a lot of the enemies we're
all originally in Blueprint, but they were very buggy. So I was like, OK, I'm going
to take this upon myself. I'm going to learn C++,
and rewrite these in code. And they actually ended
up working pretty good. And we still use that code
today in the game that shipped. But interestingly, one
of the early challenges-- and Kyle can speak to this
part, like I was saying before-- like some of the pathfinding,
since this is not-- I wasn't using the
character component, this is like on a grid. There wasn't any kind of
out-of-the-box solution for AI pathfinding to really work. So I came up with, like a kind
of not really great solution. That worked most of
the time, but as we started designing more levels,
it became kind of a bottleneck. So one of the first
things that Kyle did was he actually helped
solve this problem. And Kyle, you can probably
explain a bit more about how you approached it. KYLE ERF: Yeah, let's
throw up my screen. So I think I have yours up here. I have like three
Unreal projects open. Suites. If anyone has any
questions, this editor is Rider by
JetBrains by the way. Highly recommended. I can talk more about that
if people want to know, but it's a good
drop in replacement for using Visual Studio
to edit Unreal code. So Patrick wrote this thing
called set SMART path. Patrick knew what
pathfinding finding was, but he's not a game developer. And I should say my
background was also not in games development,
we kind of just hit the ground running there. But I've been just a normal
programmer for the last decade or so. And I wanted to get into games. I wanted to do
something more creative. That's always been
sort of the dream. So anyway, coming on to this I
was familiar with things like A*, and stuff. But Patrick solved
pathfinding the way that a person who's just kind of
figuring this out on their own might. Which I actually-- I'm pretty
impressed with what he came up with. PATRICK MCAVENA: Hey,
Kyle, just curious, do you have an example
of that level seven? I think that might be
interesting context. KYLE ERF: Oh, yeah. So a big issue we had with
the game was when you start. All the eggs come
out and go to where the eggs are supposed to go. And they use this very
basic pathfinding. And so you couldn't do something
like this, where they come out of the level and then fly all
the way around and come up on the other side. Let me just play that again. So we needed actual pathfinding. We couldn't just try and
move in the direction you're supposed to move. But what Patrick came up with-- this is a little grid, this is
a tool called Snip and Sketch, it's like a window
screenshot tool. It's probably the most useful
tool in game development. Unreal Engine is
also pretty good. But-- AMANDA SCHADE: [INAUDIBLE] KYLE ERF: --Snip &
Sketch is really useful. So this is just a grid. I think this might be like a
Guinea pig cage, or something. But it's good for our purposes. So say we have some
obstacles in the world. And I'll just put some here. Black is obstacles. And then this nice
gold color, that's our target, where
we're trying to go. And so let's say you
were pathfinding. Patrick's code that
I had up earlier basically tries to
go towards something, and if it can't go
towards something, it goes another direction. And it avoids going to
places that it's been before. Which is a pretty reasonable
way to try and get through the world, frankly. So that might look
a little something like this, where you're
coming in from the top, and you're trying to
get to this point here. And you get down, you
hit this juncture here, you can no longer go
forward any further. So that's out. You try to go-- it's also to the right of you,
so you try to go to the right. That's out. And you're like, what
are my other options? Well, I've already been
up, so I go this way. And then it's like, OK,
well now I can go down. So I'll go down. I can't go to the right. Left makes absolutely no sense. And I can't go up because
I've already been up. So I go down and
then to the right. And then you kind
of follow through. And that pathfinding
actually works really well if there's sparse things. And it's just a total
layman's solution. And I think it's really cool. But that doesn't work for
actually solving a maze. So what people usually think
we did here to get these eggs to fly around this path
as well as they do, is you implement
something like A*. But the solution we
actually went with is a simple
breadth-first search. For those who aren't
familiar with that, there's a million
explanations online. But basically-- to BFS-- Oh, man, my shortcut
didn't work. But basically you're-- instead
of doing anything directed based on where
you're trying to get, you just sort of go
in every direction, like one layer at a time. And I can pull the
code up for that. It's probably not the
most interesting thing in the world for someone
to just stare at the code. But the benefits of doing
breadth-first search versus something smarter is,
the simplicity is useful, first of all, for
modeling in your head. So it's just easier
to understand exactly what the code is doing. Second of all, it's a lot easier
to change and add things to. So we eventually added
these teleporters that move you from one side
of the level to the next. And those completely
break locality. Those break relative positions. So something like
breadth-first search is actually really
good for finding those. And that's just one of the
things we had to contend with. Patrick, is there anything else
on that you wanted to touch on? PATRICK MCAVENA: I think it was
just really cool seeing this. Like I was saying, I spent a
lot of time on this problem. And then Kyle comes in, he
does it in like a couple hours. And then I was like, Oh, man,
what else can this guy do? But no, creating a solution
like that, it's just-- you don't want to
be road blocked by certain problems like that. So we were able to actually make
a lot more interesting levels, having that pathfinding
implemented, which is really cool. KYLE ERF: Oh, I will say,
the reason that we even still have this old code is
that we do still use it. And this goes also
back in to simplicity. Like the monkey AI-- there's
these monkeys that will chase you in the game-- It's kind of dumb. And we kind of want it that way. So having something that
can move and get caught up in a maze-like
situation is actually kind of OK for gameplay. And if you do research
on like Pac-Man, or-- I mean Pac-Man is a very-- there's a ton of YouTube videos
explaining the AI of Pac-Man. The ghosts don't
all move in a way that is perfect for
catching you, right? It's more fun if they all
do kind of different things. And this is sort of the same
thing that we have going here. Where, yeah, this
isn't perfect AI. We tried giving the monkeys
perfect pathfinding, and it actually wasn't
fun to play at all. They were just too good. You just couldn't get
any breathing room. So actually kind of more
naive solutions like this can be a really good choice
for AI in a game like ours. PATRICK MCAVENA: Awesome. Right. I guess, Amanda, does anybody
have any questions right now? AMANDA SCHADE: Yeah, so
there's actually a few. So [? saxam13 ?]
was wondering, how did you get past any
project breaking hurdles that you may have encountered? Because you are working
with a small team, you don't have tons of people
you can go pester for help. So how do you how do
you overcome them? PATRICK MCAVENA: It's
a really good one. I want Kyle to take this mostly. I just want to set it up and say
that, yeah, we are definitely a very small team. And we basically
released on Apple Arcade, which is essentially like
releasing on three platforms and supporting a bunch of
different SDKs like iCloud, and different types
of input devices. So, Kyle, when he came
on, his big decision was, let's tackle
the unknowns first, as opposed to
tackling them last. But I'll let you speak
to that more, Kyle. KYLE ERF: Yeah. So that's a very
prescient question, because everything broke. The gameplay was solid. The game was working, and
that's like when I came on, when the game was working. Which is in some ways
a huge privilege, because I didn't
have to be there for figuring out what is fun. But just showing up, I had
never used Unreal before. That's a huge other thing
that I might touch on in as second, is how to
get situated with Unreal. But to answer this question,
you got to, first of all, definitely start
on things that you aren't sure are going to work
as soon as is reasonable. PATRICK MCAVENA:
Identify the things that you're most
unsure about first. I think that's the most
important first step too. KYLE ERF: Yeah, so when I
came on, the first thing I did was, let's get this
working on Apple TV. Let's at least make
it run on Apple TV. PATRICK MCAVENA:
Because up to that point it had just run on
phones, essentially. KYLE ERF: Yeah. So we did that, and that
hit a blocker right away, if I recall correctly, Pat. PATRICK MCAVENA:
Yeah, it crashed. KYLE ERF: It would just crash. It crashed
immediately [LAUGHTER] PATRICK MCAVENA: So
getting stable builds on all the platforms you're
going to ship on first is pretty important. KYLE ERF: So if I'm-- this was
literally over two years ago. I think I'm
remembering correctly. It was some setting
with the rendering that just didn't work on Apple TV. PATRICK MCAVENA: Yeah, it
was like, the shader effect, or something. Yeah. KYLE ERF: And the way
we figured that out was starting a new project
that was just empty, and seeing if we could get
that to run on Apple TV. And we could. PATRICK MCAVENA: That's
always a smart technique. KYLE ERF: Yeah. It's a great feeling
when that works. It's also a horrible
feeling, because it means now you have to figure
out what the heck the difference is. AMANDA SCHADE: What is
it about your project. PATRICK MCAVENA: Right. What's wrong with our project? Oh, no! KYLE ERF: It could be
literally thousands of things. So I think we're
eventually manually diffing project [? seconds. ?] PATRICK MCAVENA:
And we found out that Unreal doesn't actually
work with extinct animals. So that was the biggest problem. But no, thank you for
asking that question. Anything else? AMANDA SCHADE: Yeah. From [? HPplus, ?]
they're wondering, how did you go about
actually funding your game as a small studio? Did you do Kickstarter? Or work with a publisher? PATRICK MCAVENA: Yeah, that's
a really good question. It's one of the most
important things that independent
developers face. For a long time I
basically freelanced. And then I would take time
off to work on the game. But then we weren't able to
scale up the team that way. So we basically went around
and we just kind of pitched the game to publishers
and investors. And we ended up finding a
partner that was into it. And that's kind of
what worked for us. It's not super easy, but I
think that's the approach that most people take. There's also Kickstarter
and stuff like that. And other crowdfunding
methods as well. KYLE ERF: Yeah, I would
say the vast majority of the game's development was
quote, unquote, "self-funded," or whatever you'd want to say. Patrick working instead
of doing paying jobs. PATRICK MCAVENA: Yeah,
watching the savings go down a little bit. But it all end up working
out, so I'm happy I did it. AMANDA SCHADE: Still sort of
on this side of having a game, David Ricardo is asking, how
did you build up your audience for it? So what kinds of
marketing or advertising did you do to reach players? PATRICK MCAVENA:
Yeah, that's something we didn't do a lot
of, unfortunately. Because we didn't have a lot
of experience in that realm. I mean we got really
lucky in the sense where, if you could
get the platform you're releasing on to help you
out in any way, that's huge. So luckily launching
on Apple Arcade, the game was in front
a lot of people. And we didn't really
have the resources to do much more than that. But I think that
helped us immensely. It's something that we're
starting to work with more now on our next project. And they say you should start
marketing your game right when you start making it. I think to a certain
extent that's true. As the game evolved we
tried to basically add in features to the game that
people could share and compete with. So we ended up adding
some weekly challenges, and daily activities,
and stuff like that, to kind of encourage some
social aspects of the game. And I think that
did help us as well. AMANDA SCHADE: OK. That's good information. But we always say, definitely
don't forget about marketing. Don't leave it until the end. Whatever platform
you're shipping on, if you can reach out to
them, obviously you're making something in Unreal. Let us know what
you're working on. There's lots of different
avenues for that. You can make the best
game in the world, but if nobody hears
about it, then, unfortunately, nobody plays it. And so really make sure
you're getting the word out. PATRICK MCAVENA: Yeah, you
want to get the word out there. For sure. AMANDA SCHADE: Absolutely. A little more technical,
[? YoTaco14 ?] is wondering how do you approach
making tools for building your grid base levels? PATRICK MCAVENA: Oh, OK! KYLE ERF: That's
a great question! PATRICK MCAVENA: I could
show a little, just a very quick example of that. KYLE ERF: The answer
might surprise you. How it's-- PATRICK MCAVENA: Yeah,
it's very simple. So Unreal has this lovely
grid snapping tool. So basically everything is 100
by 100 in our world, right? We pre-defined that. So when the character moves,
it jumps by 100 units, and up, down, left, or right. So we basically have on
grid snapping at 100. And then we have basically-- we call this our cube element. So it has all the game
logic for a grid, it has-- I could click an obstacle so
the player can't go there. And it will just
basically add in, like a tree in this instance. I can override it and
change it to something else. So if I move this around,
move it over here, I've just added another one. And then on that
same cube actor I have some other
things I can say. Like, OK, I want a
baby to spawn here. So when I click
Play, there'll be an egg that's there, that the
player has to get and bring back to the beginning. And then a couple other
technical art things, like spawning grass
and stuff like that. But that's basically it. We kept it really,
really simple. And for us that seemed
to work pretty well. And James, who designed
a lot of the levels, he didn't have any Unreal or
game development experience either, and he was able to
just use those simple tools. And he did a lot of really
cool level work with that. KYLE ERF: Yeah, I'll
say I think that just having things be placeable
like that was really helpful. From a back-end
standpoint, our cube tiles themselves are totally
overloaded in the amount of logic in them. Which is sort of a symptom
of starting a game where you have never programmed before. But, it still works. Basically, the
navigation actually is built around doing ray casts
to figure out where things are. So if I were to maybe
start from scratch, I would maybe have things be
more aware of where they are on a grid that isn't 3D space. But for what it is, just
doing traces from the sky, essentially, just from above, to
figure out what's next to you. That's how this
works, and the upside is there's no
calculating some sort of back-end view of things. There's no simplified
view that can get out of sync with the real world. And again, it works! I'm always surprised at how
much some of these things-- like the bottleneck in this
game is always the GPU. It's never the CPU. And it runs well on
10-year-old phones, and stuff. So seemingly, that
approach was fine. AMANDA SCHADE: Yeah, and kind
of based on your comment, there was another
question from [? DC147. ?] What is the one thing you would
change about your development project now that you're
on the other side? What would you change
about your approach, or do you feel like
there are some of the-- [INTERPOSING VOICES] PATRICK MCAVENA: I have
probably a different answer than Kyle does. But I'll just say mine. I would have brought
Kyle on sooner. That would have been my change. KYLE ERF: [INAUDIBLE] AMANDA SCHADE: Aw. More resources
sooner, specifically. KYLE ERF: Oh, is that
your whole answer? PATRICK MCAVENA:
That's my answer. AMANDA SCHADE: That's fair! KYLE ERF: Yeah, so my first
suggestion to all of you is to hire me. So what I would do is probably-- I mean we could
give it to our talk just on what we
shouldn't have done. I think the good news and
the takeaway from all of this is, we made a ton of mistakes. And if I pull up the
mother Blueprints-- this is basically pornographic. But if we cut to my screen-- So let me just walk you
through how movement works. I'm not actually
going to explain it because it'll take too long. But imagine you've never
opened this project before. That won't be hard for anyone
to imagine, none of you have open this project before. So when I was getting
situated with the code base, first thing I try
to do is figure out, how does this bird move? So I found this
touch input node, and just sort of follow that. And so it's getting
locations on the screen and calculating the
direction based on that. Pretty standard. And then it's just keeps
going, and keeps going, and keeps going. And then we're getting
to obstacle checks. And then it keeps going. And this is where we actually
find the tile to jump to. And that keeps going. And now we get to
the actual animation. Timelines are great for
simple movement like this. And then that's where
the animation happens. And that runs the whole
length of this window. So first off, I think all
of the individual pieces here are not bad. But encapsulating the code
is really useful, especially if you're going to be working
with more than one person. Or even be working on a
project for longer than a year. You're going to forget
how things work. So at the very least-- [INTERPOSING VOICES] Yeah, and having functions
is a great way to do that, because you have to
name the functions. So if every one of these
things was its own function or subgraph, just from an
organizational standpoint, that would be really,
really helpful. I know if people
are more experienced and are hearing my answer,
they're like, yeah, duh. But it's useful. There's a reason you do it. AMANDA SCHADE: Yeah, you
may not be singing the chat, but folks are talking about how
their Blueprints look similar. They're just getting started
and may also be in the state. And that's the thing. You don't have to
be super experienced or have a lot of skill with
Blueprint or programming in general to get
off the ground. And I think that's an
absolute testament. Like you all released a game. And it plays great, it
works-- that whole thing-- it's on the platforms. PATRICK MCAVENA: No
phone has caught fire, that we're aware of. So that's a win. KYLE ERF: Yeah,
Blueprint's also, I think to Unreal's credit,
I think it's a great way to learn programming. Like a lot of people who are
like, oh, I'm not a programmer. It's like, you've written
2000 Blueprint nodes. That's programming, dude. PATRICK MCAVENA:
Yeah, I mean you don't have to worry about the syntax. But the logic is pretty similar. KYLE ERF: So you'll
work with people. And someone who has a stronger
programming background will have a better intuition
about what to encapsulate. I will say the reason that all
this stuff is still so crafty and in there is, like
I said, I came on and we didn't have
that much time left. And I think an experienced
but not as experienced programmer might have
done something like, oh, let's rewrite this and make
it really good and bug free. PATRICK MCAVENA: Yeah,
I was going to say, it's always nice once
you have-- you're like, OK, this is a cool feature. I'm happy with this. Take time then to go back. And you should always try to
work clean as you're going, but then you can take
time to refactor it a bit and to move on from there. I didn't do that as
much as I should have. But that's definitely
a good practice to get in the habit
of for people-- KYLE ERF: And Patrick's
not on trial here. So that's good. And as I was saying,
a good programmer might have thought to do that. But if I had done that, we
would not have shipped on time. That's the thing. PATRICK MCAVENA: Right. KYLE ERF: This works. So I spent time
getting iCloud working, making things package on Mac OS. There's a blog post-- I won't go into the details
because it doesn't show well on this stream-- if you're interested in
developing in the Apple ecosystem, there's a blog post I
wrote for the Unreal tech blog. If you just search for-- where did it go? It's Unreal-- If you just Google
"Unreal Mac Ecosystem," that's the blog post. And it has code, it teaches
you about objective C++, which is how you integrate
with all those APIs. Teaches you about
Plists, and I don't think I'll go into that
anymore unless people have questions on the stream. Because it's really just
listing off API names. AMANDA SCHADE: Well, we can
pick up the post for folks and share that so that they
can take the time to digest it. Because I imagine there's-- we do have other things
we want to get to here, but there's certainly a
lot of questions coming in. They are wondering,
these are Blueprints, but you left them as is. [? LucasMachado ?] was asking
if you converted them to C++, or you just left them, right? PATRICK MCAVENA: So, I
could speak to that a bit. So the main actors in the
project, you've got the player and you have the enemies. And those are probably
the most complex. At least until
Kyle got on board. I did end up rewriting
the enemies in C++, kind of like a challenge
and exercise to myself. And since they're
being used a lot, I wanted some level
of inheritance. So I could have one kind
of base enemy class, and then if we wanted like
a certain type of enemy to inherit from that. So I felt like that
was meaningful. So I don't know if there's
like a hard and fast rule. But for me that worked. And if you're going to
be using that a lot, and then a bunch of
different actors, and you're going to have
a lot of inheritance-- and you feel
comfortable doing it, and you're not a huge
programmer, but someone that wants to learn more and
you are up to the challenge, I think it's
definitely worth doing. KYLE ERF: Yeah, I think,
again, if it works, there's lots of
ways to move things. Move your code, your current
execution path back and forth between C++ and Blueprints
as is reasonable. I'm a huge fan of-- even in our new project,
Shoulders of Giants, making C++ Blueprint nodes, and
just chaining those together. So if there's something you're
doing that's data heavy, or it does a lot of
data manipulation. Or like a lot of graph search-- our pathfinding. Our pathfinding probably
would have actually been slow if I did it in Blueprints. It would have probably
been a bottleneck. So things like that are really
good candidates for C++. Anything that involves a
ton of for-loops, basically. PATRICK MCAVENA: Yeah,
there's also certain things that I ran into that weren't
exposed as Blueprints. Like I wanted to change
the mobility of actors. I can't remember exactly why. But I just went in and made
my own custom Blueprint node, exposed that. And stuff like that is really
helpful and useful, too. AMANDA SCHADE: Nice. This goes into your
workflow a little bit. [? JamesDKSmith ?]
was wondering, do you have a general agile
or waterfall development plan? Or any tips or
suggestions on how to track your progress or
the work that you're doing? PATRICK MCAVENA:
So we didn't then. But we do now. KYLE ERF: I'll field
this one a little bit. So, man, this is always
the eternal question. I've done various amounts
of project management as part of my previous jobs. I'm kind of the de
facto project manager in the studio at this point. Like I'll make a Gantt chart
now and again, just to make sure we're not going to miss
any important dates. I think for Dodo Peak,
it was definitely more what you would
call waterfall. I mean the first three months
I was on was basically agile. And we were like, fix this
bug, oh, my God, we've got to get this working! And so in that
way there was just a constant undefined
stream of work coming in. But I found-- and I've been
working in various tech jobs for about a decade now-- and every team finds a
thing that works for them. There's no silver bullet. Usually everyone ends up with a
mix between agile, like scrum, and having more long-term
planning and milestones. And I think, especially for
creative works like games, unless you're
building a game that is in a really fortunate
place with early access or as a live
service, I think you do have to have some amount of
quote, unquote, "waterfall," which is where
you're planning out exactly what's going to happen. And this is just my opinion. But I think it's very useful
to have, OK, in three months this all needs to be done,
or else this can't happen. Especially with a small team. We don't have the luxury
of having, like seven people building out
seven different systems. It's me and Patrick building
out all of the core systems on our current project. And then we have other
people, but they're sort of like glomping on to those. So I realize that's a
tough question to answer. PATRICK MCAVENA: It's
a good one, though. KYLE ERF: If I had a perfect
answer, then I would be-- I don't know, I'd
be famous, right? AMANDA SCHADE: Any
tools-- are there any tools you felt helped you're
helping your teams as part of that process? KYLE ERF: Oh, that's
a good question. So for Shoulders of Giants,
we're using a lot of Trello, just to keep track of a stack
of work we need for a milestone. And I use this tool
called Team Gantt, which is just a really good online
app for just roughing out really ugly-- or not ugly, if you
put the time in-- charts that can help
you schedule things. But mostly Slack, mostly
just talking with Patrick. Again, part of the
benefits of a small team is there's really never
any confusion about what needs to get worked on next. AMANDA SCHADE: Even
in this format. Yeah. KYLE ERF: Yeah, exactly. PATRICK MCAVENA: Like, oh, one
of the [INAUDIBLE] will do it. AMANDA SCHADE: Kind of
on workflows, and things like that, and
seeing that you don't have a team, what about art? How are you creating these
models or these assets for the project? Is that you, or are
you outsourcing? PATRICK MCAVENA: So it's
the same for Dodo Peak. We have an art team. Basically prototyping Dodo
Peak, it was me and then my friend James. James did a lot of the art. I did the programming and
a good amount of art, too. And then once we kind of
had a rough draft prototype, we decided that we
wanted to find someone like an art director, that
could help us flesh out more of the art. So we found someone,
his name is Max. He's amazing. And so we brought him on. He's actually working with us
on Shoulders of Giants now, too. So we do have an art team that
is doing modeling, animation, concept art. But in the early part
of Shoulders of Giants, we were figuring out what
it was before we kind of-- we only recently
started full production. That was basically me and Kyle. We did have a little bit of
help externally with art, but now we have a lot more. Which has been really
great, to see that progress. AMANDA SCHADE: Well,
I feel like this is a good spot to kind of
move on to your next project. KYLE ERF: Oh, wait. I have one thing-- AMANDA SCHADE: You
have another thing you wanted to cover on Dodo Peak? KYLE ERF: Yeah. We deviated from
the plan, slightly. But people might find
this interesting. And Patrick gets to
show all the cool stuff in the half about
Shoulders of Giants, because he's the
technical artist, and that stuff all
shows really well. But there's a feature
in Dodo Peak that's sort of an endless
runner mode, that I think people might be interested in. Because I know
people love Procgen. And people love randomly-- PATRICK MCAVENA: It's
a hot topic these days. KYLE ERF: And it's
one of the few things that I can talk about
that looks kind of cool. So if we cut to my
screen really quickly. So this is sort of
the last big feature we added to Dodo Peak, which is
a mode that is, basically you climb up this hill endlessly. And the goal, rather than
just saving all of your eggs, it's about collecting
as many as you can and dropping them
off at these points. While the water is
slowly rising below you. So we're generating these
hills that go on forever, and when there's no bugs, which
there usually aren't anymore, you can just keep going. Essentially until you
run out of battery. So I wanted to talk a little bit
about how we got to this point, because you can see there's kind
of a mix of existing structures and random stuff here. And the feedback has actually
been really positive on it. For me, personally, this is
the only part of the game that I still like. But again, we've had the
game out for two years. It's got 60 levels, once you
play-test all those levels like 100 times, this is
the only way you-- [INTERPOSING VOICES] PATRICK MCAVENA: You
want something fresh. Even us. One of the cool things I just
wanted to say real quick, Kyle, is we have
a daily challenge. And every player basically
uses the same seed for the level generation. So they can all play the
same level every day. And then every day it's
obviously a new seed. So it's basically a new
level, which is pretty cool. KYLE ERF: Yeah, that's weirdly
one of the most gratifying feelings as a game developer. Like I won't think about
Dodo Peak for a day or two, and I'll just look at the
daily challenge leaderboards. And there's people getting
super competitive on there. And that's really cool. Right? Like people I didn't
ask to play it. That's neat. So I want-- [INTERPOSING VOICES] AMANDA SCHADE: --your levels
were previously explicitly designed, right? And then this is
procedural, so what was the mindset and
the approach to that? KYLE ERF: What a
perfect question. So there's a lot of great
talks about endless procedural generation out there. I think the biggest
piece of advice for anything, regardless
of if it's a grid base, if it's an endless runner,
if you're designing, like, No Man's
Sky, is figure out what is a good thing
you're trying to generate. What is a good version of that? For Dodo Peak we were really
lucky in that the game was already out for a year
when we started doing this. PATRICK MCAVENA: We knew
what a good level was, and what was fun
and what wasn't. KYLE ERF: Yeah,
so like the things you would say that makes a good
level in an arcade platform, or like Dodo Peak, is
having a few critical paths, and little offshoots,
and things to collect. And enemies guarding
essential things. And you build an intuition
about like what's fun. And so I set off on a quest
at the end of last year to figure that out. And the first thing I
did in that process-- and let's open up
my screen again, because this is where--
this is the stuff that no one's seen before. I'm not even sure Patrick
seen a lot of this. So I'm a huge
advocate of, if you're going to do any sort of
bold change to your project, just make a new game. Not a new game, sorry. Make a new Unreal project. Make a new-- literally,
make a new game. Don't make a new game-- you know what I mean. PATRICK MCAVENA: Every time
you build a new game, yeah. KYLE ERF: So the
same thing happens-- and we can talk about
this with multiplayer and Shoulders of Giants--
making a new project to test certain
things before you start trying three different
drafts in your actual code base. It's so much easier to
just keep it all contained. So I made this level with
these really crappy default skin blocks. PATRICK MCAVENA: It's important
to use programmer art too, I think. KYLE ERF: Yeah. When the artists are away,
Kyle's going to play. So you can make
your own tree out of a cylinder and some cones. And that's pretty fun. But even more fun than that-- PATRICK MCAVENA: Oh, is that the
Unreal grass material on there? Very nice. KYLE ERF: That's grass, yeah. PATRICK MCAVENA:
The starter project. KYLE ERF: So aside from
getting to make your own trees like it's kindergarten,
you can also experiment with different ways
to approach level generation. And so the first
thing I did was-- what is it like if you're
just generating rows of tiles and you can just kind of flip a
coin and turn them on and off? And in this case, it's
really more of a dice roll, because it's like a
fractional percentage. But basically this is a
generator that just either renders a tile or it doesn't. Or it puts an obstacle on it. And sometimes it puts
these little eggs out. And frankly the first
thing I noticed was, these levels aren't awful. Like after playing
the game enough, you kind of know
what might be fun. And just turning things on
and off was kind of cool. But there is still
some huge problems. So I'll see if I
can find an example. You can get to a
point very quickly where you hit a spot where you
can't go any further, right? This is all just
completely random. You're going to hit
here and there's-- I mean, pretend that's gone. And now you're stuck, right? So first thing-- well,
not the first thing I did, the first thing
I did was I went out and I did a lot of research. So I bought this book,
Procedural Generation and Game Design. Highly recommend. Even though I didn't do
anything in it specifically, it's just a really good
resource for methodology. And it dawned on me, oh, we
should have a critical path that you can follow
through this level. So you're always guaranteed
to be able to move forward. And so that's the
next iteration that I wrote in this little tool. I should just take this here,
and then I'll find it easier. OK. So now you can see there's
these paths laid out. And those are unbroken
in this visualization. Obviously, that cuts down on
some of the foliage and stuff, and we'll get to
that in a second. But basically we're
defining these loops. I went with loops rather
than just straight lines because in any good
Dodo Peak level, there's usually more than
one way out of a situation. There are very few dead ends. So by using loops rather
than just a wiggly line to define this
critical path, I think it's probably the only actually
interesting, smart thing I did in all of this. Because it guarantees
you always have options. And most games,
that's what you want. So you can imagine sort
of following this up. But these levels are
still pretty boring, if I would say so. So we wanted to, after
playing this, it's cool and you can drop
random things in. But we really wanted
some pre-made elements. Like stuff that Patrick
and I could go and define. And the way we
decided to do that was defining this grammar of-- this is just a really
ugly data table. I wish I could zoom in
on this, but I don't think you can actually do that. Basically we have
text definitions of groups of blocks, and we
need to put those in the level. PATRICK MCAVENA: By the way,
data tables are really cool. And I didn't know that they
existed until Kyle showed me. In Unreal. KYLE ERF: Yeah, data
tables are great. You can export this as like as
CSV file, which is really nice. PATRICK MCAVENA: Upload
it to Google Docs. KYLE ERF: Yeah,
literally we've done that for things that aren't this. It's very nice. So we have this grammar. And this is just for
this demo project, the real one is much
more intense than that. But basically you define
these groups of tiles, and then those get
put into the level. And I'll show you how
that looks really quickly. Then I'll explain what
it does, and then I'll show you it working
in the main game. So let me edit this. Plug this into the new one. And you can see now
when I generate a level it has these groups in it. So we see this one here. These numbers are just there to
identify what's part of a group and what isn't. So this one has a hole in it. This is the one
with the hole in it. And this one is a bridge
with an egg on it. And it just kind
of throws these in. The process of figuring
out how to actually put these in the level was,
I'd say, not trivial. There's kind of a
problem with something that is endlessly
growing upward, and you want to put random
pieces inside of it. My first thought was we'll
have this sort of Canvas. And we'll move in big sections. And we'll just pick random parts
and put random groups in there. And that works, to a degree. It didn't let us stack things
as tightly as we wanted. So ideally, it would
have been cool to have the entire level
made from hundreds of different pre-made sections. So what we really
wanted was some sort of tightly packed thing,
but also something that wasn't going to take
a bunch of random guesses and find things that
don't work, because that's bad for streaming in
new layers of the level. We want something that's
pretty deterministic. And so I was
thinking about, what is a good way to pack
different sized objects upwards, sort of indefinitely? And I realized, this is
actually something people have been doing for a long time. It's called building a wall. [LAUGHTER] So these are pictures of
what is commonly referred to as cyclopean architecture. PATRICK MCAVENA: It's
basically like LEGOs, right? KYLE ERF: Yeah, it's a
little bit like LEGOs. A little bit like Tetris. But if you have to
build a wall and you have a bunch of
different sized rocks, this is essentially
what every person just knows deep inside
themselves they have to do. You put down a big rock, and
you put small rocks next to it. And you put another big rock,
and you do this from the bottom up. And you just sort of
go layer by layer. And so we devised a
fairly simple algorithm to do this that I have a
very silly animation for. So the way it works is you start
on an empty row, you put down-- you find the longest
empty section and you put just a random
group in there that fits. Then now we have this
section to the right of that, you put something
in there that fits. It's taller, but we're
still just concerned with this bottom row. And so we fill the
next biggest section, and then we like fill
this small little gap. We move up to the next row. We fill that. We move up to the next row. We have this three section here. So we put something
in there that fits. In this case, it would
happen to be three wide, but it doesn't have
to be that wide. And then we continue filling
the rest of the row, move on to the next row, we put
something in that slot. Put something on there. Put something over there. Move up. And then start filling that row. And you get it. I'm not going to
animate the whole thing. But basically all
of these rectangles are different pre-made
groups, and these gray ones are just sort of one by
one, just random tiles that aren't predefined. And so you end up with
something that looks like this. And the benefit of it is it
runs really quickly, it's sort of like a greedy
algorithm for doing this. And it goes on. You can do this on forever,
which is what we wanted. We didn't want something
that had to backtrack. So to wrap this up, I was
playing endless mode earlier, and this is what it does. There's actually a handy
debug mode for this, because believe it
or not designing procedural generation,
things break constantly. So you need really good tools. So if you go to the
level generator, and turn on display
debug visuals, you can see pretty
much everything I was just talking about. So you can visualize
these rectangles, those are like
the critical path. And then on every
block it says the name of the group it's a part of. So this is called
like "diag tree." At some point you're just naming
weird collections of blocks. So it gets kind of silly. This is a "space tree,"
this is a "meh zero." Two-by-two empty, so you can see
all of these different groups are getting stacked
on top of each other. And if you want to make a
tile-based endless runner, I think this is a decent
way to approach it. And that's kind of all I
have planned to say on that. AMANDA SCHADE: That's great. I do have a question. What is your high score? PATRICK MCAVENA: Oh, wow. KYLE ERF: It's not that high. It's like 200. PATRICK MCAVENA:
I'm going to look. KYLE ERF: You can look. You can look. It's really cool to make a thing
that people are better than you at. That's one of the real charming
things in game development, I think. AMANDA SCHADE: I do
think, breaking down your grid and
approach to solving the problem is
something, sometimes, we forget, that these
problems exist in the real world
in various ways. And so sometimes stepping
back from your code or trying to think
of that, and just, how would I solve this problem
in a real life experience? Or what does it translate to? And that can help you come up
with a very thoughtful approach to-- Like, OK, now that I have
an idea of how I want it to actually function, you can
then think about how to program it and put it into Blueprints,
or C++ then, to build that way. PATRICK MCAVENA: Break
it into smaller pieces. KYLE ERF: My one regret is
I didn't get a pack of LEGOs to do this. PATRICK MCAVENA:
You really should. KYLE ERF: I had some
in my Amazon cart, and then it was
like, I don't know if I want to be responsible
for 1,000 LEGOs. AMANDA SCHADE: You'll step on
them later, it would be bad. KYLE ERF: So my
high score is 226, and Patrick's high score is 109. PATRICK MCAVENA: OK. I'm going to be playing
after this is over. AMANDA SCHADE: Awesome. So was there anything
else you wanted to share about Dodo Peak. PATRICK MCAVENA: No
I think that's it. KYLE ERF: No, I think that's
all the prepared stuff. AMANDA SCHADE: Cool. So I feel like it makes sense to
move on to your latest project. It's the frog, robot friendship. So you want to tell us
a little more about-- I guess we have
the trailer right? KYLE ERF: Yeah, let's
play the teaser. PATRICK MCAVENA: Yeah, maybe
we can play the teaser. That'd be cool. We had maybe another-- Yeah, there we go. Beautiful. [MUSIC PLAYING] Cool. AMANDA SCHADE: That was awesome. PATRICK MCAVENA:
Thank you so much. AMANDA SCHADE: I loved seeing
the light emerge from it. It's so pretty. PATRICK MCAVENA: Oh,
I'm going to be going into that in a little bit. AMANDA SCHADE: Oh, man! PATRICK MCAVENA: But, yeah. So Shoulders of Giants is
our current and new project. When we were wrapping up Dodo
Peak, as a very small studio, we were like, OK, do we want
to be safer and do something similar in scope to
what we've done before? Or do we want to be crazy? And do something
a little crazier? So we opted to be crazy. And we started making
something that's a little bigger in scope. Well, a lot bigger in
scope than the Dodo Peak. And to give you a
little of context into how we decided to make this
project, other than the scope, we were really
interested in making a game that had a big character
and a small character. And just that
juxtaposition in scale is just kind of what
started us on this path. But, as Amanda was saying,
Shoulders of Giants is an action roguelike,
where you simultaneously control a sharp-shooting
space frog perched atop a sword-wielding robot,
and you scavenge the universe for an arsenal of
randomized abilities, and you use them to spread light
and life back to dark worlds. And I always like to see-- I'm always interested
when I see other games, OK, how did you start off
on your development journey? What changed? So we actually have a
video kind of showing the evolution of
Shoulders of Giants over the course of
development so far. And if we could just play that. KYLE ERF: Beautiful. PATRICK MCAVENA: Awesome. Beautiful. KYLE ERF: This game has
a lot of things, right? PATRICK MCAVENA: It
changed a lot, yeah. KYLE ERF: It started as
kind of a walking simulator, weirdly enough. I personally am extremely
into death stranding. That's not what this
is now, but it kind of started as the idea
of you're moving through this big
landscape, and you have to direct this
dumb giant around. And it kind of then turned
into a real time strategy game. And then just became an
exploration 3D character action situation that you see now. PATRICK MCAVENA:
Yeah, we always tried to make sure to play
tests as much as we can. And just based on
the play testing, we just kind of moved in the
direction that it is currently. So like I was saying, one of
the biggest thematic aspects of the game is this idea of
bringing back light and life to a world. And we had to figure out,
what does that look like? How is that going to work? And not only did we
want that kind of effect to happen for thematic and
story reasons in the game, but we also wanted the
majority of the characters abilities and weapons to also
spread light and life too. So we explored a couple
of different techniques, and if we transfer
it to my screen I can kind of show you guys
what we ended up doing. So this is one of the
first levels in the game. And I love sliders, so I'm
just going to slide this here and you'll see this
effect start to happen. So not only is there
like a color change, but as you can see, there's
other types of foliage, and there's leaves
on trees, and there's this kind of bleeding edge of
this glowing life coming back to this planet. So if I kind of zoom
into the ground, I can see a little more clearly. There's also a little bit of
world position offset happening as things kind of scale up. Like flowers, and
different plants. And also there's things like
God rays coming to view. And a bunch of
materials are going to change the way they look. And also, if I
play the game, if I go over to a safe spot
where no one can kill me-- so if I give myself an
ability like a light grenade, I go over to these
guys, I fired at them. So this ability is also
going to spread light too. And you'll see that they
actually take damage when they're in the light area too. So if I fire it
at a place where I know there's more pretty
looking stuff, like here, it's basically the same
effect that happens. AMANDA SCHADE: That is
so absolutely lovely. PATRICK MCAVENA:
Thank you very much. Thank you. Appreciate that. It's actually a very,
very simple technique. And the way that it works is-- as you can see, I have like
a material collection here. So this material
collection's got two things. And it's got a lot
of those two things. It's got a position
in the world. And it's got a radius. So when I drag this slider, this
is basically the world position of this point. And as I drag it, the
radius is getting bigger. So if I move this
around, you can see the position of
this effect is changing. And what happens is, this
material collection-- we have a material function
that reads all of these material collections. So we have a bunch
of them because we have a lot of different
abilities and things that use all this stuff. So we basically
use a sphere mask and we take the world position
for the material collection. We pump it in there. We pump in the radius. And we basically add
all those together. So we have a bunch of-- KYLE ERF: It's pretty big. PATRICK MCAVENA:
It's pretty big. And then you
basically end up with a mass, black and
white mass, that's in world space,
which is pretty cool. And you can do a lot of
different things with it. So as you can see, there's some
kind of warping and distortion and stuff. So it's not just like a straight
line, because that wouldn't be as visually interesting. So to do that, we
basically take-- where am I? Here where we go. We take all those sphere
masks added together, and we basically run
it through a texture. And we use a height lerp
node, which, if you've never used it before, is really cool. Basically anything
that's between 0 and 1, you can use a texture to
define the transition of it. So it's not just
flat, and you can make it a lot more interesting. So we run it through there. And then basically
a given material will just have that
material function. And then we use that to lerp
between colors and opacity, and in some instances,
world position offset. And then to get this bleeding
edge here, as I call it, we basically just take that-- I call it the light
dark function, which is basically all the
sphere masks added together. And then we just apply
a negative contrast. And what that does is kind
of suck everything up. So you basically
just get this kind of bleeding edge
around everything. And then we add a
mix of color to that, and then whatever material we
want to have to that effect, we just add that to the emissive
channel of that material. And that's basically how
the visual system works. And then there's an
actor in the world that's spawned that kind of handles
the writing of the information to the material collection. So the radiuses I
was talking about, we also have a sphere
collision that will scale up its radius as well. So actors will know if
they're inside or outside of the light area. AMANDA SCHADE: You just make
it sound like it's so easy. KYLE ERF: Well,
unfortunately, it's-- PATRICK MCAVENA:
Well, I will say this. I didn't come to this-- I think the best
solution to everything is always the simplest one. But it's not like I just settled
on this in the beginning. Like actually at
the beginning, I was using render targets, like
a couple different methods. And so it took me a while until
I ended up staying on this. And then it was
pretty unorganized. And I was like, oh, I'm
going to organize it into material functions. And so it's not like I
just sat down and make this in like an hour. KYLE ERF: Easily months of
R&D. I mean not solid months, but this took so
long to arrive at. PATRICK MCAVENA: Yeah, it took
a while to figure out exactly. I mean, just from a
creative perspective too, how we wanted
it to look, and then how we wanted it to work. But, Amanda, did anybody have
questions on that technique? AMANDA SCHADE: They're actually
wondering how expensive is it? Does it take a
lot of processing? PATRICK MCAVENA: It's
a very good question. So our platform plans right
now are console and PC. So we're targeting not
super low tier hardware, but actually it runs
great even on phones. So there is a cost, for sure. I think it's like 150 shader
instructions basically added to everything. But I can show you guys
the shader complexity. So it's greenish brown. Which is not terrible. The red is basically
the transparency, like the God rays. So the interesting
thing too is-- and I am not a
super, super expert in terms of how
efficient all of-- like the GPU cost
of these things. But if I do slide this
on in the shadergraph, I don't see anything in
the shader complexity until these objects are on. So it does get a little red,
like when the effect is fully in place. But on a lower end PC,
we're getting 60 FPS. And I think there's actually--
this is not a bottleneck. There's things that are
a much better bottleneck. KYLE ERF: Weirdly-- PATRICK MCAVENA:
You can go ahead. Sorry. KYLE ERF: The
bottleneck with this that we found was actually CPU
just from having the sphere collision. PATRICK MCAVENA:
Yeah, that's true. KYLE ERF: You get a
sphere that goes up to the size of the whole
level, which is how levels end. It's like everything. That'll lag. That'll lag pretty good
if you're constantly changing the size of a sphere. PATRICK MCAVENA: If you
have a huge overlap that has to check everything, that
was the bottleneck for us. So we basically
kind of cheated it. Instead of scaling up over
time, it just goes from 0 to 1, like over one frame. And no one really seems to
notice that is happening. KYLE ERF: That's only-- I will say, to my credit, it's
only on the end of level one. But, yeah, fixed it completely. Yeah, it's not the GPU, weirdly. I'm also really
impressed by that. PATRICK MCAVENA: Yeah, I
was a little bit scared, but after testing it was
actually not too bad. AMANDA SCHADE: That's great. Let's see, as far as
the questions specific to that effect at least,
there aren't any more. PATRICK MCAVENA: Cool. I can move on to my next thing. Unless we want to do-- OK, cool. So the other cool
thing that we did was-- let me just open up
another level here. So our levels aren't
procedurally generated, but there are a lot of
randomized elements. And one of the visual
randomized elements that we wanted to
have, was we wanted to have randomized colors. So we don't actually have
every color randomized, because I don't think that would
be very visually appealing. So what we ended up doing is
we have just color palettes. Like predefined color palettes. So if I click on this
actor in this level, it'll basically swap between
the different color palettes that I have like assigned
as options in this level. And the cool thing, too,
is this is basically a material collection. There's a lot of different
color options in here. So basically every one
of these corresponds to a certain prop or color that
we want to have in the level. But I could-- as we
further develop the game-- our library of color palettes
is going to really grow. And I can reuse them
all over the place. Because all of our
materials are set up to use that light transition,
to use the random color effects. And not only does it
affect the materials, like static meshes, but also
the sky box, and the fog color, and all that stuff. So the goal is to have the
level feel pretty different. And the way that
it works at runtime is, we just have this actor
that basically you tell, OK, these are the
possible color sets that I want to be able to use. And then at runtime we have
basically a hero material collection that all
of the materials are referencing to get their
color information from. And then at runtime
we'll basically pick from one of
those possible sets, and then this is basically
an array of strings that it's just the same list
of the material collection. And it will just take the
colors from the template and then push them into the hero
color collection at runtime. And this also works
very quickly and fast. So there's probably a lot of
different methods of doing this type of technique. But this is the one
that made sense for us. And one of the
other cool things-- a cool tool that
Kyle made, actually-- as I'm making these
color palettes in game, one of the problems
that I had was-- I basically have a hero
material collection that all the materials
are referencing, but let's say I want to
go back to a material set that I previously made. And I want to update it
or change it, or further look at it. Or use it as a template
for viewing something else. As you can see here-- where did my color sets go? Oh here we go. So I have, for example, in
this I have three color sets. I have these three. So let's say that this one here,
I wanted to tweak the rock. So I double click
it, I open it up. Siri said something. [LAUGHTER] KYLE ERF: That was so scary. [INTERPOSING VOICES] PATRICK MCAVENA:
That was terrifying. Oh, my God. OK. So if I wanted to
change this rock color, you won't see it update,
because all the materials are referencing not this
material collection, they're referencing another one. Like the hero one. So I could click this button,
which will then eventually pick the color set that I want. And will update. But if I want to do this in
real time, how can we do that? So Kyle actually made
an editor function, so if I click this
preview editor set 0-- KYLE ERF: Sorry, Pat, can
you scroll down a bit? Your face is in front of your-- PATRICK MCAVENA: Oh, no! OK. Yeah let me-- AMANDA SCHADE: We just did it. KYLE ERF: It's faded out. Faded out. It's beautiful. Thank you. PATRICK MCAVENA: OK, cool. So if I click this
preview color set 0, this will actually
execute on TIC only on editor, that
same function that will update the materials
or the material collection. So then I can make a
beautiful pink rock, or I want to make
a fully green rock, and it updates in real time. And that way it's
very easy to iterate. And Kyle, I don't know if
you want to just like-- this is actually a really cool
tool for editor stuff. I don't know if you want to
talk about it a bit more, Kyle? I can kind of show it
on the screen here. KYLE ERF: Yeah, if you
just stick on your screen. So I'm not going to
take credit for this. This is completely based
on a YouTube tutorial. If you want to look it up,
it's Editor TIC Tutorial Using Blueprint by someone
named Sili, S-I-L-I. But basically what it does is
it creates an Editor Utility Blueprints that is outside of
this color setter Blueprint that runs in game. And if, Pat, if you go to
the construction script. If you have that checkbox
that he mentioned checked, it'll create this child actor. And that actor has its own
sort of timer that it runs off, and every, I think
tenth of a second, it calls an interface function
on the color center Blueprint. Which is just called Editor TIC. And that'll just run it. And it just does what
it would do in game. Just copies all the colors over. And you can kind
use this as a way to, if you want an
external object's settings to be reflected in
an in-game object, or an editor object
like this, normally you could just use your
construction script to automatically reflect
variable changes in properties like in the editor. But because this is an external
object, having a TIC like that, just constantly updating
while that checkbox is on, is a great way to work
around that for prototyping. AMANDA SCHADE: And we can
give a huge shout out to Sili, because they're in
chat and hanging out. KYLE ERF: Oh! Yeah! AMANDA SCHADE: Great work. KYLE ERF: Thank you so much. Thank you. PATRICK MCAVENA:
Yeah, thanks man. You saved us a lot of time. KYLE ERF: Thank you. Thank you for that. I'm going to give you-- I realize I didn't give
the video a thumbs up, so giving it a thumbs up. And everyone check it out. And it's super useful. Thank you so much
for doing that. I spent weirdly long
trying to figure out-- there's 100 different
ways to kind of do that. But just having the editor TIC
was so much easier and simpler. AMANDA SCHADE: Well
I think that's what's great about having a community. And yeah, maybe somebody else
has figured out something and you can just
leverage that knowledge from someone else's experience. And take it, and utilize
it where it makes sense. And then if you're going in and
sharing-- you're sharing today how you worked on your effects,
and hopefully somebody else can be like, oh, yeah, Thanks
to Kyle and Patrick, now I know how to
do this cool thing. So that's really fun. PATRICK MCAVENA: I guess
you could say, in a way, Kyle was standing on
the Shoulders of Giants with the knowledge. KYLE ERF: How do
I leave this call? How do I leave this call? [LAUGHTER] Awesome. What a charmed life? Yeah, that's very cool. AMANDA SCHADE: Love it. PATRICK MCAVENA: Cool. So I did have one more
sort of tech art thing that I wanted to show. So going with the
theme that obviously I think a lot of indie
does, experience of having a really
small team, you wear a lot of different hats. So not only do I do
the environment art, but I do most of the level
design, at least thus far. So I don't think it's
an official term, but I think a pretty common
term in designing levels is "gray boxing." So using gray boxes
to layout your level is something that I do. So I thought, OK, what
if we not only laid out the level in boxes, but
we actually took those boxes and we did something to them to
actually make them look good. And actually not have to
then model a landscape, and just be able to use them as
pretty landscape art in game. So I'm going to show
you guys how I did that. So this is the
level mesh landscape that I'm just going to turn off. I'm going to turn on my level
prototype, which is basically a bunch of boxes. Oh wait, why is it not on? KYLE ERF: Oh no. PATRICK MCAVENA: Oh no! Why are my boxers
not turning on? Oh, no! Let's see. There's got to be some reason. It's always fun to troubleshoot. AMANDA SCHADE: But
this is a good chance-- we're trying to
figure it out too, when things like
this happen to you, what is your approach
to figuring it out? PATRICK MCAVENA:
Yeah, it's good. OK, so this says the
visibility is on. But it's not, because
I don't see it. You know what I'm
going to do in this? I have another level
that I can open. KYLE ERF: Yeah, I was just going
to suggest like, hey, let's go to the other turkey
that's already been cooked. AMANDA SCHADE: They're
suggesting press G. PATRICK MCAVENA: Oh, yeah. G's a good one. Let's see, these cubes. Poor visibility. OK, there we go. OK, so this is the actual
level that I laid out just using cubes. As you can see, it's not as
pretty as what I just had. So what I did was-- I'm a big Houdini user, so I
actually utilized the Houdini engine plug-in for Unreal. And I basically have an HDA
file, Houdini Digital Asset, and I basically tell it, OK,
take all these pieces of cubes, or whatever type of static
mesh I want, and then run it through these
series of operations. So to show that a little
more interactively, I'm going to open
up another level. But before I do that, again
this is the end result of taking all those boxes. And I didn't end up
modeling anything else, I obviously added in a
lot of props and stuff. But the actual landscape,
this is what you end up with. But to demo the actual tool-- So this is a very simple level
with just a couple of boxes. But let's say, OK,
this is a cool level. Maybe I land here, and
go up, or whatever. I click on this HDA file. Basically the way
it works is, I just basically add in all the
static meshes I want. And it basically will
Boolean them all together. It will re-mesh
them appropriately. And then add in a couple
of different types of procedural noise. And do some bubbles. And it will also add in
some vertex color based on the normal slope,
to get the nice color stuff that I want for some
of my masks I have going on. So for example, if I
move this box out-- it has to turn on the plugin. Just a second. Normally you don't
have to do this part, but I forgot to turn it on. OK, it's actually pretty quick. OK, so now you see,
OK, it updated. And these blocks, this
is ugly right now, but you can imagine if you
actually laid out a level and massaged it a bit, you could
get something that's actually usable, and you
wouldn't have to rely on another person or
yourself to do another step to make the landscape look good. If I click Play I got
all my collisions. And yeah, it's a pretty simple
tool, but it's pretty powerful. And we're definitely
using it quite a bit. AMANDA SCHADE:
Yeah, that's great. KYLE ERF: It's pretty-- frankly it's amazing. I had nothing to do with that. I was begging Patrick for a long
time to make it just do this. And then one day he just
showed up at work and is like, hey, look at that. AMANDA SCHADE: Yeah,
I feel like that makes iteration and change. And it's like, oh, if the
level doesn't feel quite right, you can make these quick
adjustments that aren't hours of work or anything. PATRICK MCAVENA: Anything
to save you time. And there could be certain
circumstances where we might do something like
a custom mesh, or landscape, or whatever. But for the look of our game
and what we have going on, this seems to really work
for us, for the most part. AMANDA SCHADE: That's great. Anything else you
want to show off? KYLE ERF: I think. I think we're good-- PATRICK MCAVENA: Kyle, did
you want to show anything off? KYLE ERF: --on demo stuff. AMANDA SCHADE: OK. KYLE ERF: I don't have anything
that interesting to look at. So I think that's a good place
to sort of cut to questions. I will say our game, just for
reference, Shoulders of Giants, part of it is we deal
with multiplayer, and we use the gameplay
ability system. If people have specific
questions about that in chat, I can talk about it. But I don't have a demo. So I'm not going to
just bucket off time to be like, look,
more Blueprint nodes! Yeah, any questions
about what Patrick just talked about, or the
game, or kind of anything at this point. I think we're open to. PATRICK MCAVENA: Yeah, totally. AMANDA SCHADE: All right, so
it's open season on questions. They're wondering, OK,
going back to the materials that you were
working on, are you using instancing
with those materials, or how are you handling those? PATRICK MCAVENA:
Yeah, definitely. There's certain
subsets of things. Like for example this landscape. There's an instance
that I've made that I'll reuse for all the landscapes. Or like a rock. You know, there might be
some different properties that I want. So yes, I'm definitely using
instancing when appropriate. And kind of different foliage. I'm using the same base
material class for. And that's definitely a
very, very handy thing to do. AMANDA SCHADE: OK. Mitch was wondering, regarding
the Houdini pipeline, does the HDA assign the
materials based off the vertex color through a
string path to Unreal? It is a very specific question. PATRICK MCAVENA: So there's
one-- no, it doesn't do that. I'm familiar with what
you're talking about. For my purposes, I would
actually just use one material, and inside of that material
I'm just using the vertex color as a lerp between different
colors or textures that I have. AMANDA SCHADE: Gotcha. KYLE ERF: I think
I understood that. That's smart. I like that. AMANDA SCHADE: Let's see. I think this was
related to Dodo Peak, but I think it could also
be applicable to Shoulders of Giants. How do you go about determining
who your audience is? KYLE ERF: Oh, boy. PATRICK MCAVENA: That's
a very good question. That's very-- KYLE ERF: That's
another one of those where, if I knew the answer,
you'd be on my live stream. PATRICK MCAVENA: To
be honest, one thing that is really
helpful is, I mean you have an idea for
who your audience is. But generally-- I'm
not an expert on this, but we try our hardest
because we have to. But actually, seeing people
play it, like at events-- obviously, right
now it's hard to do. But we did actually do an
in-person event in August. And we actually,
for the first time, got real strangers
to play our game. And I think from
that, you can really learn a lot about who
really likes your game and who's not liking it as much. And for me personally, I think
that is a very, very valuable tool to figure that out with. AMANDA SCHADE: Well
I think that leads a little into play testing too. How do you go about
finding play testers? Is it always asking-- because we encounter this
even with Game Jam games. Like if you play your
own game, sometimes the difficulty is not quite
adjusted to other players, or what they can experience
or are capable of. That learning curve is steep. So is it mostly
friends and family? Do you connect with
circles-- obviously, in the world of conferences,
you could take a booth and have people play it there. But in lieu of that,
what do you do? PATRICK MCAVENA: Yeah,
that's a good question. I mean I think, for
us, we obviously have game developer friends. And it's cool to
have that feedback. But I find that people that are
non game developers, generally their feedback is, I think,
more relevant normally. So of course, our immediate
go to is friends and family. We haven't-- aside from events,
we haven't done a lot of just getting strangers
to play the game. That's probably
something we're going to try to do more in the
future, like outside of events. But I know, Kyle,
what else do you have? Do you think about it? KYLE ERF: Yeah, I think one of
the realities of being a team-- like the core of our
company is two people, and then there's other
people who are really involved in the project. But we're so small,
we don't have a huge network of play
testers to bring in that we don't know, outside of events. So friends and family are great,
people at game development events are great. But like Patrick
said, you can get feedback that's a
little too, like, "this is how I would
make the game." Which can also be
very useful if it's like someone who's really
good at game development. But, yeah, just friends
and family unfortunately. We'd love to ask that question
to someone too and get an answer of how to find
people who you don't know who will play your game in a
secure and reasonably priced way. PATRICK MCAVENA: I think there's
one other small thing that I can add. And that's that I think there's
two different types of play testers too. It's like the person that's
never played the game before, so it's super fresh, and
that's very valuable. Because obviously your
players first experience is the most important part. But then it's also
interesting to get-- we have a couple of
people who play the game throughout development. And they have a unique
perspective too. And I think trying to get both
of those sets of perspective is important, if you can. AMANDA SCHADE: Oh, totally. I mean the new players are
the ones that will teach-- there's that sort of tutorial,
or the on-boarding experience at the front of the game. And if you have folks
that have played it, they kind of know
what to expect, or they know how to get in. Even if you make some changes,
you'll see sort of their shift. But that's still not the same
as a brand new, somebody that's never played the game before PATRICK MCAVENA: Yeah,
a fresh set of eyes. For sure. AMANDA SCHADE: Again, I think
this does go back to Dodo Peak, but could apply to both. So Rare Bird Games is asking,
what was the one thing-- and there's probably many-- that you found helps you
optimize your frame rate? KYLE ERF: That's
a great question. PATRICK MCAVENA: We probably
both have, maybe similar-- But I will say, from my
perspective, the first thing that I always try
to do is figure out if it's GPU bound or CPU bound. So I do the stat unit command. And if it's CPU bound,
then I talk to Kyle, because he is more involved
in that stuff than I am. And so far on our projects-- So we did initially
do some builds. Like we wanted to see how
it ran on mobile devices. In that sense it was
actually GPU bound. So we had to go in there
and kind of just one by one, OK, just turn things off. You know what I mean? Like turn different
features off. Turn the post-processing
off, turn off shadows. Get more aggressive
with your LODs. I think there are some
GPU debugging tools, like Xcode and stuff. But just that kind
of basic thing. Just turning
different things off and seeing how it affects their
frame rate is really important. And then obviously,
if it's CPU bound, Kyle, what do you use for that? KYLE ERF: So in
terms of tooling, the profiler is
your best friend. It's like developer tools. Oh my God I just forgot
everything I ever knew. Session front end. I'll see. I have that up on my screen. I don't think anything
useful will happen there. PATRICK MCAVENA: Do you want
to talk about the enemy health bars as like-- KYLE ERF: Yeah, so I
was going to get to-- my editor froze and my brain
froze at the same time. So the main thing
is, make good things with the profiler in Unreal. And I am not super qualified to
give a good tutorial on that. But basically you can record
things in a development build of the game. Or also just in editor, which
you generally shouldn't do. But in our case, we've
actually had almost all of our performance issues
with Shoulders of Giants have been like the
editor being weird. PATRICK MCAVENA: Yeah, the
build was fine, but the editor-- KYLE ERF: Maybe you
have to build it out. And everything is fine. PATRICK MCAVENA: Yeah. KYLE ERF: So in that case,
profiling in the editor is actually kind of OK. You just need to look
for the game thread. But this is all a long
way of saying the issue is almost always slate. It's pretty much always
something with slate, unfortunately. PATRICK MCAVENA: It's like
something that you normally wouldn't-- for
example, it'll ask, oh, is the light dark transition
effect, how expensive is that? Well, I would think
that it would be. But in reality it really wasn't. But what was
bottlenecking us was, we have these 3D widgets
over the top of the enemies. And actually that was
like really slowing it down a crazy amount. So it's not always
what you think it is. So that's why profiling is
really important to tell you exactly what's wrong. KYLE ERF: If we
cut to my screen, this is the most expensive part
of Dodo Peak, is the main menu. It's literally just all of these
main menu widgets, that all, I believe, TIC, because
that's how we wrote. It should all probably
be event driven. And that would
have helped a lot. But just having all
of these widgets. Like that is crazy. PATRICK MCAVENA:
You can really get-- KYLE ERF: The game would
run 60 on everything. PATRICK MCAVENA:
You can make widgets that are not very performative. Very easily. And so you definitely have
to be careful with that. KYLE ERF: And if this is
how you learn to program, you're going to do it that way. So that was it. I ended up writing
a really hacky thing because time was
so of the essence, that it basically just
turned the TIC off for things that were off screen. But anyway, same thing
in Shoulders of Giants. Enemy health bars where what
was slowing down the game. It was GPU-- It was CPU bound because we were
re-rendering the health bars of all the enemies every tick. PATRICK MCAVENA: And updating
all their information. KYLE ERF: Yeah. Still haven't fixed
it to be event driven, I just made it so
it runs off a timer and just does it every
second, or something. As a workaround for now. But slate tick will kill
you, is my big weird answer to that question. It was never pathfinding. Sometimes AI in
Shoulders of Giants can be a little expensive,
but it's so far always been slate ticking. AMANDA SCHADE: Well, I
say tick will get you. It's definitely a
much safer way to go. Kind of speaking
to some of that, you're talking about learning. Where did you all kind
of take your approach to learning Unreal Engine,
and where have you found some of your best resources? And then at what point-- following up on that--
at what point do you decide that it's actually more
valuable to bring on somebody else that maybe has
experience there, versus buckling down
and figuring out that system for yourself? PATRICK MCAVENA: That's
a really good question. I think for me, I didn't have-- there's one part
of game development which is art, which I
had a big background in. But the other component,
like programming, I didn't really
have any experience. So I felt like in order
for me to learn on Unreal, I wanted to get better at the
part that I wasn't good at. I'm still not nearly as good
at it as someone like Kyle, but I can at least understand
it and do some of it now. But when I was learning
Unreal, frankly I just watched a lot of your
guys' YouTube videos. And just like some general
YouTube programming information. But then to answer the second
part of that question, which I think is really
important, which is when do you identify
bringing someone else on, or collaborating? I think different people
work in different ways. I really like working
with other people. And I feel like it's good
to know your strengths and weaknesses. So like I was saying, I'm better
at the art aspect, but not the programming aspect. So if you can find someone
that can help with the part that you're not as
good at, or that you don't like doing
as much-- that's the other important thing. If you're really not
good at something, but you really like learning
it, that's cool too. And that's incentive to
try to get better at it. But if there's a
part you don't enjoy, and you also feel like
you're not good at it, then that can be an
important opportunity to try to find someone
that could help you. KYLE ERF: I'd echo
basically all of that. AMANDA SCHADE: Perfect. Good, you're in alignment. Based on the idea of things
that you like and you don't, how do you stay motivated? It can be a long process, right? Making a game. And there's a lot of
challenges and hurdles to overcome in development. So how do you stay creative? How do you stay motivated
throughout the process, and keep at it? KYLE ERF: I can
speak for myself. I think trying to be--
there's so many different ways to answer this question. The first thing
that comes to mind, because it's been a
pretty tough month for us just in terms of things
move in fits and starts. And also just working, trying to
get alpha together pretty soon, and also putting together stuff
for this awesome opportunity to talk to you on
this stream, Amanda. But all of this is to say,
you can get tired doing this. And I think it's
important to take breaks if you have that luxury. I realize not everyone is
in a job where that's always an option. But, boy, you can resent the
coolest thing in the world, if you overwork yourself on it. PATRICK MCAVENA: Yeah. That's definitely true. KYLE ERF: So I just want
to open saying that. I think it's also important to-- if some problem is giving
you so much trouble-- like if there's a project
you're working on, or a small task that
you just can't get done, put it down and
do something else. I try, personally, to get one
notable thing done every day. And then after
like a year, that's like 300 significant
things you've done. That's a gain. So I've lost a whole day
on debugging something. And that feels awful. And rather than
spending the next day, I might just move on
to something else. PATRICK MCAVENA: Yeah I
think it's good to have-- I think what helps
me, like Kyle said, definitely don't want
to overwork yourself. But if you can set little goals,
once you accomplish something that you wanted to accomplish,
that can feel really good. And that can help motivate
you to get to the next thing. And it's also good to
break them up into-- like, oh, I want
to finish the game! But that's the finish line. This is a marathon. You got to think, OK, I want
to get it to run on my computer without crashing. Or I just want to get a build
that I can share to a friend. Or something small like
that, that you can accomplish in a day or two, I think goes
a long way into keeping you motivated for the long haul. AMANDA SCHADE: I think
those are great tips. So it's fantastic, for the folks
that are working on projects, find ways to take breaks. If there's a part
of your project that's not exciting, or not
encouraging at the moment, find something to reignite
that spark, and then come back and face that. [? MrJohn10.LWebb, ?]
is wondering how large is your game
dev team at this point? PATRICK MCAVENA: So
right now there's four of us on
Shoulders of Giants, and we're adding a fifth
person to the team shortly. AMANDA SCHADE: [INAUDIBLE] KYLE ERF: Yeah, it's like
a 25% increase, actually. PATRICK MCAVENA: That's true. So that's going
to be big for us. So we're going to have
to figure that out. Going to have to do
some more production management, for sure. KYLE ERF: Yeah. That's 100% true,
weirdly enough. You know, when it's
two people, again, you can just bounce ideas. Two people you can kind of
manage the same as one people. You can just kind
of bounce ideas, and have sort of a group mind,
but once you have a remote team with five people-- we're going to be upping doing
check ins and things like that. But it's five people
core, and then we also have some
contractors we know who have helped with specific
things here and there. AMANDA SCHADE: Gotcha. Let's see. [? Andrej ?] was wondering if
you have ever found that you were able to C++ your way out
of a bottleneck, or something, with Blueprint instead? So have you felt like you're
kind of hitting a wall with something in Blueprints,
and then moving over to C++ actually helped you solve
or accomplish what you were looking to do? KYLE ERF: That's-- I think-- so, kind of? This, again, speaks to-- for
better or worse the stuff we work on has been
fairly simplistic in terms of what the gameplay is. We're not simulating
an economy, we're not running some sort
of like Nemesis system. We're just go to the place-- PATRICK MCAVENA: It's
not like a crazy amount of dependency or anything. KYLE ERF: Yeah, I mean
the Dodo Peak gameplay loop is the amount of features
of like an '80s arcade game. It just looks really,
really, really nice. PATRICK MCAVENA: I will
say, from my perspective like I was saying in the
early part of the talk, I started Blueprinting
the enemies in Dodo Peak. And then I eventually
rewrote them in code. And that process
actually helped me a lot. I don't know if it was as much
just rewriting it in code, but it was kind of an
opportunity to totally refactor the whole thing. And that I think helped
the process quite a bit. KYLE ERF: Yeah. And I will say, this is kind
of doing offloading C++. Just make use of the
nav mesh if you can. Like if you have a
game with pathfinding. There's different ways that
someone might hack together to find a random spot
to spawn something. And there are just
hooks that are like, find a random spot on the
nav mesh within a radius. Like there's Blueprint
nodes that do that. And those are obviously
calling out to C++. And it's way faster
than shooting out a bunch of random line traces
to figure out where to go. Which is something I
did before realizing there's a better way to do it. So it's stuff like that. Make use of the
systems in Unreal that are already there for you. AMANDA SCHADE: Absolutely. [? Bett33 ?] is
wondering how you handle the music for the games. PATRICK MCAVENA:
It's a Good question. So for the first game
we have a good friend of mine, Nathan McKee,
who's the composer. Who I actually played
in a band with. And he did the music for
my other collaborator, James's, first app. So that was a pretty easy pick. We're actually still
figuring out our music plans for Shoulders of Giants. So we will keep you
all posted on that. AMANDA SCHADE: All
right, well I guess we'll stay tuned
@ShouldersOfG on Twitter. So keep an eye on it. They're wondering,
with remote teams, how do you allow people to work? What was your process,
working together remotely, sharing different
project pieces, and concurrent
development, and all that? PATRICK MCAVENA: Yeah, you
want to take that one, Kyle? KYLE ERF: There's so
many angles to this. So Shoulders of Giants
has been in development in one way or another
basically since exactly when the pandemic started. We didn't plan it that way. But that was sort
of a thing that-- PATRICK MCAVENA: Yeah, we did. We planned it. To develop a game
during the pandemic. KYLE ERF: We actually--
well, we had a game, and we knew we should
probably have a pandemic. So I got working on that. PATRICK MCAVENA: We should
wait until a pandemic, yeah. KYLE ERF: Patrick was
starting work on-- we were doing a
prototyping phase. And we didn't really know-- Shoulders of Giants was
just one of many ideas that we were working on. And during that time I
was also porting Dodo Peak to the Nintendo Switch. Or I shouldn't say porting,
it's the same game. I was making it run on
the Nintendo Switch. And so that was a bit of a mess,
because dev kits are a thing. If you're fully focused
on PC, it's pretty easy. But we also have a studio full
of Apple hardware for quality assurance on Dodo Peak. So luckily we're a small team,
and we could go into the office if we really needed to. PATRICK MCAVENA: And luckily,
when we were doing the Nintendo Switch development, at the time,
Kyle lived two blocks from me. So it was pretty
easy to actually physically move the development
stuff back and forth. KYLE ERF: Yeah, I could
just hand it to him, and be like, figure out what
values make this look good. Like just hand it off. Not everyone has that luxury. There's a lot of remote
desktop stuff that happens. Yeah, it's not easy. PATRICK MCAVENA:
I think especially during the beginning
of a project. Like during the
brainstorming phase, it can present some unique
challenges, for sure. KYLE ERF: Yeah, like in addition
to just daily stand-ups, or check-ins, or whatever
you want to call them. I think it's really useful. Like Patrick and
I both contribute, I'd say, equally to the creative
vision of Shoulders of Giants. And being able to even
just open up a call and just talk for an
hour, that's so huge. PATRICK MCAVENA: Yeah,
share your screen. KYLE ERF: Just being able
to bounce ideas around. PATRICK MCAVENA: Yeah, exactly. KYLE ERF: I think
for a smaller team it's easier than moving like
an org structure of thousands of people to remote. Again, it's just kind of
like calling your buddy. It's tough, but also
it's not the worst. I don't know. AMANDA SCHADE: Well
they're also wondering, kind of digging into
that a little bit, like what source
control did you-- KYLE ERF: Oh, right! Yes. Great question. So Dodo Peak is on Get. That was, Patrick, I
think you set that up. Do you remember how
you came to that? PATRICK MCAVENA: Yeah, and they
told me to get out of here. KYLE ERF: Get is really good. So I worked in open source
software for a long time. And it is an amazing tool. It's not, in my opinion, not
especially good for Unreal. It doesn't handle
large files well. You can make it handle
large files well. GitHub is amazing. And that's what I think
people really like. But I'll save that
dumb nerd rant. Get is great, but we started
developing Shoulders of Giants on Get. And just the file
contention, like people modifying the same files
was so much of a thing. We ended up moving to Perforce. We host our own Perforce server. And that's been
really great for us. The integration is phenomenal. It's beautiful. We love it. So that's how we do things. And like I mentioned
before, we're always talking about slack. We have a Trello
for tracking work. We have a Gantt chart
for tracking schedules. And through some combination
of all of those things, the work gets around. Patrick, I know
the way art works is maybe a little different. Or like how people get-- PATRICK MCAVENA:
It's pretty similar. It's kind of like
just giving feedback. You know. KYLE ERF: Right. A lot of Google Drive. AMANDA SCHADE: Yeah. Lots of different ways. So I think that's
the curiosity too. Like which approach did
you find worked for you? Obviously it varies by team,
but always having the insight into what you found useful, and
other people can take advice from that. KYLE ERF: They got
to a point where I was offering to get James
and Pat like a steak dinner if they learned to use
Get on the command line. No one took me up on it. But boy, it was-- I will say, like if you
learn your tools, that's so much nicer to the
programmer who has to come over and help you-- Get is so complicated! Anyway, I don't want to
besmirch anyone on this stream. But it's very complicated. I made my living working on Get
related stuff for a few years. Like continuous integration,
but that's a whole other talk. AMANDA SCHADE: OK, going
back into something a little more inspirational. Thomas Franklin is
wondering what-- I think this goes
back to Dodo Peak, but I think it would be an
interesting question for both. What were your visual
styles pulled from? Or what inspired you
to go in the direction that you took on those games? PATRICK MCAVENA: Yeah,
I think there's probably a lot of different
things going on. I think, from my perspective,
I always, professionally, worked in photo-realism. So I really kind of got
bored of making things real. And I wanted to make something
that was more stylized. So kind of the look at both
of those games kind of fall under that. Just me as an artist, like what
I am like interested in making. But then our Art
Director, Max, I think we kind of found him
because that's his style. He's got this beautifully
illustrated, stylized, kind of modern aesthetic. And that really comes through. He did all the concept art
and really defined a lot of the look for both games. So big kudos to him. AMANDA SCHADE: Let's see. So Bernardo was
wondering, were there any beliefs about game
development that you found out weren't true? So things that you had general
assumptions about going into game development,
that once you're in it like, oh, it's not
like that at all? KYLE ERF: That's
such a cool question! PATRICK MCAVENA: Yeah, I mean,
I think everyone's situation is so different. But I think the thing
that everyone-- like Kyle and I both had jobs
where we made a living, unrelated to game development. And I think a lot of
people will tell you, oh, well if you want to be an indie
developer, it's not possible. Or you can't make a
living making games. And it is definitely
hard, but it's definitely possible as well. And I think Kyle and I really
try to not overwork ourselves, too. We try to maintain a balance,
like work, life balance. And that's something that I
think the games industry-- I think a lot of
people will associate crunch and all that stuff. And I think that's something
that, if you try to avoid, then it's definitely possible. But Kyle, what do
you think about that? KYLE ERF: I mean I
agree with all of that. I'm trying to think
of a different angle. I don't know. Multiplayer is not a checkbox
that you just turn on. Despite what Reddit
would have you believe. PATRICK MCAVENA: That's
actually a very good one. AMANDA SCHADE: Just
add multiplayer. KYLE ERF: Yeah,
it's just so easy. PATRICK MCAVENA: If you
want to add multiplayer, don't do it at the end,
because it won't happen. KYLE ERF: Yeah. I would definitely
recommend that. Wow. I feel like I have to
think about this question for a whole year. I think you don't have to
listen to everyone's feedback is one thing. PATRICK MCAVENA:
Yeah, that's true too. KYLE ERF: I don't know
if people say you should. But people will tell you
all kinds of bad advice. And people will give you
suggestions that are-- PATRICK MCAVENA: They
will also give you really good advice, but-- if there's a lot of
feedback that's similar, you know, OK, a lot of
people are experiencing this. So this is something I
should probably look into. But if you have the odd feedback
that you only hear one time, you probably don't need
to worry about it as much. KYLE ERF: Don't let it
get inside your head. You don't have to
do one thing just because one person said it. That sounds like
I have a grudge. I don't. I am not thinking about
anything in particular. It's just I could
definitely rabbit hole on that kind of thing. AMANDA SCHADE:
[? Sarah3D ?] was wondering, have you found it hard
to structure social media posts for the game as
you're working on it? They feel like they
never have enough to show off in development,
and I guess on that, do you have somebody dedicated? Or is it-- it's
you two, isn't it? PATRICK MCAVENA:
You're looking at him. With the glasses. KYLE ERF: Yeah,
I'm pretty online. I'm also a professional comedy
writer outside of games. So that's another thing
before I was doing this. So I'm very online. I do our posts. We never do them enough. We're all so technically-- PATRICK MCAVENA: It's hard. It's so hard to
make enough content. Like I'll make a
lot of the content, and then Kyle will decide how
to show it and when to show it. And we'll actually show it. And also obviously
make other stuff too. But it is a lot of work. And it's hard. I think it's definitely
going to be a challenge to make meaningful posts. And deciding when and how
often and what type of things. It's not easy. KYLE ERF: Yeah. Some things I'll
just throw out there, every platform's different. So we mostly stick
to Twitter and-- that's actually kind of it,
in terms of social media right now. Twitter and Reddit. Everyone has their own scales. Like some people really
love starting at Discord, some people do a lot on Imgur. But Twitter's where I live,
and I'm the person doing it, so that's where we are. There's a lot of game
stuff on Twitter. I will say, first off, where
we are in marketing now, we kind of have only
soft announced the game. Obviously we're here
talking about it. But we have not done
a huge campaign. We haven't announced
any platforms, we don't have any
wish list you can do. It's just something
we put out there, partly to see if people
would be interested in it. And that was a big thing. Like if you had talked
to us in February, we wouldn't be sure if we were
making Shoulders of Giants. It was just the biggest
prototype we had. So in that way, putting
it out on social media was great, because it showed us,
oh, people want to play this. And also people
really like frogs. PATRICK MCAVENA: It's
an important tool. Kyle, like you said, I
think you can use as-- if you show something a bit
earlier on, and do some posts, you can kind of generally
see if people are feeling it. Or maybe you want to go
back to the idea, or not. That's something we
tried to use it for. And I think it was
successful in that sense. KYLE ERF: Yeah, I'm
happy with how it's gone. But it's a constant struggle. I know everyone's
like, you've got to hit up Screenshot Saturday. And people look at
Screenshot Saturday. But Saturday it turns out
is actually a terrible day for social media in general. So you're only going
to get the people that look at Screenshot Saturday. It's like an endless
array of things to get very beaten down by. And my advice, that I haven't
taken is just be consistent. PATRICK MCAVENA:
Yeah, that is true. AMANDA SCHADE: That
is very important. I think that's one
of the things we've talked about during the
whole stream on here. Just sitting down
with teams and talking about social strategies. KYLE ERF: That would be
great two hours just on that. AMANDA SCHADE: That would
be whole side thing. So [? DJV808 ?] was
wondering, as an indie studio, how do you go about
recruiting new talent? KYLE ERF: Oh, how timely. PATRICK MCAVENA:
That's a good question. My background, I was
a freelance 3D artist for a really long time. So I do know a lot-- I have a network of
people from the art world that we work with. But for the first
time we actually did make our first
ever job post, and we got a lot
of people that way. And it's definitely challenging
to find the right person. And I think, obviously,
you use your network. But also you always want to
expand your network, too. And there's events. We've had people that have
come up to us during events, so we've actually hired
some people that way too. Like we met a really
good animator at PAX and worked with him quite a bit. I don't know, do you have
anything else to add, Kyle? KYLE ERF: No, not really. Specifically if
people are curious, we had to a post, yeah,
and worked with indies, and also just promoted it
around our networks on Twitter. It's really hard to
find people in general. I'm sure the person asking
the question knows that. Just internal
recommendations for people is always, in my
opinion, the most useful. PATRICK MCAVENA: Yeah, if
you can get a recommendation, that is really good. KYLE ERF: I worked in
hiring for a long time. Like literally, I
worked on hiring-- the systems of hiring
at a big tech company. And we did a lot of research
on interviews and hiring, and the sad takeaway
was it's really hard to predict how good someone
will be based on an interview. So knowing people-- knowing
people that other people think are good is very useful. But can also
perpetuate all kinds of awful systemic problems. So I don't know. I have no idea. AMANDA SCHADE:
But basically it's like, yeah, it's been good
encounters with people at conferences,
sometimes it's listings. I think another way to go is
finding the communities where the people you're trying
to hire are, right? Like if you're looking
for an animator, going to an animation network. Or Polygon would be a
great place for 3D artists. So finding the communities that
those folks spend their time in, and seeing if you can
see some of their work, or can you see if
they're looking for jobs. Or things like that. [? 2020HonestDanGames ?]
was wondering how do you manage versions of the engine? Do you always upgrade
to the latest? Or settle on a release and
sit there for a little while? KYLE ERF: That's a great
practical question. So for Dodo Peak we
updated pretty regularly. And we're always quick to check
preview builds, especially the first year of Apple Arcade. There were some fairly
significant changes to Apple APIs. And the easiest
way to get those in is to just upgrade the engine. Which is scary. I don't have any advice
on upgrading the engine, other than make sure
you have a backup. Clearly if you have
version control, that should be like a
thing that you can just do. But if you don't, make
sure you have a backup. PATRICK MCAVENA:
If you upgrade it, make a build on your platform
to make sure everything still works. KYLE ERF: Yeah. And you have to,
unfortunately, every time you upgrade you have to do
a full QA of the entire game because, like, oh, now
Arabic doesn't work. Like anything can go wrong
after you upgrade the engine. Like any API might have changed. So we typically,
until very recently, we were upgrading to every
single engine that came out like the second it came out. Just out of necessity. Shoulders of Giants I
believe is still on 4.26. Not for any reason, we
just haven't done it. We have been pretty lucky
with upgrades, where things haven't gotten too crazy. But we'll upgrade
it at some point. AMANDA SCHADE: If
it's working, right? And there's not-- KYLE ERF: Yeah exactly. [INTERPOSING VOICES] AMANDA SCHADE: Yeah. Let's see. As an indie studio, or
an indie company-- this is from [? Dorlan-- ?] what do
you do to try and stand out? PATRICK MCAVENA:
It's a good question. AMANDA SCHADE: I know. Chat's been really, really
thoughtful this week. I love it. PATRICK MCAVENA: I think you-- how can I answer that? Obviously it's like we want
to make something unique. I think for games in general,
just the way that people see them, it's so visual. People see the screen shots. They'll read the copy of
the description of the game, but if you have a really
good screenshot that has some unique art-- or people
can kind of imagine, OK, maybe there's a unique story,
or unique gameplay. Like if they can look at
something and kind of infer what it is and feel
gravitated towards that, I think that's the
most important thing that you can do to get people
interested in your game. But I don't know exactly
the magic formula for that. KYLE ERF: Once again,
if I could just answer that perfectly, this
would be our live stream. But to answer your question
from a different angle, also in terms of getting
yourself stood out by others-- developing relationships, both
with other game companies, but also with any middleware
or platforms that you use. So we've had a pretty
long-- despite being a tiny studio-- we've had a very
strong relationship with Epic Games. And you can be on
a stream like this, if you've been doing stuff
and showing off the engine, and writing blog posts. And everything. And showing people that you
can make a game that looks like a cartoon with Unreal. So build those relationships Patrick's done
streams for Houdini, because he's so
cool at that stuff. And so even though we're
a small indie studio, it'll be Insomniac, and like
another triple-A studio, and then him. And that's super cool. As someone who's kind of on
the outside of that to see. So showing off your skills
and developing relationships with other companies is the more
practical advice I can give. Like, just put
yourself out there. Community managers and
evangelists are always people who are being positive
and have cool stuff to show, because that's kind of your
job is to find that stuff. So make it easy to find,
and show it to people. And develop those relationships. AMANDA SCHADE: Thanks
for making my job easier. Really appreciate it. You guys have cool
stuff to share. It's great. I have one question
that I would like-- this is going to be our
last question for today. And from [? Pinnel? ?] I don't
know how to say their name. Sorry. What do you like most about
your game dev experience so far? KYLE ERF: Oh wow. PATRICK MCAVENA: That's
a really good one. KYLE ERF: That's
a good question. PATRICK MCAVENA:
I can personally say that the
coolest thing for me is just to be able to make an
idea and have it come to light. And have people play it. And not everyone likes it,
but at least some people. That's definitely the most
rewarding part for me. Just being able to work on
something that you're really into and that you're
really excited about. KYLE ERF: Yeah, I
would echo that. And then from the
indie perspective. Like being on this
journey with Patrick for the last two
and a half years. I love being in a position
where we're making our thing. Having worked at big
companies, or stuff like that, before this-- having control over my own life,
even though it's a lot scarier, is really cool. And I think that's something
that a lot of people are fighting for in their lives. And I feel extremely
privileged to have even a modicum of that in mine. AMANDA SCHADE: Oh,
that's wonderful. Well I'm glad this
journey has been exciting, if not scary sometimes, for you. But Dodo Peaks is awesome. And I hope you all at home
will check it out and give it a download. Check it out. Your endless runner mode is-- this year, right? It was released early this year? PATRICK MCAVENA: Yeah. Yeah, early spring, I think. AMANDA SCHADE: What it's time? You know? PATRICK MCAVENA: What is time? It's still 2020 as
far as I'm concerned. AMANDA SCHADE: So
you can see more about Dodo Peak at dodopeak.com. Your website itself
is MovingPieces.io. And then you can find
Shoulders of Giants there. [? Skye's ?] doing awesome in
linking these all in chat too. So you can also follow
on Twitter @ShouldersOfG. Is there anything you'd like
to leave them with before I do my little outro spiel? PATRICK MCAVENA: Just wanted to
say thank you so much, Amanda, and thank you all for watching. KYLE ERF: Right. PATRICK MCAVENA: We're still
pretty new to this whole game development thing. So thanks for listening
to what we had to say. And hope you guys all
got something out of it. KYLE ERF: Thank you. AMANDA SCHADE: Well
thank you both so, so much for joining us today. It's really nice to sit down and
just hear about your journey. A lot of times we're
diving into the editor and getting into
the nitty gritty, but this has been a little
bit of a change of pace. But really wonderful. And again, your effects
are still really awesome. So getting to see a bit of both. Make sure to follow them. Keep up on their awesome work. We're really, really
excited to see your progress on Shoulders of Giants. From the Unreal Engine
side, stay up to date on everything Unreal
Engine at UnrealEngine.com. We're on all the social
channels, slash, Unreal Engine or @unrealengine, whichever
sites are following that way. If you're looking for people to
talk to, or you have questions, always hit the forums
.unrealengine.com. This spot, if you need
to go back and see how they were making
those effects, or want to review
some of our questions, you can always watch them here
on Twitch, or at our YouTube channel. So we have a little
survey if you want to let us know what
you thought of the stream. If you're interested
in sharing with us requests for future events. And next week, I think we have
Intel on to talk about TPA. Get ready for that. So thank you so much
Kyle and Patrick, this has been wonderful. PATRICK MCAVENA: Thank you. KYLE ERF: Thank you. AMANDA SCHADE: And everybody
for all the great questions this week, they were really
phenomenal out there. Thanks, and have a
wonderful week everyone. PATRICK MCAVENA: All right.