330 likes | 495 Views
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
E N D
SE 320 – Introduction to Game Development Lecture 7: Programming Lecturer: GazihanAlankuş 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 • 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!
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
Game State • Examples • HP (life) • Ammo • Inventory items • Cool-down time for a skill • Experience • More examples from actual games
Implementing State • Variables in your custom components public 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
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?
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;
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"); } }
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.
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
Vector3: related to magnitude • v.normalized • v.magnitude • v.Normalize
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)
Vector3: Averaging (interpolating) • Vector3.Lerp(v1, v2, fraction) • Vector3.Slerp(v1, v2, fraction) v1 v2 0 fraction 1 v1 v2 fraction 0 1 origin (0, 0, 0)
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)
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
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)
Quaternion • q.x, q.y, q.z, q.w • DON”T CARE!!!1!!! • NEVER USE THEM!!!!! >:@
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
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) • ...
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)
There are more • Ray, Rect, Vector2, Vector4, etc. • Use the scripting reference
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)
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)
Global vs. Local c.transform.parent == p.transform c.localPosition c p c.position p.position == p.localPosition
Global vs. Local Red ones changed as a result of moving the parent All of this is the same for rotation and localRotation c.localPosition c p p.position == p.localPosition c.position
Renderer • r.material • r.isVisible
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)
Colliders • c.material • The physics material (PhysicMaterial) • friction constants • bounciness
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)
There are many other components • Use the scripting reference!
Collection Data Structures in C# • using System.Collections; usingSystem.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
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 MyScriptgetInstance() { return instance; } • public MyScript() { instance = this; } • And in other scripts, • MyScriptmyScript = MyScript.getInstance(); • Easier than GameObject.Find()
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 Özkanto grade it • ozkansayin.ieu@gmail.com • Subject (paste this): SE 320 Homework 7 • What to send: • Assets -> Export package • File -> Build Settings -> Web player -> Build