Subscribe to GameFromScratch on YouTube Support GameFromScratch on Patreon
8. April 2014

 

Unreal shook the indie game developer world up recently when they announced they made Unreal Engine 4, with complete source code, available for $19/month as well as a 5% royalty.  I assume some of you are wondering what your 20 bucks a month gets you.  Well this post is intended as an overview of what is included in Unreal to help you decide if you will take the plunge.  By no means is it intended as a review, although I will make a few comments about quality where applicable.  Alright, lets jump right in!

 

Welcome to the Unreal Portal/Getting Started

 

Once you’ve signed up, entered and confirmed your credit card information, you will now be able to access the Unreal Engine portal.  This is where you can go about downloading Unreal Engine and access the community, wiki, source code and documentation, more on that later.

image

 

Click the download link to the right to download the downloader.  This initital download is quite small but that’s only just the beginning.  Now the proper download begins.

Unreal2

 

The initial download is about 7GB, the first patch was 4GB.  Fortunately download speeds are great, even on day 1 I got enough bandwidth to max on out 50MB connection.

 

Each time you launch UE4, you will be prompted for credentials.  ( Haven’t used Offline mode yet, so you shouldn’t require an online connection like CryEngine ).

image

 

Then once again back to the launcher.  This is a combination of news, community portal, marketplace and quick launch.

image

Coincidentally, in Windows 8.1, for some reason none of the news links actually work for me.  You can see down the left hand side there are a number of projects listed under My Content.  Most of these are actually freely available templates you can get from the marketplace.  Each of these is a one level game demonstrating a different concept, be it 2D, 3D, Blueprints, C++ coding, etc.  They range in size between 20MB and 800MB.  They are found in the marketplace:

 

image

 

There’s tons of high quality starter content here and right now almost the entire thing is free.  However, you can see the beginnings of a Unity style marketplace is planned if you look under the coming soon section, you can see a gun based asset pack that is going to be for sale:

image

 

Hopefully this is opened up to the community and becomes a viable competitor to Unity’s Asset Store.  Now let’s fire up the main editor.  See that big yellow LAUNCH button, yeah, that’s how.  I’ll open it up with the Strategy Game template, on of the more complex samples.

 

The Main Editor

 

This is where the magic happens and in a word, it’s polished.

image

 

Perhaps most impressive, notice the Play button in the top toolbar. at any time you can actually hit this and run your game directly in the editor instantly.

 

One word of warning here.  You level is basically running as a game in your engine at all times.  For most people this isn’t going to be a big deal, but to people like myself who develop on the go using a laptop it can be crippling if you arent near a plug.  The Unreal Engine is an absolute battery killer.  On my Windows laptop I can generally run Unity for 3 or 4 hours on battery, a bit longer if I try to stretch it out.  Unreal Engine on the other hand…

 

image

 

Ouch.  My 2013 Macbook Air faired even worse.  It went from fully charged to dead in just over 30 minutes.

 

That leads to an interesting question… how is performance, what kind of system do you need to use Unreal Engine?

 

Well the good news is you don’t need a ton of power, the tools actually ran on the Macbook Air, a 2013 Intel HD4000 GPU powered machine.  That said the experience certainly wasn’t ideal.  In all honesty, if that was my primary machine I would look elsewhere for an engine.  However on my primary Windows box, a Razer Razerblade 14” laptop ( i7, 8GB, nVidia 765m ) the performance is great, except of course the battery drain that is.

 

The editor itself is mostly for content placement, but there is a ton of power packed away.  Most tasks open up a dedicated editor of their own.  It keeps things uncluttered, but isn’t very alt + tab friendly for some reason.

 

Placing content is mostly a matter of drag and drop from the content browser to the scene.  Speaking of Content Browser, here it is:

image

Makes it easy to logically organize all your various game assets.

 

On the right hand side of the editor is the context sensitive details panel as well as a searchable scene graph.

image

 

For level editing, UnrealEd has it’s roots as a CSG ( Constructive Solid Geometry ) editor and that functionality is still there.  Basically CSG modeling works by creating complex shapes by adding and subtracting simple shapes, here for example is a box cut from another box in the editor:

image

These days however, CSG modeling is rarely used, but can be used to quickly prototype a level.

 

Of course there is a height mapped landscape editor built in:

image

You can push/pull the landscape to manipulate it, use brushes to quickly instance geometry and texture the landscape.  OF course you can still drag/drop from the Content Browser to a landscape you’ve generated.

 

This of course only scratches the surface of what the Editor can do.  You can also define lighting, environmental effects, Nav mesh volumes, etc.

image

 

The Editor itself could no doubt fill a book, or perhaps many, but Unreal have done a very good job of compartmentalizing the details.  Until you need something, it’s mostly out of your way, and if you’ve worked in Unity or any 3D applications, it should become pretty quickly intuitive to you.  One thing I really don’t like however is the hold control to do model.  So for example, if you want to paint the geometry, you need to hold down the Ctrl button while left clicking.  It is counterintuitive to me.

 

Remember how I said earlier that the editor is composed of a number of different windows.  One such window is for editing Blueprints.   Let’s take a look at that next.

 

Blueprints

 

So, what exactly are blueprints?  Well if you’ve used prior Unreal engines, it is the replacement for Kismet.  If you are completely new to Unreal, think of Blueprints like a visual programming language.  It works a lot like the graphing functionality in most 3D applications.  Don’t dismiss Blueprints early either, they are surprisingly capable.  Many of the sample games you can download are implemented entirely in Blueprints.

 

Blueprints can be accessed with the Blueprints button in the main interface:

image

 

Each level can have a Blueprint that responds to a variety of events or you can create Class Blueprints, which are basically exactly like C++ classes, except they are implemented as Blueprints.

 

Blueprints open as a completely separate window, like so:

image

 

Blueprints can be complex beasts.  Here for example is the Blueprint for controlling the character from the blueprint example:

image

 

One annoyance I have is the lack of zoom granularity control.  Zooming to fit just what you want on the screen can be a chore as you under/over-zoom due to the lack of granularity.

 

Think of Blueprints like massive flow charts that control, well, just about everything in your game.  Most classes and their properties in the game are exposed as Blueprints and you have a large library of functionality available to you.

image

 

This post is starting to get a bit long so I am going to split it into two parts.  In Part Two we look at the C++ programming side of the fence, explore the documentation available, take a look at the source and the community available.

 

On to part two.

Programming


8. April 2014

 

One of the vaunted features of Unreal Engine 4 is C++ support.  How exactly does that work?  First you need to have an external IDE installed, either Visual C++ on Windows or XCode on Mac.  The Express version will work but the helper toolbar is unavailable.  It’s mostly just a shortcut so it’s not a huge loss.  Integration is pretty solid.  In the Editor in the File menu there are a number of menu options:

 

C++ Coding

 

image

 

By selecting Add Code to Project… you can easily create a new game object using a wizard like sequence.  You select the base class:

 

image

 

Name it and you are done:

image

 

Once you click Create Class, you will be prompted to edit the code:

image

 

You will be brought to your IDE of choice.  From this point on, its just like working with any other Visual Studio or XCode C++ project.

image

 

The result of your project is a DLL file, build as per normal and your game will update in the editor.  It’s only when adding ( like we just did ) a new class do you need to restart the Unreal Engine Editor.  Otherwise a simple refresh should suffice.

 

The actual C++ libraries are fairly massive and far beyond the scope of this brief overview.

 

Building Unreal Engine from Source

 

One of the big advantages of Unreal is you have complete access to the source code.  The code is available in multiple parts, a couple of zip files with most of the external dependencies then the remaining code is available of Github.  You have to associate your Github account with your Unreal account, but the process is basically instant.

 

The GitHub repository is about what you would expect.

image

 

The actual source isn’t that big, about 120MB, while the supporting zips measure in at a couple GB, but they shouldn’t regularly change.  Unreal make a bleeding edge release available for the brave of heart.

 

The actual process is about as simple as it gets.  You do a git pull, download and extract the supporting files into the same directory, then run a script that generates the project or solution file.  Then, in the case of Windows, simply open the SLN file in Visual Studio:

 

As you can see, the solution contains full sources for every tool in the SDK:

image

 

This is nice, when they say with source code, it’s the ENTIRE source, nothing is hidden from you.  On the other hand, have some patience, the build process isn’t exactly fast.  On my machine it took about half an hour, I cant even imagine how long it would take on the MacBook Air, probably a couple of hours.  Then again, I remember the bad old days of all day builds, so this is really a first world problem.

 

Have a fair bit of drive space available too, as building from source is going to require a fair bit of space:

image

 

I’ve only scanned the code but from what I’ve seen it’s pretty clean and well commented.  For the majority of devs, you probably wont ever need to modify the code, but being able to run it in debug mode is certainly invaluable.

 

 

The Documentation

 

A project like this lives of dies on it’s documentation and I am please to say Unreal Engine is well documented.

 

First there are a series of video tutorials.  Even without a membership you can check them out.  As of right now there are 64 video tutorials available.

The documentation is broken down like so:

image

 

Under the Samples & Tutorials some are currently just placeholders.

image

 

The Programming Guide is pretty comprehensive.

image

 

Reference documentation is again detailed:

image

 

They also provide the AnswerHub, a StackOverflow like portal for asking and answering questions.    As you can see from the screenshot below, answers come very quickly and devs are very active in solving problems.  If you run into a problem, you are very well supported:

image

 

In addition to AnswerHub, there is also a full Wiki:

image

Currently it is a bit sparse, but expect it to grow over time.

 

Finally there are the forums.  One of the nice things about having to pay to be a member is it gets the signal to noise ratio way down.  This means the only people on the forums are people that are using or evaluating Unreal Engine.

image

 

The forums are also very active and developers actively participate.

 

Summary

 

This of course only scratches the surface of the functionality available.  There shader support, skeletal systems, etc… all nicely integrated in the editor.  What I will say is I am actually shocked at the level of polish of not only the Engine and supporting tools, but also the community they have fostered and the level of support they are providing.

 

When I first downloaded UDK I was actually somewhat underwhelmed with what was included.  Level level of polish present in UE4 shows they are taking this release very seriously.  Don’t get me wrong, UE is NOT a beginner friendly product, this is some seriously powerful but also sophisticated tech you are being given here.  That said, Unreal have done an amazing job making it as accessible and well supported as I could have imagined.

 

Is it worth 19$ a month?  Most certainly, if only just for the learning experience it represents.

Programming


4. April 2014

 

When it comes to programming languages, I literally use dozens, but when it comes down to an all other things being equal decision my go to language of choice tends to be C#.  One of the big plus sides of C# is the wonderful LINQ ( Language Integrated Query ).  LINQ makes heavy use of lambda (closures) a feature lacking until recently in C++.  Now with lambda expressions part of the C++ language LINQ for C++ is now a possibility.  It exists as a single hpp file you add to your project.

 

If you aren’t already familiar with LINQ, here is a simple example in C#.  It’s a simple scoreboard that sorts the results by name, then by score, then totals and averages all of the scores.  As you can see, it’s a very compact and clean way to access data.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Entry
    {
        public Entry(string name, int score)
        {
            this.name = name; 
            this.score = score;
        }

        public string name { get; set; }
        public int score { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Entry> scoreEntries = new List<Entry>();
            scoreEntries.Add(new Entry("mike", 42));
            scoreEntries.Add(new Entry("bob", 99));
            scoreEntries.Add(new Entry("doug", 99));
            scoreEntries.Add(new Entry("steve", 12));

            var sortedByName = scoreEntries.OrderBy(item => item.name).ToList();
            Console.WriteLine("Sorted by score");
            sortedByName.ForEach(item => { Console.WriteLine(item.name + " " + item.score); });

            Console.WriteLine("\nSorted by name");
            var sortedByScore = scoreEntries.OrderBy(item => item.score).ToList();
            sortedByScore.ForEach(item => { Console.WriteLine(item.name + " " + item.score); });

            var totalOfScores = scoreEntries.Where(item => item.score > 0)
                .Sum(item => item.score);

            var averageScore = scoreEntries.Average(item => item.score);
            Console.WriteLine("\nTotal of scores == " + totalOfScores + " Average Score == " + averageScore);

            
        }
    }
}

 

Now let's take a look at the C++ version using cpplinq:

#include <string>
#include <list>
#include "cpplinq.hpp"
#include <iostream>


class Entry{
    public:
        Entry::Entry(std::string name, int score){
            this->name = name;
            this->score = score;
        }

        std::string name;
        int score;
};


int main(int argc, char **argv)
{
    std::list<Entry> scoreEntries;
    scoreEntries.push_back(Entry("mike", 42));
    scoreEntries.push_back(Entry("bob", 99));
    scoreEntries.push_back(Entry("doug", 99));
    scoreEntries.push_back(Entry("steve", 12));

    using namespace cpplinq;
    
    auto sortedByName = from(scoreEntries)
        >> orderby_ascending([](const Entry & entry){ return entry.name;  })
        >> to_vector();
        
    auto sortedByScore = from(scoreEntries)
        >> orderby_descending([](const Entry & entry){ return entry.score;  })
        >> to_vector();

    std::cout << "Sorted by name" << std::endl;
    from(sortedByName)
        >> for_each([](const Entry & entry){ std::cout << entry.name << " " << entry.score << std::endl; });

    std::cout << std::endl << "Sorted by score" << std::endl;
    from(sortedByScore)
        >> for_each([](const Entry & entry){ std::cout << entry.name << " " << entry.score << std::endl; });

    auto totalOfScores = from(scoreEntries)
        >> select([](const Entry & entry){ return entry.score; })
        >> sum();

    auto averageScore = from(scoreEntries)
        >> select([](const Entry & entry){ return entry.score; })
        >> avg();

    std::cout << std::endl << "Total of scores == " << totalOfScores << " average score == " << averageScore << std::endl;
    return 0;
}

 

A few obvious differences.  Cpplinq statements start with the from methods defining the type of data source to perform on.  In this case I used the default from() which takes a standard C++ STL type.  There are also from__array() and from_range() for working with arrays and iterators respectively.  Next the . (dot) operator has been replaced with the >> operator.  Of course the lambda syntax is different as well ( C++’s is much uglier ), otherwise at the end of the day, it is very similar to LINQ in both look and execution.

 

If you are new to C++ and are struggling to wrap your head around the uses for lambdas, give cpplinq a shot and you will quickly see their value!

Programming


3. April 2014

The move to Gradle has been for the most part a positive experience for me, except when it comes to IntelliJ on Mac OS.  There I ran into a few problems and figured I would share the troubleshooting I took.  Fortunately there was a happy ending for me.

 

The main problem I had was this:

NewImage

 

Before we continue much further, you will need to have a few things installed on your machine.

  • Java 7 JDK
  • Recent ( post April 2014 ) LibGDX nightly
  • IntelliJ 13.1 or higher

If you don’t, please install and configure them now.  Also make sure to set your JAVA_HOME variable after you install the JDK.

 

This error occurred when importing the gradle project into IntelliJ as described in this post.  Generally the most common cause of this error is a lack of Java 7, which RoboVM requires.  It’s important to note, this is the version of Java that IntelliJ needs to run using.  You can check the Java version of IntelliJ via the menu IntelliJ IDEA->About IntelliJ IDEA.  Like so:

IntelliJ About Dialog

 

As you can see, I am running JVM 1.7.0.51, but there is a very good chance that you aren’t even if you have it installed.  JetBrains currently have this to say on the subject:

At the moment all our products require Apple JDK 1.6 to be installed in order to run on Mac. JDK 1.7 from Oracle is not officially supported yet and has known problems that stop us from using it by default. Oracle JDK 1.7.0_40 has added support for Retina and works much better than previous versions on Mac. You are welcome to give it a try in case you have any problems with Apple JDK.

To force running under JDK 1.7 edit /Applications/<Product>.app/Contents/Info.plist file, change JVMVersion from 1.6* to 1.7*

 

So, your first step is to enable Java 1.7 ( Java 7 == Java 1.7, Java 6 == Java 1.6 BTW ). If you are unsure how to access the plist file, in Finder open Applications, locate IntelliJ, right click and select Show Package Contents. If you have Xcode install, you can simply double click the pList file. Edit it like so:

PListEditing

 

Now restart IntelliJ and check the about dialog, you should now be running Java 7.

 

Still not working?  Here are a few quick things to check.

Make sure your JDK is configured correctly.  In a terminal window type:

java -version

The results should look like:

NewImage

If you java version is showing as 1.6, but you’ve installed Java 1.7, chances are your JAVA_HOME variable isn’t set correctly.

 

Next check what gradle sees, change into your project root directory and type:

gradlew -version

The results should look like:

NewImage

Once again, verify that gradle is using the proper JVM.  Once again, I believe this value is driven by JAVA_HOME, but I could be wrong.

 

Finally ( and this was the ultimate problem for me ).  Load IntelliJ and make sure there are no Java 1.6 SDKs defined.  Warning, this will break any old projects that require Java 6 as this is a global setting.

 

In IntelliJ with a Project loaded, right click the project and select Open Module Settings

NewImage

 

First verify that the project SDK is set to 1.7 and then select SDKs from the side bar.

NewImage

 

If a 1.6 SDK exists.  Select it the click the - button.

NewImage

 

Now try the import again and IntelliJ should work just fine.

 

If it still doesn’t work, try running gradle from the command line.  If you get errors there, it’s not an IntelliJ error.   Also, it’s beyond my ability to help you, as troubleshooting Gradle problems is beyond my abilities ( or more accurately desires ).

 

So if you ran into problems getting RoboVM to work with IntelliJ, hopefully this guide proved of some help.

 

 

 


2. April 2014

Well, technically make that LÖVE, I don’t believe umlauts and URLs mix well.

NewImage

 

Anyways, LÖVE 0.9.1 was released today.  LÖVE is an easy to use Lua game library I featured in my Lua Game Engine Roundup a couple years back.  Details of this release are:

 

0.9.1's API is fully backward compatible with existing 0.9.0 games. Most of the changes are bug fixes, internal code improvements, and some API additions and updates to flesh out LÖVE's features, especially in the love.graphics module.


Here are some of the more interesting changes:


• Canvases can now be used with SpriteBatches, ParticleSystems, and Meshes. Canvases and Images are now both sub-types of the new Texture type, which those three things accept. SpriteBatch:setTexture (etc.) have been added, and SpriteBatch:setImage (etc.) is now deprecated, but not removed yet.


• Better support for retina displays in OS X has been added. To take advantage of it, you will need to enable the new "highdpi" window flag in either love.conf or love.window.setMode. When this is done on a compatible computer, the pixel resolution of the window will be double what the requested window size is. You will almost certainly need to adjust your code if you want to use this properly! The new function love.window.getPixelScale can help immensely.


• Canvases now have antialiasing support. You will need to request it when creating the Canvas, with the new function variant love.graphics.newCanvas(width, height, texturetype, fsaa).


• A new function Source:clone has been added. This lets you create multiple static Sources which play the same sound much more efficiently (in terms of loading time, memory usage, and code duplication.)


• Some nasty bugs have been fixed, including an off-by-one issue in Joystick:isDown, love.graphics.setCanvas breaking everything when love.graphics.setScissor is used sometimes, and 8-bit SoundData sounding completely wrong when loaded into a Source.

 

You can read the full release notes here

You can download love here.


AppGameKit Studio

See More Tutorials on DevGa.me!

Month List