se 320 – introduction to game development lecture 7: programming lecturer: gazihan alankuş please...
TRANSCRIPT
1
SE 320 – Introduction to Game Development
Lecture 7: ProgrammingLecturer: Gazihan Alankuş
Please look at the last two slides for assignments (marked with TODO)
2
Sample Games in Homework
• URL was: http://u3d.as/content/m2h/c-game-examples/1sG
• What were the things that you found interesting?
• What have you learned?• What were your issues?– Let’s quickly go over the games– Jump in when we are close to your question!
3
How does a game work?
• You write code– that is able to manipulate the game world
• That code is ran– at certain points in time
• You manipulate game state
4
Game State
• Examples– HP (life)– Ammo– Inventory items– Cool-down time for a skill– Experience
• More examples from actual games
5
Implementing State
• Variables in your custom componentspublic class LifeManager : MonoBehaviour {
public float HP;}
• The instance of the component will reflect state of the game object that it is attached to.– Different instances of your prefab will have
different values for the state variables
6
Implementing State
• Locality of state – which component should keep which state?– One component that keeps HPs of all characters in
the game? – Every character keeps his own HP?
7
Accessing Objects in the Scene
• Getting another game object– GameObject enemy = GameObject.Find(“enemy”); //or the one
below– public GameObject enemy; //drag to this
• Getting a component – Attached to the same game object
• MyComponent c = GetComponent<MyComponent>();
– Attached to some other game object• MyComponent c = enemy.GetComponent<MyComponent>();
• Using parent/child relationships– Transform parentsTransform = transform.parent;– GameObject parent = transform.parent.gameObject;
2/10/2012
8
Accessing Objects in the Scene
• It’s slow to keep calling GameObject.Find(“..”) • Make connections in the Awake function
public class Player: MonoBehaviour {GameObject enemy;void Awake() {
enemy = GameObject.Find("enemy");}
}
9
Data Types in Unity
• Some standard data types– Vector3 (position, direction, displacement)– Quaternion (orientation, rotation)
• Details of standard components– Transform, Collider, Renderer, RigidBody
• Basic data structures in C#– List, Dictionary, etc.
2/10/2012
10
Vector3
• Vector3 means “three dimensional vector”• Just three floats: x, y and z• Often used for talking about a 3D position or
direction– Contains methods/properties that help in this
domain• e.g., transform.position is a Vector3
2/10/2012
12
Vector3: some constants
• Vector3.zero == new Vector3(0, 0, 0)• Vector3.one == new Vector3(1, 1, 1) (LOL)• Vector3.forward == new Vector3(0, 0, 1)• Vector3.back == new Vector3(0, 0, -1)• Vector3.up == new Vector3(0, 1, 0)• Vector3.down == new Vector3(0, -1, 0)• Vector3.right == new Vector3(1, 0, 0)• Vector3.left == new Vector3(-1, 0, 0) 2/10/2012
13
Vector3: Averaging (interpolating)
• Vector3.Lerp(v1, v2, fraction)
• Vector3.Slerp(v1, v2, fraction)
2/10/2012
v1 v2
0 fraction 1
v1 v2
0fraction
1
origin (0, 0, 0)
14
Vector3: Geometric operations
• Vector3.Scale(v, s)• Vector3.Project(v, vbase)• Vector3.Angle(v1, v2)• Vector3.Distance(v1, v2)• Vector3.Dot(v1, v2)• Vector3.Cross(v1, v2)
2/10/2012
15
Vector3: operators
• v1 + v2 – Adds x, y, z values separately and returns the sum
vector• 3.5 * v– Multiplies x, y, z with 3.5
2/10/2012
16
Quaternion
• Has four values (x, y, z, w). What are they?– Don’t worry about its mathematical definition (has four
values, etc. don’t care because they won’t make sense in our context)
• Is simply (both of these below are true)– A vector and an angle
• Rotate around that vector with that angle
– Three consecutive rotations around z, x and y axes• Represents– Orientation (rotate to here from default orientation)– Rotation (change in orientation)
2/10/2012
18
Quaternion: its value that makes sense
• q.eulerAngles– Vector3 that contains rotations around axes– Rotation order is z, x, y (but you don’t have to
care)• q.ToAngleAxis(out angle, out axis)– sets the angle and axis variables that you give to it– rotation around that axis with that angle amount
2/10/2012
19
Quaternion: operations
• q1 * q2– the result is the rotation that is equal to: rotate with q2 first, and
then with q1– or, if q2 is orientation of something, rotates it with q1 (same thing,
slightly different interpretation)• q * v
– rotate v with q• Quaternion.Dot(q1, q2)• Quaternion.AngleAxis(angle, axis)• Quaternion.Euler(x, y, z)• Quaternion.Inverse(q)• ...2/10/2012
20
Quaternions: Averaging (interpolating)
• Quaternion.Slerp(q1, q2, fraction)– The correct way to interpolate two quaternions
• Quaternion.Lerp(q1, q2, fraction)– Slightly faster, bad interpolation (moves faster in
the middle)
2/10/2012
22
Standard components
• Have – Properties (variables)
• Can’t modify• Can set for an instance
– Functions• Can call for an instance
– Class functions (static)• Can call with the class name, without an instance
– Messages• Functions are called on all components that are attached to
the GameObject when events happen (via SendMessage)
2/10/2012
23
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 of the orientation (the arrows you see)
2/10/2012
24
Global vs. Local
2/10/2012
p
c
p.position ==
p.loca
lPositi
on
c.localPosition
c.position
c.transform.parent == p.transform
25
Global vs. Local
2/10/2012
p
c
p.position == p.lo
calPosition
c.localPosition
c.position
Red ones changed as a result of moving the parent
All of this is the same for rotation and localRotation
27
Colliders
• c.isTrigger– True• Not used in physics calculations, lets things through• OnTriggerEnter is sent to the GameObject (and its
components)
– False• Used in physics calculations, won’t let things through• OnCollisionEnter is sent to the GameObject (and its
components)
2/10/2012
28
Colliders
• c.material– The physics material (PhysicMaterial)• friction constants• bounciness
2/10/2012
29
Standard components• Have
– Properties (variables)• Can’t modify• Can set for instance
– Functions• Can call for instance
– Class functions/class variables (static)• Can use with class name, without
an instance. Like global variables but in class.
– Messages• Functions are called on all
components that are attached to the GameObject when events happen
• Examples– t.position = t.position +
Vector3.up;
– t.Translate(1, 1, 1)
– Vector3.Lerp(v1, v2, f)– Vector3.up
– Update()– OnCollisionEnter() – OnCollisionEnter(Collision
collision)
2/10/2012
31
Collection Data Structures in C#• using System.Collections;
using System.Collections.Generic;
• List<GameObject> enemies = new List<GameObject>();– loop with foreach, access enemies[5]
• Dictionary<string, GameObject> enemiesByName = new Dictionary<string, GameObject>();– access by enemy name.
enemiesByName[“wolf”]
– loop with foreach• Amazing resource: http://www.dotnetperls.com/• Also should watch:
http://channel9.msdn.com/Series/C-Sharp-Fundamentals-Development-for-Absolute-Beginners/Working-with-Collections-21
32
Game Structure• You will have GameObjects for various elements in your game (character,
enemy, robot, etc). Create their own scripts and put code specific for them.
• You also need to have code that is common for the game (scoring is an example). Attach such scripts on the camera or on a similarly unique object.
• Wire them up in Awake()• For common singletons, create
– static MyScript instance;– public static MyScript getInstance() { return instance; }– public MyScript() { instance = this; }
• And in other scripts, – MyScript myScript = MyScript.getInstance();– Easier than GameObject.Find()
2/10/2012
33
TODO: Homework• Start with your own Homework 3 (ask the assistant if you haven’t done it)• Add a bullet prefab that you will use to make your character throw bullets• You already should have a monster prefab. Add a 3D text over its head that you will use to
display the monster’s remaining life percentage. • Create a MonsterLifeManager component that will handle changing and displaying life of the
monster that it’s attached to. • Make it so that the space key will throw a bullet towards which your character is facing
(transform.forward). The bullet needs to remember this initial direction and should move proportional to time at each frame (update) towards this direction.
• When a bullet hits a monster, it should reduce its life by a random value between 5 and 10. Initially life is 100. When life gets to zero, the monster disappears.
• You should have at least three monsters in the scene• Bonus: reduce monster’s life depending on the body part that is hit (headshot, etc.)• Get Özkan to grade it
– [email protected] – Subject (paste this): SE 320 Homework 7– What to send:
• Assets -> Export package • File -> Build Settings -> Web player -> Build