SE 320 – Introduction to Game Development Lecture 7: Programming Lecturer: Gazihan Alankuş Please...

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

Transcript of SE 320 – Introduction to Game Development Lecture 7: Programming Lecturer: Gazihan Alankuş Please...

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

11

Vector3: related to magnitude

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

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

17

Quaternion

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

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

21

There are more

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

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

26

Renderer

• r.material• r.isVisible

2/10/2012

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

30

There are many other components

• Use the scripting reference!

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