Log In
Or create an account ->
Imperial Library
Home
About
News
Upload
Forum
Help
Login/SignUp
Index
Title Page
Copyright and Credits
Unity 2018 Cookbook Third Edition
Dedication
Packt Upsell
Why subscribe?
Packt.com
Foreword
Contributors
About the author
About the reviewer
Packt is searching for authors like you
Preface
Who this book is for
What this book covers
To get the most out of this book
Download the example code files
Download the color images
Conventions used
Get in touch
Reviews
Displaying Data with Core UI Elements
Introduction
The big picture
Displaying a "Hello World" UI text message
Getting ready
How to do it...
How it works...
There's more...
Styling substrings with Rich Text
Displaying a digital clock
Getting ready
How to do it...
How it works...
There's more...
The Unity tutorial for animating an analog clock
Displaying a digital countdown timer
Getting ready
How to do it...
How it works...
Creating a message that fades away
Getting ready
How to do it...
How it works...
Displaying a perspective 3D Text Mesh
Getting ready
How to do it...
How it works...
There's more...
We have to make this text crawl like it does in the movie
Where to learn more
Creating sophisticated text with TextMeshPro
Getting ready
How to do it...
How it works...
There's more...
Rich Text substrings for colors, effects, and sprites
Displaying an image
Getting ready
How to do it...
How it works...
There's more...
Working with 2D Sprites and UI Image components
See also
Creating UIs with the Fungus open source dialog system
How to do it...
How it works...
Creating a Fungus character dialog with images
How to do it...
How it works...
There's more...
Data-driven conversations
Responding to User Events for Interactive UIs
Introduction
The big picture
Creating UI Buttons to move between scenes
How to do it...
How it works...
There's more...
Color tint when mouse pointer is over the button
Animating button properties on mouse-over
How to do it...
How it works...
Organizing image panels and changing panel depths via buttons
Getting ready
How to do it...
How it works...
There's more...
Moving up or down by just one position, using scripted methods
Displaying the value of an interactive UI Slider
How to do it...
How it works...
Displaying a countdown timer graphically with a UI Slider
Getting ready
How to do it...
How it works...
Setting custom mouse cursors for 2D and 3D GameObjects
Getting ready
How to do it...
How it works...
Setting custom mouse cursors for UI controls
Getting ready
How to do it...
How it works...
Interactive text entry with an Input Field
How to do it...
How it works...
There's more...
Limiting the type of content that can be typed
Toggles and radio buttons via Toggle Groups
Getting ready
How to do it...
How it works...
There's more...
Adding more Toggles and a Toggle Group to implement mutually-exclusive radio buttons
Creating text and image icon UI Dropdown menus
Getting ready
How to do it...
How it works...
There's more...
Adding images to a Dropdown control
Displaying a radar to indicate the relative locations of objects
Getting ready
How to do it...
How it works...
The Start() method
The Update() method
The FindAndDisplayBlipsForTag(...) method
The CalculateBlipPositionAndDrawBlip (...) method
The NormalisedPosition(...) method
The CalculateBlipPosition(...) method
The DrawBlip() method
There's more...
Adapt for object heights and opaque obstacles
Inventory UIs
Introduction
The big picture
Creating a simple 2D mini-game – SpaceGirl
Getting ready
How to do it...
How it works...
Displaying single object pickups with carrying and not-carrying text
Getting ready
How to do it...
How it works...
The PlayerInventory script class
The PlayerInventoryDisplay script class
There's more...
Collecting multiple items and display total number carried
Alternative – combining all the responsibilities into a single script
Displaying single object pickups with carrying and not-carrying icons
Getting ready
How to do it...
How it works...
Displaying multiple pickups of the same object with multiple status icons
Getting ready
How to do it...
How it works...
There's more...
Revealing icons for multiple object pickups by changing the size of a tiled image
Using panels to visually outline the inventory UI area and individual items
Getting ready
How to do it...
How it works...
Creating a C# inventory slot UI display scripted component
Getting ready
How to do it...
How it works...
There's more...
Modifying the game for a second inventory panel for keys
Using UI Grid Layout Groups to automatically populate a panel
Getting ready
How to do it...
How it works...
There's more...
Automatically infer number of inventory slots based on number of GameObjects tagged Star
Add a horizontal scrollbar to the inventory slot display
Automatically changing the grid cell size based on the number of slots in the inventory
Displaying multiple pickups of different objects as a list of text via a dynamic List<> of scripted PickUp objects
Getting ready
How to do it...
How it works...k
There's more...
Order items in the inventory list alphabetically
Displaying multiple pickups of different objects as text totals via a dynamic Dictionary<> of PickUp objects and enum pickup types
Getting ready
How to do it...
How it works...
Playing and Manipulating Sounds
Introduction
The big picture
Future audio features
Playing different one-off sound effects with a single AudioSource component
Getting ready
How to do it...
How it works...
There's more...
Play a sound at a static point in 3D world space
Playing and controlling different sounds each with their own AudioSource component
Getting ready
How to do it...
How it works...
Creating just-in-time AudioSource components at runtime through C# scripting
Getting ready
How to do it...
How it works...
There's more...
Adding the CreateAudioSource(...) method as an extension to the MonoBehavior class
Delaying before playing a sound
Getting ready
How to do it...
How it works...
Preventing an Audio Clip from restarting if it is already playing
Getting ready
How to do it...
How it works...
See also
Waiting for the audio to finish playing before auto-destructing an object
Getting ready
How to do it...
How it works...
See also
Creating a metronome through the precise scheduling of sounds with dspTime
Getting ready
How to do it...
How it works...
There's more...
Creating just-in-time AudioSource GameObjects for the basic and accented beats
Creating beat sounds through data rather than AudioClips
Matching the audio pitch to the animation speed
Getting ready
How to do it...
How it works...
There's more...
Changing the Animation/Sound Ratio
Accessing the function from other scripts
Allowing reverse animation (negative speeds!)
Simulating acoustic environments with Reverb Zones
Getting ready
How to do it...
How it works...
There's more...
Attaching the Audio Reverb Zone component to Audio Sources
Making your own Reverb settings
Adding volume control with Audio Mixers
Getting ready
How to do it...
How it works...
There's more...
Playing with Audio Production
See also
Making a dynamic soundtrack with Snapshots
Getting ready
How to do it...
How it works...
There's more...
Reducing the need for multiple audio clips
Dealing with audio file formats and compression rates
Applying Snapshots to background noise
Getting creative with effects
See also
Balancing in-game audio with Ducking
Getting ready
How to do it...
How it works...
See also
Audio visualization from sample spectral data
Getting ready
How to do it...
How it works...
The void Awake() method
The void CreateCubes() method
The void Update() method
The void UpdateCubeHeights() method
The float HeightFromSample(float) method
There's more...
Adding visualizations to a second AudioSource
Try out different FFT (Fast Fourier Transform) window types
Synchronizing simultaneous and sequential music to create a simple 140 bpm music-loop manager
Getting ready
How to do it...
How it works...
There's more...
Adding visualizations to the four playing loops
Creating Textures, Maps, and Materials
Introduction
Creating and saving texture maps
The big picture
Standard Shader (Specular workflow)
Standard Shader (Metallic workflow)
Other material properties
Resources
Unity samples and documentation
References
Tools
Additional reading
Creating a basic material with Standard Shader (Specular setup)
Getting ready
How to do it...
How it works...
There's more...
Setting the texture type for an image file
Combining the map with color
Adapting a basic material from Specular setup to Metallic
Getting ready
How to do it...
How it works...
Applying Normal maps to a Material
Getting ready
How to do it...
How it works...
Adding Transparency and Emission maps to a material
Getting ready
How to do it...
How it works...
There's more...
Using texture maps with the Transparent Mode
Avoiding issues with the semi-transparent objects
Emitting light over other objects
Highlighting materials at mouse-over
How to do it...
How it works...
There's more...
Collider needed for custom meshes
Mouse Down/Up events – for clicking color
Adding Detail maps to a material
Getting ready
How to do it...
How it works...
Fading the transparency of a material
How to do it...
How it works...
There's more...
Start with keypress and fade in from invisible
Destroy object when fading complete
Using GameObect's alpha as our starting alpha value
Using a coroutine for our fading loop
Shader Graphs and Video Players
Introduction
The big picture
The new Shader Graph tool
Playing videos with the new Video Player
Online references materials
Shader Graph online resources
Video Player online resources
Playing videos by manually adding a VideoPlayer component to a GameObject
Getting ready
How to do it...
How it works...
There's more...
Semi-transparent video and Camera Near Plane
Audio issues and AudioSource solution
Using scripting to control video playback on scene textures
Getting ready
How to do it...
How it works...
There's more...
Ensuring that a movie's prepared before playing it with the prepareCompleted event
Outputting video playback to a Render Texture asset
Ensuring that the movie is prepared before playing with coroutines
Downloading an online video (rather than a clip)
Using scripting to play a sequence of videos back-to-back
Getting ready
How to do it...
How it works...
Creating and using a simple Shader Graph
How to do it...
How it works...
Creating a glow effect with Shader Graph
Getting ready
How to do it...
How it works...
Toggling a Shader Graph color glow effect through C# code
Getting ready
How to do it...
How it works...
There's more...
Using Sine Time to create a pulsating glow effect
Using the Compile and Show Code button as another way to find exposed property IDs
Using Cameras
Introduction
The big picture
Cinemachine
Creating the basic scene for this chapter
Getting ready
How to do it...
How it works...
Creating a picture-in-picture effect
Getting ready
How to do it...
How it works...
There's more...
Changing the size and location of the picture-in-picture viewport on the screen
Adding further contols for depth-of-field and aspect-ratio
Manually changing Camera viewport properties in the Inspector
See also
Switching between multiple cameras
Getting ready
How to do it...
How it works...
There's more...
Using a single-enabled camera
See also
Making textures from screen content
Getting ready
How to do it...
How it works...
There's more...
Applying your texture to a material
Using your texture as a screenshot
See also
Zooming a telescopic camera
Getting ready...
How to do it...
How it works...
There's more...
Adding a vignette effect when you zoom
Going further with version 2 of the Unity Post Processing Stack
Displaying a minimap
Getting ready...
How to do it...
How it works...
There's more...
Using a UI Mask to make the minimap circular in shape
Hiding player character image at center of minimap and showing triangle marker
Rotating a compass-style image
Making the range of the map larger or smaller
Adapting your minimap to other styles
Creating an in-game surveillance Camera
Getting ready
How to do it...
How it works...
There's more...
Using Post-Processing to add a grainy, grayscale effect to the CCTV
Working with Unity's multi-purpose camera rig
How to do it...
How it works...
Using Cinemachine ClearShot to switch cameras to keep the player in shot
Getting ready
How to do it...
How it works...
There's more...
Unity Cinemachine tutorials
Will Goldstone's ClearShot turtorial
Adam Myhill's Cinemachine blog posts
Read the installed Cinemachine documentation
Letting the player switch to a Cinemachine FreeLook camera
Getting ready
How to do it...
How it works...
Lights and Effects
Introduction
The big picture
Lights
Environment lighting
Emissive materials
Projector
Lightmaps
Light probes
The Lighting settings window
The Light Explorer panel
Cucoloris cookies
Color space (Gamma and Linear)
Further resources
Directional Light with cookie Texture to simulate a cloudy day
Getting ready
How to do it...
How it works...
Creating and applying a cookie texture to a spotlight
Getting ready
How to do it...
How it works...
Adding a custom Reflection map to a scene
Getting ready
How to do it...
How it works...
There's more...
Mapping coordinates
Sharp reflections
Maximum size
Creating a laser aim with a projector
Getting ready
How to do it...
How it works...
There's more...
Limiting the range of the laser with Raycast hit to limit the far clip plane
Further reading
Enhancing the laser aim with a Line Renderer
Getting ready
How to do it...
How it works...
There's more...
Changing the beam color when the Fire key is held down
Setting up an environment with Procedural Skybox and Directional Light
How to do it...
How it works...
There's more...
Setting and rising the sun through scripted rotation of Directional Light
Adding a sun flare
Reflecting surrounding objects with Reflection Probes
Getting ready
How to do it...
How it works...
There's more...
Using Material Emission to bake light from a glowing lamp onto scene objects
Getting ready
How to do it...
How it works...
Lighting a simple scene with Lightmaps and Light Probes
Getting ready
How to do it...
How it works...
There's more...
2D Animation
Introduction
The Big picture
Grids, Tilemaps, and Tile Palettes
The 2D GameKit – bringing 2D tools together
Resources
Flipping a sprite horizontally – the DIY approach
Getting ready
How to do it...
How it works...
Flipping a sprite horizontally – using Animator State Chart and Transitions
Getting ready
How to do it...
How it works...
There's more...
Instantaneous swapping
Animating body parts for character movement events
Getting ready
How to do it...
How it works...
Creating a three-frame animation clip to make a platform continually animate
Getting ready
How to do it...
How it works...
There's more...
Copy animation relative to a new parent GameObject
Making a platform start falling once stepped on using a Trigger to move animation from one state to another
Getting ready
How to do it...
How it works...
Creating animation clips from sprite sheet sequences
Getting ready
How to do it...
How it works...
Creating a platform game with Tiles and Tilemaps
Getting ready
How to do it...
How it works...
There's more...
Tile Palettes for objects and walls
Rule Tiles for intelligent Tile selection
Learning more
Creating a game with the 2D Gamekit
Getting ready
How to do it...
How it works...
There's more...
3D Animation
Introduction
The big picture
Configuring a character's Avatar and idle animation
Getting ready
How to do it...
How it works...
There's more...
Use Controller with another 3D character Avatar
See also
Moving your character with root motion and Blend Trees
Getting ready
How to do it...
How it works...
There's more...
Mixing animations with Layers and Masks
Getting ready
How to do it...
How it works...
There's more...
Override versus Additive blending
Organizing States into Sub-state Machines
Getting ready
How to do it...
How it works...
Transforming the Character Controller via scripts
Getting ready
How to do it...
How it works...
Adding rigid props to animated characters
Getting ready
How to do it...
How it works...
There's more...
Removing props with a script
Setting Active if there's only one type of Prop
Using Animation Events to throw an object
Getting ready
How to do it...
How it works...
Applying Ragdoll physics to a character
Getting ready
How to do it...
How it works...
There's more...
Using a new player GameObject rather than deactivating and moving to a respawn point
Rotating the character's torso to aim a weapon
Getting ready
How to do it...
How it works...
There's more...
Generic solution for Cameras other than the Main Camera
Creating geometry with Probuilder
Getting ready
How to do it...
How it works...
Creating a game with the 3D Gamekit
Getting ready
How to do it...
How it works...
Importing third-party 3D models and animations from Mixamo
Getting ready
How to do it...
How it works...
There's more...
Looping the animation
Scripting events to control when Animation Clips are played
Information sources about importing models and animations into Unity
Webserver Communication and Online Version-Control
Introduction
The Big Picture
Setting up a leaderboard using PHP and a database
Getting ready
How to do it...
How it works...
There's more...
SQLite, PHP, and database servers
PHPLiteAdmin
Unity game communication with web-server leaderboard
Getting ready
How to do it...
How it works...
There's more...
Extracting the full leaderboard data for display within Unity
Using the secret game codes to secure your leaderboard scripts
Creating and cloning a GitHub repository
Getting ready
How to do it...
How it works...
There's more...
Learn more about DVCS
Learn more about Git at the command line
Using Bitbucket and SourceTree visual applications
Learning about Mercurial rather than Git
Adding a Unity project to a local Git repository, and pushing files up to GitHub
Getting ready
How to do it...
How it works...
Unity project version-control using GitHub for Unity
Getting ready
How to do it...
How it works...
There's more...
Further reading about GitHub for Unity
Pulling down updates from other developers
Unity Collaborate from Unity Technologies
Preventing your game from running on unknown servers
Getting ready
How to do it...
How it works...
There's more...
Enabling WebGL in Google Chrome
Improving security by using full URLs in your domain list
Controlling and Choosing Positions
Introduction
The big picture
Player control of a 2D GameObject (and limiting the movement within a rectangle)
Getting ready
How to do it...
How it works...
There's more...
Drawing a gizmo yellow rectangle to visually show bounding a rectangle
See also
Player control of a 3D GameObject (and limiting the movement within a rectangle)
How to do it...
How it works...
There's more...
Drawing a gizmo yellow rectangle to visually show bounding a rectangle
Choosing destinations – finding a random spawn point
Getting ready
How to do it...
How it works...
See also
Choosing destinations – finding the nearest spawn point
Getting ready
How to do it...
How it works...
There's more...
Avoiding errors due to an empty array
See also
Choosing destinations – respawning to the most recently passed checkpoint
Getting ready
How to do it...
How it works...
Moving objects by clicking on them
Getting ready
How to do it...
How it works...
Firing projectiles in the direction of movement
Getting ready
How to do it...
How it works...
Navigation Meshes and Agents
Introduction
The big picture
Run-Time Nav Mesh Obstacles
Source of further information about Unity and AI navigation
NPC to travel to destination while avoiding obstacles
Getting ready
How to do it...
How it works...
NPC to seek or flee from a moving object
Getting ready
How to do it...
How it works...
There's more
Using a Debug Ray to show a source-to-destination line
Constantly updating NavMeshAgent destination to flee from Player's current location
Maintain constant distance from target ("lurking" mode!)
Point-and-click move to object
Getting ready
How to do it...
How it works...
There's more
Creating a mouse-over yellow highlight
Point-and-click move to tile
Getting ready
How to do it...
How it works...
There's more
Yellow debug-ray to show destination of AI-agent
Point-and-click Raycast with user-defined higher-cost Navigation Areas
Getting ready
How to do it...
How it works...
There's more
More intelligent pathfinding by setting different costs for custom-defined navigation areas such as Mud and Water
Improving UX by updating a "gaze" cursor each frame
NPC NavMeshAgent to follow waypoints in a sequence
Getting ready
How to do it...
How it works...
There's more...
Working with arrays of waypoints
Increased flexibility with a WayPoint class
Controlling object group movement through flocking
Getting ready
How to do it...
How it works...
Creating a movable NavMesh Obstacle
Getting ready
How to do it...
How it works...
Design Patterns
Introduction
The big picture
State-driven behavior DIY states
How to do it...
How it works...
See also
State-driven behavior using the State Design Pattern
Getting ready
How to do it...
How it works...
There's more...
Adding the Timer event to lose the game after five seconds
See also
State-driven behavior with Unity Scriptable Objects
How to do it...
How it works...
There's more...
Extending the game to model Player health
See also
Publisher-Subscriber pattern C# delegates and events
Getting ready
How to do it...
How it works...
Model-View-Controller (MVC) pattern
Getting ready
How to do it...
How it works...
See also
Editor Extensions and Immediate Mode GUI (IMGUI)
Introduction
The Big picture
Unity Immediate Mode GUI (IMGUI)
Identifying and saving changes
Memory - EditorPrefs persistent storage
Conclusions and further resources
Menu items to log messages and clear the console
How to do it...
How it works...
There's more
Keyboard shortcuts
Sub-menus
Displaying a panel with text data
How to do it...
How it works...
There's more
Vertical centering
Vertical and horizontal centering (middle of an area)
An interactive panel with persistent storage
How to do it...
How it works...
There's more
Persistent storage with EditorPrefs
GUILayout versus EditorGUILayout
Creating GameObjects, parenting, and registering Undo actions
How to do it...
How it works...
There's more
Registering object changes to allow Undo'ing of actions
Creating primitive 3D GameObjects with random colors
Working with selected objects and deactivating menu items
How to do it...
How it works...
Menu item to create 100 randomly positioned prefab clones
Getting ready
How to do it...
How it works...
There's more...
Childing each new GameObject to a single parent, to avoid filling up the Hierarchy with 100s of new objects
A progress bar to display proportion completed of Editor extension processing
Getting ready
How to do it...
How it works...
An editor extension to allow pickup type (and parameters) to be changed at design time via a custom Inspector UI
Getting ready
How to do it...
How it works...
There's more...
Offer the custom editing of pickup parameters via Inspector
Offer a drop-down list of tags for key-pickup to fit via Inspector
Logic to open doors with keys based on fitsLockTag
The need to add [SerializeField] for private properties
An editor extension to have an object-creator GameObject, with buttons to instantiate different pickups at cross-hair object location in scene
Getting ready
How to do it...
How it works...
Extensible class-based code architecture to manage complex IMGUIs
How to do it...
How it works...
Script-class MyEditorWindow
Script-class IMyGUI
Script-class MyGUIFlexibleSpace
Script-class MyGUITextField
Script-class MyGUILabel
Script-class MyGUIButton
Working with External Resource Files and Devices
Introduction
The big picture
Loading external resource files – using Unity Default Resources
Getting ready
How to do it...
How it works...
There's more...
Loading text files with this method
Loading and playing audio files with this method
See also
Loading external resource files by downloading files from the internet
Getting ready
How to do it...
How it works...
There's more...
Converting from Texture to Sprite
Downloading a text file from the web
The WWW class and the resource content
An example using UnityWebRequest
See also
Loading external resource files by manually storing files in the Unity Resources or StreamingAssets folders
Getting ready
How to do it...
How it works...
There's more...
Avoiding cross-platform problems with Path.Combine() rather than / or \
SteamingAssets folder
See also
Saving Project files into Unity Asset Bundles
Getting ready
How to do it...
How it works...
Loading resources from Unity Asset Bundles
Getting ready
How to do it...
How it works...
There's more...
Loading AssetBundles via AssetBundle.LoadFromFile()
Loading AssetBundles hosted via a web server
Working with Plain Text, XML, and JSON Text Files
Introduction
The Big picture
XML – the eXtensible markup language
JSON – the JavaScript object notation
Loading external text files using the TextAsset public variable
Getting ready
How to do it...
How it works...
Loading external text files using C# file streams
Getting ready
How to do it...
How it works...
Saving external text files with C# file streams
Getting ready
How to do it...
How it works...
There's more...
Choosing the Data or the Resources folder
Loading and parsing external XML
Getting ready
How to do it...
How it works...
There's more...
Retrieving XML data files from the web
Creating XML text data manually using XMLWriter
How to do it...
How it works...
There's more...
Adding new lines to make XML strings more human readable.
Making data class responsible for creating XML from list
Saving and loading XML text data automatically through serialization
Getting ready
How to do it...
How it works...
There's more...
Defining the XML node names
Loading data objects from XML text
Creating XML text files – saving XML directly to text files with XMLDocument.Save()
How to do it...
How it works...
Creating JSON strings from individual objects and lists of objects
How to do it...
How it works...
Creating individual objects and Lists of objects from JSON strings
How to do it...
How it works...
Virtual Reality and Extra Features
Introduction
The Big picture
Virtual reality
Gizmos
Saving/Loading data at runtime
Saving screenshots from the game
Getting ready
How to do it...
How it works...
There's more...
Saving and loading player data – using static properties
Getting ready
How to do it...
How it works...
There's more...
Hiding the score before the first attempt is completed
See also
Saving and loading player data – using PlayerPrefs
Getting ready
How to do it...
How it works...
See also
Loading game data from a text file map
Getting ready
How to do it...
How it works...
UI Slider to change game quality settings
Getting ready
How to do it...
How it works...
There's more...
Seeing/editing the list of quality settings
Pausing the game
Getting ready
How to do it...
How it works...
There's more...
Learning more about quality settings
Offering the user further game settings
Implementing slow motion
Getting ready
How to do it...
How it works...
There's more...
Customizing the slider
Adding Motion Blur
Creating sonic ambience
Using Gizmo to show the currently selected object in a scene panel
How to do it...
How it works...
Editor snap-to grid drawn by Gizmo
How to do it...
How it works...
Creating a VR project
Getting ready
How to do it...
How it works...
There's more...
Exploring free VR/XR samples/tutorials
Setup with Oculus Rift
Using a Single Pass if working with the Lightweight Rendering Pipeline
Adding 360-degree videos to a VR project
Getting ready
How to do it...
How it works...
There's more...
Playing 360-degree videos on the surface of a 3D object
Working with VR content inside a VR environment – the XR Editor
Getting ready
How to do it ...
How it works...
Automated Testing
Introduction
The big picture
Unit tests
Integration tests (PlayMode tests in Unity)
Generating a default test script class
How to do it...
How it works...
There's more...
Create a default test script from the Project panel's Create menu
Edit mode minimum skeleton unit test script
A simple unit test
How to do it...
How it works...
There's more...
Shorter tests with values in the assertion
Expected value followed by the actual value
Parameterizing tests with a data provider method
How to do it...
How it works...
Unit testing a simple health script class
How to do it...
How it works...
Script-class Health.cs
Script-class TestHealth.cs
Creating and executing a unit test in Play mode
How to do it...
How it works...
PlayMode testing a door animation
Getting ready
How to do it...
How it works...
PlayMode and Unit Testing a player health bar with events, logging, and exceptions
Getting ready
How to do it...
How it works...
PlayMode testing
Unit tests
See also
Bonus Chapters
Working with External Resource Files and Devices
Working with Plain Text, XML, and JSON Text Files
Virtual Reality and Extra Features
Automated Testing
Other Books You May Enjoy
Leave a review - let other readers know what you think
← Prev
Back
Next →
← Prev
Back
Next →