Sunday, September 1, 2013

UNITY: Roll-A-Ball Tutorial

Official Roll-A-Ball Tutorial by Unity3D

http://www.youtube.com/watch?v=lv0SqtSzBxc

Tutorial 01: Setting Up the Game

  • Unity primitives are all either 1x1x1 or 1x2x1 in size when created
  • Empty Game Objects are used as directories in the Hierarchy

Tutorial 02: Moving the Player

  • Rigidbody
    • required for physics interaction
    • can be created and added directly via "Add Component" in the inspector.
  • void Update();
    • used for controller inputs, etc.
  • void FixedUpdate();
    • used for anything physics related
  • CTRL + ' when highlighting an object in MonoDevelop will bring up the reference page
  • Store "Input.GetAxis" calls in a float variable
  • use "rigidbody.Addforce" for physics based movement
  • create new Vector3 type variable to store movement
    • " Vector3 movement = new Vector3(x, y, z); "
    • " rigidbody.AddForce (movement); "
  • use " Time.DeltaTime " as frames per second

Tutorial 03: Moving the Camera

  • Tying the camera to the Player game object
    • not as simple as parenting the camera to the Player object
    • add a new script to the Camera object via Add Component
    • scripts always get added to the root assets directory, so move it to " scripts "
    • create a " GameObject " type public variable called "player" so a field will open up for drag and drop inside of Unity.
    • create a Vector3 type private variable called "offset" that the script can alter under the Start() function.
    • void LateUpdate();
      • follow cameras, procedural animations, gathering last known states
    • create reference to player GameObject by dragging in to previously created "player" slot

Tutorial 04: Play Area and Pickup Objects

  • Creating environment
    • create empty game object as a holder / folder
    • reset position back to origin
    • create geometry and put it under empty game object for organization
  • Creating Pickup items
    • create new cube
    • lift it, shrink it, and rotate 45 degrees on all axis
    • add component: script (for rotating animation)
    • not using forces, so we can use " void Update() "
    • use lower case "t", " transform.Rotate(new Vector3(15, 30, 45) * Time.DeltaTime); "
    • make into Prefab:
      • Create "Prefab" Folder
      • Drag "Pickup" item from Hierarchy into Prefab folder
        • When this is done, a Prefab Item is created
        • Item in Hierarchy now shows BLUE
    • Create empty GameObject named "Pickups" to hold our pickups in the Hierarchy view
      • Reset position to 0,0,0
    • Spread Pickup items around
      • make sure the blue prefab item itself is selected for duplication, not the group node
      • change move to "Global" instead of "Local" 

Tutorial 05: Collecting and Counting

  • In order to count items, we have to create collision detections
  • collisions have to be detected to trigger new behaviors
  • collisions have to be "tested" to see which object has been pinged
  • edit "PlayerController" script
    • but before that, let's inspect the player object
      • We're interested in the "Sphere Collider"
      • In object header:
        • turn down arrow (reveals more info)
        • icon
        • enable/disable checkbox
        • types of component
        • object sensitive gear gizmo
        • icon of little book with question mark (help)
      • Use book icon to go to offline Reference
        • Offline Reference (PC)
        • Component Help
        • Switch to Scripting Help
        • we want to use "OnTriggerEnter" function
          • can be used for detecting object collision, without actual physical collision occuring
        • "void OnTriggerEnter(Collider other)"
          • references the "other" item we collide with
        • "Destroy(other.gameObject);" 
          • destroys referenced game object that we collided with
          • destroyed game objects and all their children are removed from the scene
        • In this tutorial, we'll deactivate gameObject instead of destroying it
          • Remove the "Destroy" code
          • look up "Tag" under "GameObject"
            • Tags can be assigned to objects for identification
            • Tags must be declared in the "Tag Manager" before using
          • look up "SetActive"
            • method used to activate or disable objects
        • example code:
          • if(other.gameObject.tag == "Pickup")
          • {
            • other.gameObject.SetActive(false);
          • }
        • Basically checks if other object collided with has a Tag called "Pickup, and if it does, executes the code. In this instance, it tells the other game object to execute "SetActive" method to false.
        • In UNITY, select Pickup object and under the inspector, check the TAG list
          • add TAG
          • under the first element (0), add "Pickup"
            • name has to match exactly to the script
          • apply tag to prefab
        • Turn colliders into "Triggers"
          • static objects don't get recalculated
          • dynamic objects get recalculated
          • must add RigidBody objects
            • turn off Use Gravity
            • activate "Is Kinematic"
        • performane Tidbit:
          • UNITY calculates all Static items and holds it in memory cache
          • if we rotate a static collider, the cache gets rebuilt globally
          • adding RigidBody and turning on "Is Kinematic" excludes items from Static collider cache
          • "Is Kinematic" allows for animation through transforms (IE: elevators and moving platforms)

Tutorial 06: Displaying Text

  • We need a tool to store collection count, and tool to add on top
  • Add these tools to "PlayerController" script
    • add private variable "count"
    • initialize to zero under Start();
      • count = 0;
    • under "void OnTriggerEnter(Collider other)"
      • add: " count = count + 1 "
  • Displaying Info via GUI Text:
    • Add new empty GameObject: " Display_Text", transform 0,0,0
    • Create "GUI Text" gameObject
      • Parent to "Display_Text" game object
    • Move to " Upper Left "
      • 0,0 = lower left
      • 1,1 = upper right\
    • Set Transform to 0,1,0
    • Then use "Pixel Offset" setting in the GUIText
      • X = 10, Y = -10
    • Under "PlayerController" script:
      • add new public "GUIText" variable called "countText"
        • this opens up another slot in Unity that allows for drag and drop
      • initialize "countText" to: 
        • "Count: " + count.ToString(); 
          • count.ToString(); must be after "count" has an initialized value
      • update "countText" everytime an object is picked up
        • under "void OnTriggerEnter(Collider other)"
          • add "countText.text = "Count: " + count.ToString();
      • create new function instead of typing "countText.text = ....." repeatedly
        • void SetCountText()
        • {
          • countText.text = "Count: " + count.ToString();
        • }
      • add function call to respective locations of the script
      • drag GuiText object into new "PlayerController" script slot
      • VOILA!
  • Displaying WIN condition:
    • create new GUIText object "WinText"
    • parent to DisplayText game object
    • add reference to PlayerController script:
      • create new public GUIText variable: " winText "
      • initialize winText.text = ""; // empty text
      • under " SetCountText()" function:
        • add:
          • if (count >= 12)
          • {
            • winText.text = "YOU WIN!";
          • }
      • save and return to unity
      • drag-associate WinText object to the PlayerSphere reference call (drop it into the field)

Tutorial 07: Publishing the Game

  • Unity can build to all to all target platforms
  • Open Build Settings
  • Current build settings are denoted by the UNITY icon
  • Switch build platform by highlighting target platform, and hitting "Switch Platform"
  • Add current scene to build by clicking "Add Current", or drag and drop any scenes from Project folder to the "Scenes to Build" field
    • include only the scenes needed
  • Hit "Build" button
  • Create new folder under main project root folder called "Builds"
  • Name the build, and Save

No comments: