SE 350 * Programming Games

SE 350 – Programming Games
Lecture 6: Programming with Unity
Lecturer: Gazihan Alankuş
Please look at the last slide for assignments (marked with TODO)
2/10/2012
1
Today
• Cover most topics about scripting in Unity
2/10/2012
2
The BEST Development Environment
for Unity Scripting that I Know of
• Visual Studio + Resharper for coding
– I asked for a classroom license. I also sent an e-mail. Still
waiting. In the meantime go ahead and install the 30 day
version.
• MonoDevelop for occasional line-by-line debugging
(explained towards end of presentation)
• If you are using any other way, you would certainly
develop a better game if you listen to me
• (If you disagree, talk to me before discarding my
advice… I have worked on large projects.)
2/10/2012
3
Pointer Fun with Binky
• No class talking about references is complete
without Binky!
• This is not a joke. If you don’t get why you
watched it, please ask.
• http://en.wikipedia.org/wiki/File:Pointer_Fun
_with_Binky_(Java).ogg
2/10/2012
4
Variables with class Types are References
Variables with struct Types are values
• Transform transform;
• GameObject myObject;
• Structs do not work that way
– Vector3, Quaternion, etc.
– Vector3 v = new Vector3(0, 0, 1);
– Vector3 v1 = v;
– v1.x = 1;
– //v.x == 0 still
2/10/2012
5
Operator Overloading
• Vector3 v3 = new Vector3(v1.x + v2.x, v1.y +
v2.y, v1.z + v2.z);
• Is equivalent to
• Vector3 v3 = v1 + v2;
• 0.5 * Vector3.up
– Etc.
2/10/2012
6
Components and Scripts
• Components are added to game objects and
appear in the inspector
• Scripts (MonoBehavior) are custom
components that you create
– public variables appear in the inspector
– Can have functions for handling GameObject’s
events (Update, OnCollisionEnter, etc.)
2/10/2012
7
Game Objects and Components
• Your code runs in the context of the component
• You can access
– The game object that it is attached to
• gameObject
– Other components that are attached to the same game
object
• GetComponent<ComponentType>()
• Shortcuts for standard components (transform, renderer, etc. )
– Parent game object in the hierarchy
• transform.parent.gameObject
– Other game objects in the scene
• GameObject.Find(“Game object’s name”)
– There are more (find all components in this hierarchy, etc.)
2/10/2012
8
Accessing Things
Game Object
Components
Transform
GetComponent<Transform>()
transform
GetComponent(“Transform”)
MyOtherScript
(MonoBehavio
r)
Cube
GetComponent<MyOtherScript>()
GetComponent(“MyOtherScript”)
gameObject
Bushes
2/10/2012
MyScript
(MonoBe
havior)
Red text shows how this component accesses others
GameObject.Find(“Bushes”)
9
Using the Inspector as a Guide
• Don’t try to memorize anything. Just look at the inspector and
you’ll figure it out.
2/10/2012
10
If you can do it through the user
interface, you can script it
• You can access anything
• You can tell them to do anything
• Use the inspector and hierarchy as starting
points
2/10/2012
11
Which Game Object Do You Attach
Your Script to?
• It only changes
– Whose components you want to access easily
– Whose events you want to react to
• If these are not important for the script, it can
be in one of the standard objects (camera,
etc.)
2/10/2012
12
Let’s do some examples
• How do I reach this object?
• How do I tell him to do something?
2/10/2012
13
Better Ways of Scripting
• Reaching game objects by name
– Is slow (string comparisons)
– Is static (have to have that specific name, difficult to reuse
for something else)
• Another way is to expose references in the inspector
(public) and make connections in the user interface
• However, the inspector can be an overkill, and you still
may want to find game objects by name
– Don’t keep calling GameObject.Find() and GetComponent()
– Make connections in the Awake() function
• It’s faster to use references that are already set
2/10/2012
14
Connecting Objects in Awake()
• Awake runs before anything else. So, it is the
preferred place for setting up connections
– otherObject = GameObject.Find(“other object”);
– otherComponent =
GetComponent<OtherComponent>()
– Later use these variables during the game, just like
you use the references to the standard
components (transform, renderer, etc.)
2/10/2012
15
Creating and Destroying Objects while
the Game is Running
• Instantiate(game object or prefab, position,
rotation)
• Destroy(game object)
2/10/2012
16
Some Basic Data Types (struct, not
class)
• Vector3
– For positions and directions
• Quaternion
– For orientations and rotations
2/10/2012
17
Transform
• transform.position
• transform.rotation
– With respect to the world. Changes when parent changes.
– Not what you see in the inspector.
• transform.localPosition
• transform.localRotation
• transform.localScale
– With respect to the parent. Does not change when parent
changes.
– What you see in the inspector
• transform.right, transform.up, transform.forward
– x, y, z axes that you see
2/10/2012
18
Data Structures with Unity
•
•
•
•
Don’t underestimate. It’s C#! You can do anything!
Classes, objects, references
Variables, structs
Collections ArrayList, List<>, Dictionary<,>
– using System.Collections.Generic;
• Enums
• Classes in separate files or within other classes
– Use them to group variables together
• This would help even if you don’t know Java:
– http://www.25hoursaday.com/CsharpVsJava.html
2/10/2012
19
Some Coding Demonstration
2/10/2012
20
•
Debugging with MonoDevelop while
Coding in Visual Studio at the Same
Time
Do this once after you created your Unity project
– Edit->Preferences->External Tools is where you set the IDE that Unity will fire
• Select Visual Studio
– Double-click a script, this will create the Visual Studio project
• Select MonoDevelop
– Double-click a script, this will get the project in MonoDevelop’s recents
• Select Visual Studio again
– Close everyting
• Do this at every run
– Run MonoDevelop without running Unity
– Select the project that is already in the recent projects
– Run->Debug
• This will run Unity
– Set a breakpoint in MonoDevelop and see how it stops at that breakpoint
– Run Visual Studio by either
• running it from the start menu,
• Or ensuring Edit->Preferences->External Tools is Visual Studio and double clicking on a
script.
– This does not affect MonoDevelop
2/10/2012
21
How to go about working with code
• Access what you are interested in
– Easy, just use the inspector as a guide
• Get the value, it will probably be an object of a
class
– For example: Vector3
• Read about it in the script reference
– http://unity3d.com/support/documentation/ScriptRef
erence/
• Also, search for random stuff in the script
reference. It’s likely to lead in the right direction.
2/10/2012
22
How to improve yourself in C#
• Unity and C# tutorials in catlikecoding.com are
good
• http://channel9.msdn.com/Series/C-Sharp-FundamentalsDevelopment-for-Absolute-Beginners is not
bad. If you
don’t have enough time, watch 9, 14, 15, 21
• It’s fastest to learn from examples!
– The five games that you already saw:
http://u3d.as/content/m2h/c-game-examples/1sG
2/10/2012
23
TODO: Projects
• Every member of the group will send me a
separate weekly report about what you did
that week about the project
– This is private. Do not share with others.
– Just write it as an e-mail. No attaching word
documents or pdfs please!
– Send them every Thursday night!
2/10/2012
24
TODO: Midterm Exam
• Date: 21 March 2012
Time: 18:30 - 20:20
Place: A2
• No questions about the Maya interface
2/10/2012
25