SE 320 – Introduction to Game Development

33
SE 320 – Introduction to Game Development Lecture 7: Programming Lecturer: Gazihan Alankuş Please look at the last two slides for assignments (marked with TODO 1

description

SE 320 – Introduction to Game Development. Lecture 7 : Programming Lecturer: Gazihan Alankuş. Please look at the last two slides for assignments (marked with TODO ). Sample Games in Homework. URL was: http:// u3d.as/content/m2h/c-game-examples/1sG - PowerPoint PPT Presentation

Transcript of SE 320 – Introduction to Game Development

Page 1: SE 320 – Introduction to Game Development

1

SE 320 – Introduction to Game Development

Lecture 7: ProgrammingLecturer: Gazihan Alankuş

Please look at the last two slides for assignments (marked with TODO)

Page 2: SE 320 – Introduction to Game Development

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!

Page 3: SE 320 – Introduction to Game Development

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

Page 4: SE 320 – Introduction to Game Development

4

Game State

• Examples– HP (life)– Ammo– Inventory items– Cool-down time for a skill– Experience

• More examples from actual games

Page 5: SE 320 – Introduction to Game Development

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

Page 6: SE 320 – Introduction to Game Development

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?

Page 7: SE 320 – Introduction to Game Development

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

Page 8: SE 320 – Introduction to Game Development

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");}

}

Page 9: SE 320 – Introduction to Game Development

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

Page 10: SE 320 – Introduction to Game Development

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

Page 11: SE 320 – Introduction to Game Development

11

Vector3: related to magnitude

• v.normalized• v.magnitude• v.Normalize

2/10/2012

Page 12: SE 320 – Introduction to Game Development

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

Page 13: SE 320 – Introduction to Game Development

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)

Page 14: SE 320 – Introduction to Game Development

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

Page 15: SE 320 – Introduction to Game Development

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

Page 16: SE 320 – Introduction to Game Development

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

Page 17: SE 320 – Introduction to Game Development

17

Quaternion

• q.x, q.y, q.z, q.w– DON”T CARE!!!1!!!– NEVER USE THEM!!!!! >:@

2/10/2012

Page 18: SE 320 – Introduction to Game Development

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

Page 19: SE 320 – Introduction to Game Development

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

Page 20: SE 320 – Introduction to Game Development

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

Page 21: SE 320 – Introduction to Game Development

21

There are more

• Ray, Rect, Vector2, Vector4, etc.• Use the scripting reference

2/10/2012

Page 22: SE 320 – Introduction to Game Development

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

Page 23: SE 320 – Introduction to Game Development

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

Page 24: SE 320 – Introduction to Game Development

24

Global vs. Local

2/10/2012

p

c

p.position ==

p.loca

lPositi

on

c.localPosition

c.position

c.transform.parent == p.transform

Page 25: SE 320 – Introduction to Game Development

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

Page 26: SE 320 – Introduction to Game Development

26

Renderer

• r.material• r.isVisible

2/10/2012

Page 27: SE 320 – Introduction to Game Development

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

Page 28: SE 320 – Introduction to Game Development

28

Colliders

• c.material– The physics material (PhysicMaterial)• friction constants• bounciness

2/10/2012

Page 29: SE 320 – Introduction to Game Development

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

Page 30: SE 320 – Introduction to Game Development

30

There are many other components

• Use the scripting reference!

2/10/2012

Page 31: SE 320 – Introduction to Game Development

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

Page 32: SE 320 – Introduction to Game Development

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

Page 33: SE 320 – Introduction to Game Development

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