Thank you for buying Unity 3.x Game Development Essentials

..if you haven’t then what are you doing here? probably looking for a good book to help you learn how to use Unity, right? Well in that case you’re still in the right place. Take a look at the link below to grab your copy!

http://www.amazon.co.uk/Unity-3-x-Game-Development-Essentials/dp/1849691444

But what is this site for? Well as with any piece of bleeding edge software, Unity is constantly being updated by its developers, Unity Technologies. Lucky for you, I work for Unity, and as such can keep up to date with upcoming changes in the software – and this site is designed to keep you, the reader, informed of what differs in the software, from the book you have bought.

The book, along with this site will give you an up to date method for picking up Unity from scratch, and running with it. Don’t know Unity? Unity is a game engine designed for ease of use and speedy deployment of awesome games across all current platforms including web, desktop, ios, android, xbox 360 and playstation 3. See the site here for full details – http://www.unity3d.com

Will Goldstone, Technical Support Associate, Unity Technologies

74 thoughts on “Thank you for buying Unity 3.x Game Development Essentials

  1. Great book Will, the added C# scripting is much appreciated!
    I wish more Unity books and resources used C# like this one, any recommendations?
    Thanks a lot :)

  2. I found this book to be an excellent resource to learn unity. Like Luke I appreciated your use of C#. I would love to have seen a chapter on mobile platforms like Android

  3. Hi,

    First of all Thank you so much for writing this book. I’m android developer and I want to create game with Unity3D. I have no background abut C#, Js and other Graphic environments such Maya. However, I have good background OpenGL ES.
    My question is do i need to learn above programming languages? May i use Java instead of C# or Js?
    Thanks

    • No – you’d need to make use of Javascript (Unity’s equivalent, anyway) or C# to control Unity’s API.

  4. Hey Will , got a situation here with the script of the animation of the door for the outpost in your book., here’s the error:

    Assets/Scripts/CharacterController.js(20,21): BCE0017: The best overload for the method ‘CharacterController.Door(UnityEngine.AudioClip, boolean, String, UnityEngine.GameObject)’ is not compatible with the argument list ‘(System.Type, boolean, String, UnityEngine.GameObject)’.

    then i click on it and sends me to this line in the code:

    Door(doorShutSound, false,”doorshut”,currentDoor);

    Here is my code:

    function Start () {

    }

    private var doorIsOpen : boolean = false;
    private var doorTimer : float = 0.0;
    private var currentDoor : GameObject;

    var doorOpenTime : float = 3.0;
    var doorOpenSound = AudioClip;
    var doorShutSound = AudioClip;

    function Update () {
    if(doorIsOpen){
    doorTimer += Time.deltaTime;

    if(doorTimer > doorOpenTime){

    Door(doorShutSound, false,”doorshut”,currentDoor);
    doorTimer= 0.0;

    }
    }
    }

    function OnControllerColliderHit(hit: ControllerColliderHit){

    if (hit.gameObject.tag == “outpostDoor” && doorIsOpen == false){

    currentDoor = hit.gameObject;
    Door(doorOpenSound, true, “dooropen”,currentDoor);
    }
    }

    function Door (aClip: AudioClip, openCheck : boolean, animName: String, thisDoor : GameObject){

    audio.PlayOneShot(aClip);
    doorIsOpen = openCheck;

    thisDoor.transform.parent.animation.Play(animName);

    }

    @script RequireComponent(AudioSource)

    i would really apreciate if you can help me out. Thanks

    • Hi there!

      Quite simple but easy mistake to make- when you declared your audio variables at the top you used an equals (a setter) instead of a colon (declaring data type) so Unity has set the variable to a generic ‘System.Type’ because it doesn’t know what the type is-

      var doorOpenSound = AudioClip;
      var doorShutSound = AudioClip;

      Should be-

      var doorOpenSound : AudioClip;
      var doorShutSound : AudioClip;

      Change that and then your function call will have arguments with data types that match the function instead of trying to pass System.Type to a slot expecting AudioClip type.

  5. Hi

    I am pretty confident I want to get this book. However, will this book still cover unity 4? or are there major changes to the interface and workflow?
    Are you considering another release? if so, when?

    Thanks,

    • I will write another book but most likely for Unity 4.1 or 4.2, there are some awesome new workflows and features coming that its not worth writing about just yet. However, nothing in 4.0 should effect how the current book works.

  6. Hi Will,
    I absolutely love this book, I have just flown through it with ease! I love the way you have sectioned the theory and the practical so it was easy for me to skip the bits of theory that are general to programming as a whole and the instructions were clear and simple. I hope you are planning to do a book for Unity 4! I have, however, one small problem.

    In chapter 8 I have done the particles as per your video and I’m up to the matches, for some reason the trigger won’t activate, I can’t figure it out. I have redone the script I have even coppied and pasted the onTriggerEnter(… function from the power cells and just changed the called function. It won’t activate! Here is what I have got…

    Inventory – C#

    using UnityEngine;
    using System.Collections;

    public class Inventory : MonoBehaviour {

    public static int charge = 0;
    public AudioClip collectSound;
    // HUD
    public Texture2D[] hudCharge;
    public GUITexture chargeHudGUI;
    // Generator
    public Texture2D[] meterCharge;
    public Renderer meter;

    // Matches
    bool haveMatches = false;
    public GUITexture matchGUIprefab;
    GUITexture matchGUI;

    // Use this for initialization
    void Start () {
    charge = 0;
    }

    // Update is called once per frame
    void Update () {

    }

    void CellPickup(){
    HUDon();
    AudioSource.PlayClipAtPoint(collectSound, transform.position);
    charge++;
    chargeHudGUI.texture = hudCharge[charge];
    meter.material.mainTexture = meterCharge[charge];
    }

    void HUDon(){
    if(!chargeHudGUI.enabled){
    chargeHudGUI.enabled = true;
    }
    }

    void MatchPickup(){
    haveMatches = true;
    AudioSource.PlayClipAtPoint(collectSound, transform.position);
    GUITexture matchHUD = Instantiate(matchGUIprefab, new Vector3(0.15f, 0.1f, 0), transform.rotation) as GUITexture;
    matchGUI = matchHUD;
    }
    }

    Matches – C#

    using UnityEngine;
    using System.Collections;

    public class Matches : MonoBehaviour {

    void OnTriggerEnter(Collider col){
    if(col.gameObject.tag == “Player”){
    col.gameObject.SendMessage(“MatchPickup”);
    Destroy(gameObject);
    }
    }
    }

    Thanks for your time, I really appreciate it!

    • Hey, not sure what this could be, code looks ok here – only thing I can think of is did you miss out on tagging the player with the Player tag? this may be listed in errata for the book – sorry if we missed it out! Select the first person controller and choose Player from the Tag drop down menu atop the inspector.

  7. Hi Will,

    I just finished the book and I loved it! Now I feel more comfortable then ever to begin on creating my Unity game for my third year university project.

  8. In the end of chapter 2, for some reason my projectile gets instantiated, but the ball doesn’t fly. In fact, it gets instantiated and just floats in the air where my camera created it. The AddForce() is not working properly I assume, but shouldn’t the projectile fall slowly at least to the floor?

    My shooter script is the following:
    using UnityEngine;
    using System.Collections;

    public class Shooter : MonoBehaviour {

    public Rigidbody bullet;
    public float power = 1500f;
    public float moveSpeed = 2f;

    void Update () {

    float h = Input.GetAxis (“Horizontal”)*Time.deltaTime * moveSpeed;

    float v = Input.GetAxis (“Vertical”)*Time.deltaTime * moveSpeed;

    transform.Translate (h, v, 0);

    if(Input.GetButtonUp (“Fire1″)){
    Rigidbody instance = Instantiate (bullet, transform.position, transform.rotation) as Rigidbody;
    Vector3 fwd = transform.TransformDirection(Vector3.forward);
    instance.AddForce(fwd*power);
    }

    }
    }

    Here is a screenshot of the projectile properties and the main camera properies.
    http://i.imgur.com/kazgz.png

    Also I get an error saying:
    HDR RenderTexture format is not supported on this platform. This camera will render without HDR buffers.

  9. This meassage to anyone here including you will, i dont know any js or c# but im still trying to learn unity is this a good book to buy ?

    Thanks

    • Hi William, definitely- I designed this book with people like you in mind, I assume no prior scripting knowledge, so you can learn scripting concepts whilst you learn Unity. Hope that helps!

      Will

  10. Hi,
    I am really tempited to buy this book given the reviews in amazon! But my concern is that the current unity version is 4. How unity 4 differes from unity 3.4? Is the differece between both softwares huge enough?
    Can I use Objective-c instead of JS or C#? Developing for iOS would it be a problem using C# or unity would translate that to lower level C?
    Thanks
    Aurelio

    • Hi Aurello, this book still works fine for Unity 4. I work at Unity and can verify that first hand for you! You cannot code in obj-C but regarding iOS Unity creates the xcode project for you – that’s the unity way, we take the pain of converting your code in that regard.

      • Hello Will Goldstein,
        I am really impressed the way you care for your customers. Even some good paid engine-developers dont do that this way! I started new with unity and really want to buy that book. But I have a question: Is it worth waiting for the Unity 4 book? I guess it will take long time to end writing this book. Would there be big differences between 3.4 and version 4? I just want to make some PC games, and maybe, after a while maybe even PS3 or iOS games, but PC games prioritizied (iOS is less important but PS3 would be great but not necessary). I know this question is often discussed, but I just wanted to be sure about this, that this book is a good investigation!

        Thank you very much in advance to you and anyone who will anser this :)

        With best regards,

        David Al

        • Hi David

          It’s Goldstone but thanks for the complements! I appreciate anyone who’d be interested in my book so of course i’m happy to look after readers :) I’m currently holding off writing the next book as I work at Unity and know that certain changes will occur over the next 6 months which mean its worth waiting to write a new book. However my current book works with 4.0 as many readers on this site have affirmed, and any future updates I’ll be posting solutions to for sure. If you want to start off making pc games or any others for that matter , I like to think my book is a great start, it’ll teach you the fundamentals of Unity and you can then do a lot with that knowledge I’m sure.

          All the best

          Will

  11. Great book Will. Bought it a while back, but just got to start it last week. Wanted to let anyone reading this know I’ve just run through it in Unity 4.0 and the differences are minor. Only real issue not already addressed on this site was a change to the animation section in Chapter 10. The script name “Animator” used by the book conflicts with the new Animator class in 4.x. Just rename the script and it’s fixed :) Old animation system is still there (for now) so nothing else changed.

    Thanks again for the great read. Would like to kindly suggest including some PlayerPrefs info though. Saving player data seems like an essential for creating anything beyond a very quick and casual game.

  12. I loved this book! I had no trouble using it with Unity 4. It’s definitively the best way to get introduced to Unity. Very well written, easy to follow!

  13. I solved my last question. Now I have one more. For example a player returns to the main Menu for instructions. How does he Resume the game at the point he left it? A new button (Resume) is required but how does it work? Thank you!

    • Hi George, its a bit more complicated than that – you’d have to save values between scenes (read up on PlayerPrefs or similar), or a better way to do it would be to make the menu part of the main scene, and then switch cameras and disable the player character whilst the camera is set to the faraway one (the one that shows the remote view with the menu next to it). Glad you liked the book!

  14. Hi Will I have one more question. In the following script. Everything works fine, but at the end I get the wrong TextHints.message=”You will need matches for the fire” instead of theTextHints.message=”WELCOME TO SURVIVAL ISLAND..” I tried many combinations of the code without success. Thank you for your support.

    if(hit.collider.gameObject == GameObject.Find(“campfire”)){

    if (!haveMatches){
    TextHints.textOn=true;
    TextHints.message = “You will need matches for the fire”;
    }
    else{
    if(haveMatches){
    haveMatches = false;
    lightFire();
    TextHints.textOn=true;
    TextHints.message = “WELCOME TO SURVIVAL ISLAND! *** END OF FIRST EPISODE”;
    }
    }
    }

  15. Great book Will!

    Currently at chapter 9, all errata and updates for the book to keep it relevant for 4.x work fine with me! No problems thusfar and I enjoy the pacing, examples and the occasional repeat in your book.

    Keep up the great work!

  16. Hello Will,

    Following the book and it is great. I have one question. In the part where I create a coconut for the Coconut Shy game, I’m just wondering why I have to create a separate Material component (Coconut Skin) in the Coconut (sphere) GameObject and add the Coconut texture to that, when I could achieve the same result by just adding the Coconut Texture directly to Materials->Element 0 in the Mesh Renderer component of the Coconut game object.

    Regards,
    Dan

    • Hi Dan, yes you should have a material made anew in that instance. With times that you apply a material to objects it may well be that you want to apply it to other items- doing what u suggest would have just applied that texture to the default material which is hidden. However when you import models made in a 3d app you’ll always see that unity makes you materials and assigns your textures anyway so it’s rarely needed.

  17. FinishedChapter 10 with the win sequence and the menu being reloaded.
    Has anyone found that playing the game a 2nd time (without quitting) you can’t get the power cell in the coconut shy game?

    There are some objects whose properties aren’t being reinitialized to their original start game values. I guess this is a good exercise to get that power cell in the Coconut Shy shack back to its original state.

  18. I am a high school teacher and I have recently been using Unity 3d ver. 4 with my students. Not only do they enjoy playing unity games, they are starting to write some of their own. Students as young as freshmen are using Unity 3d. I am looking forward to reading your book Will, and would encourage you to check out the student games on the student showcase of our website: http://www.evwllc.co. If you are an educator and want to work with us, please contact us.

  19. unity is the best software to make a portable game on platform like android , ios, and this book will help anyone to learn basic of game programming and designing!
    Thanks for sharing..

  20. i have a problem im a bit embarrassed but i did this script exactly and im getting errors
    i did what the book said in both scripts but this is still happening
    can you post the correct script

    #pragma strict

    function Start () {
    var bullet : Rigidbody;
    var power : float = 1500;
    var moveSpeed : float = 5;

    function Update (){
    transform.Translate(h, v, 0);
    var h : float =
    Input.GetAxis(“Horizontal”) *
    Time.deltaTime * moveSpeed;
    var v : float =
    Input.GetAxis(“Vertical”) *
    Time.deltaTime * moveSpeed;
    }

    Assets/Shooter.js(8,10): BCE0044: expecting (, found ‘Update’.
    Assets/Shooter.js(8,19): UCE0001: ‘;’ expected. Insert a semicolon at the end.
    Assets/Shooter.js(9,29): BCE0044: expecting :, found ‘;’.

    • Hi fofo – no reason to be embarrassed! we all start somewhere. You didn’t do what the book said here as you have your variables inside a Start function (they should be outside it) that you’ve begun but not finished (also a problem).

      #pragma strict

      var bullet : Rigidbody;
      var power : float = 1500;
      var moveSpeed : float = 5;

      function Start () {
      }

      function Update (){
      transform.Translate(h, v, 0);

      var h : float = Input.GetAxis(“Horizontal”) * Time.deltaTime * moveSpeed;
      var v : float = Input.GetAxis(“Vertical”) * Time.deltaTime * moveSpeed;
      }

      So in Unity javascript, the public variables should be established outside of the functions at the top as shown here. I’ve then moved your Start() function declaration down, and closed it with a finishing ‘}’ symbol – which you had missing. However, this function is not doing anything here so you could remove it.

      Enjoy the rest of the book!

  21. Chapter 9 designing menu, I have this following code

    using UnityEngine;
    using System.Collections;
    [RequireComponent(typeof(AudioSource))]

    public class MainMenuGUI : MonoBehaviour{
    public AudioClip beep;
    public GUISkin menuSkin;
    public Rect menuArea;
    public Rect playButton;
    public Rect instructionsButton;
    public Rect quitButton;
    void OnGUI() {
    GUI.skin=menuSkin;
    GUI.BeginGroup (menuArea);
    if(GUI.Button(new Rect(playButton), “Play”)){
    audio.PlayOneShot(beep);
    }
    if(GUI.Button(new Rect(instructionsButton), “Instructions”)){
    audio.PlayOneShot(beep);
    }
    if(GUI.Button(new Rect(quitButton), “Quit”)){
    audio.PlayOneShot(beep);
    }

    GUI.EndGroup();
    }

    }
    but when I drag the script to the menu2 object which a game object created by selecting gameobject,create empty. I don’t see any button when I click the play button

    • Am I to assume you’ve completed the step where you fill in the Rect values in the Inspector to give it an actual size onscreen?

  22. I made a mistake and added many scenes though I unchecked them,I couldn’t load the Island scene, I deleted all of them, deleted the menu scene,duplicated the Island scene, I mean I made another Menu scene and still I can’t load the island scene when I hit the play button.I keep getting “Level ‘Island’ (-1) couldn’t be loaded because it has not been added to the build settings.” error. I was able to load it when I first made the scene,before I started doing it the coding way and ran into errors, I started allover again and now I can’t load the Island . I need help please.

  23. Hi Will,

    I really enjoyed the book, and I learned so much from it in so little time. I have a question that refers to Chapter 12 under the heading, “Sharing on Kongregate.com.” There it says: “The simplest method for beginners is to publish to portal site Kongregate.com…”

    However, Kongregate requires that file sizes of games uploaded to there site be below 20 MB (http://developers.kongregate.com/docs/resources/faq#format under the heading “What format of games can I upload?”). I have the free version of Unity 4.1, and I made a Mac OSX build of an empty Unity project without any imported assets and only a single scene with no game objects. The build of the empty project was 33.8 MB, way above the maximum of 20 MB allowed on Kongregate, and I know the PC build will be close to 33 MB as well. So, my question is: How is it possible to use Unity to make any type of game that is less than 20 MB in file size in order to meet Kongregate’s requirements? Thanks, in advance.

    • Well you’re quoting the sizes of executable standalone builds, not Web Player builds – which is what Kongregate (being as it is, on the web) is expecting. You’ll see many Unity games on their site, so it’s definitely something you can do!

      • OK, thanks for clearing that up for me. I am new to this, and I mistakenly thought Kongregate took the executable files. So I just made a Web Player build of the same empty project, and it resulted in two files (a .html file and a .unity3d file) of which the combined size is only 12 KB, as compared to the 33.8 MB of the executable standalone build. Thank you very much for your help!

  24. i have down the package ,but just sound ,fbx ,and material file , is there scene file can be download ,thank you!

  25. Hi,

    I’ve just finished reading the book and creating the game which was a fantastic journey and discovery of the Unity engine (4.2) and some of its possibilities without assuming prior knowledge and without suddenly raising the difficulty after a few chapters.

    I still have a few questions regarding the use of C# in Unity:

    - All methods and some variables are missing a visible ‘standard’ access modifier. It looks similar to Java’s default (package) access modifier. For which existing modifier, is this a shortcut?
    - From an OO point of view, why should I use the methods “Find” and “SendMessage” instead of using a reference variable to the desired object? The “Find” and similar methods could be used while instantiating the reference variable, but the “SendMessage” seems to be overkill (not that I was experiencing weak performance while playing the game) compared to a regular method call.
    - Is it possible to define the order in which the update methods of the different scripts are called (in order to respond one update earlier to a certain event)?

    And I’ve also found an erratum:
    - It’s not possible to replay the game in the same session, because of the static variables (For example: winning the coconut game). My solution is to initialize all static variables in the Start method if you are sure you’re using one instance of the class in each scene.

    Greetz.
    Matthias

    • Hi Matthias, thanks for the summary, to answer your questions -

      - not sure what you mean as a ‘standard’ access modifier? for more info watch the beginner scripting module on the unity site (what my team works on) in particular the scope and access modifiers lesson.
      - Find is useful for setting references but indeed its not totally necessary to use SendMessage, I was just hoping to give readers a variety of tools. I’d recommend using GetComponent and making public references that are initialised in Start or Awake.
      - For Updates you can mix update and late update if you need to but im not sure if you mean something different?
      - I know, my bad! this can be corrected by setting a default value for the offending variables in Start()

      Cheers

      Will

      • Thanks for the quick reply and support.

        - I watched the tutorial and did some research. I wasn’t aware of the fact that if you write no access modifier down, this equals the default access modifier for this member variable/member function/inner class (I learnt C# from a Java point of view). With ‘standard’ access modifier, I just meant: public/private/protected/internal/protected internal.
        - …
        - That’s nearly what I meant. I wondered if it’s possible that you can for instance define: GameObject A must update before B and B before C, B must fixed update before A, … . I know that you can rename and move all the updates to one Update function, but I guess that all the different Update functions are executed in parallel by the engine which will decrease performance in case of one Update function. But now I think the LateUpdate will do the work just fine.
        - …

        Greetz.
        Matthias

  26. Hi I have a question about enabling GUITexture.
    For the power cell, you use the enabled variable to hide and display the GUI.
    For the matches, you use prefab to instantiate it.
    What are the advantages of the two methods?
    Thank you for the great book.

    • more logistical than performance based – the instantiation is obviously something to perform – a new object is being added to the scene, whereas with the enabling of existing object that doesn’t occur – its more that I was pointing out some objects should be in the scene when it starts, others may never appear so can be instantiated.

  27. Hi, I’ve just completed reading your book: great work!

    Just a hint for those who like me have upgraded Windows to 8.1: sometimes Unity crashes when starting and also the standalone (PC) or webplayer project crashes when opened after the building process.

    To resolve the crash when Unity starts see here: http://forum.unity3d.com/threads/205690-Windows-8-1-Update-Ruins-Unity)

    Then, to avoid your build project crashing when you open it, be sure to check the “Use Direct3D 11″ checkbox in Edit->Project settings->Player (Other Settings tab). This works for me.

    Hope this helps,
    Angelo

  28. Hi. I am planning to buy your book. Still…I have some questions. I have completed the tutorials on Unity Student. Will this book help me understand better, give me more information or it focuses on the same elements? I have met some obstacles like angles(euler, quaternian, static variables etc.) On Unity Answers, I was told to read a C# book for the first year of faculty…too hard. Is this book more straight-forward? How much time will take this book to learn?

    • Hi Darking. This book is a softer approach to getting into game development for sure. If someone tells you to read a pure C# book, expect it to be a lot more hardcore than this. My book is designed to teach you Unity specific code from the ground up, assuming no prior knowledge. We may touch on the obstacles you mention, though we don’t specifically demystify them. I would say that learning with my book will get you to a basic understanding of how coding works in Unity, or at least one of many ways to approach coding in Unity. Give it a try!

  29. Hello Will!

    So I bought your book in hopes of kick-starting my interest in game design/programming. I have just finished the second chapter with minimal problems. However, I’m having issues with piecing together how I would use parts of C# in different situations other than the ones listed specifically in the book. I’m afraid to move on because I don’t feel like I have a firm enough grasp on how C# works.

    Should I do and redo the second chapter many times until I completely understand every term and the situations they’re specifically used in, or would it be best to move on, and have those things covered again later in the book?

    Thanks for your help

    • Hi Connor, first off thanks for grabbing the book. The structure of the book is designed to reinforce some of the concepts discussed earlier in the introductory chapters – so I’d say even if you don’t understand them after reading the introduction, putting them into practice will help you understand them as you use them. Let me know if you reach the end and haven’t had any luck understanding them further of course! good luck with your learning.

  30. I love this book!, Still on page 128, but I think I paid less for its content because I think it deserves more, the discussions are smooth so far, and I was like being enlightened every chapter. And I like how this book is working on two languages too, so that if ever I can’t write it on C#, I can write it on JavaScript, and vice versa. Oh well gotta continue reading this adventure that is full of fun. ^_^

    Hope you’ll do more books about going deep into scripting(C#, Java, or Boo).

  31. Hi will

    (me again :/ ….)

    i followed the rest of your book and came to the “code maintainability” part and when i did that, my door closed!!!
    so thanks anyway if you where thinking about a solution.
    if it was a simple problem could you yet tell me?
    i like to know it for when future problems occur.

    sincerely Gijs

  32. Hi Gijls, to save page space I won’t post your original question, but to summarise for others – Gijls had made the timer variable public.

    The problem with this is that public means the variable is exposed to the Inspector, and so will be set by it. This often occurs if you make a variable public, then switch to unity, and later go back to the script, writing in a different value – once you’ve made it public and compiled the code (switching back to unity) then it’ll always keep that inspector value, regardless of what you write into the script as its declaration. So if you want to see the value of a variable in the inspector to check something, click the icon in the top right of the inspector and switch to Debug Mode instead of making them public.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>