Special Input Output

Project Information

  1. Dev team & Development environment
  2. Development Process
  3. Gameplay
  4. Post Mortem

Game mechanics showcase

  1. Hand Tracking
  2. Environment
  3. Computer Mechanic
  4. Phone Mechanic

Project Information

The project was called Special input output, we had to make a project where we would use a unique input device to make something, so it could have been something from a game to a website or something else, besides the game we had to make bunch of documents explaining our idea. This time we only got 6 weeks and really got rushed because of other school subjects aswell.

For this project i worked alone since i didnt want any headaches about git and miscommunication, and i first wanted to make something with HTML but then decided to stick with Unity 3D and use the Leap Motion handtracking module which had a unity package available, making it a bit easier for me

I originally wanted alot of gameplay elements which would be something simular to Calm Down Stalin, a game that originally was controlled with the mouse but also had a VR port where you would sit at a desk and be able to interact with the environment But i didnt have enough time for reasons explained in the post mortem. At the start i had installed the package and played around with the handtracking and the various components the Leapmotion team had developed, after that i started working on the environment itself, i then added some buttons and objects that the player could interact with. then i started working on the computer mechanics, it being able to switch from the idle mode to the game mode and then making the raycasts work for the finger tracking Then i worked on the phone, adding in some more objects to interact with and then worked more on the required documents Here you can see some gifs of early testing/development

Theres isnt alot of gameplay since i had to focus most of my time making documents, but overal you can interact with the environment as you can see here. most objects are grabable but sometimes might behave weirdly.

The 2 main gameplay mechanics of the 'game' are the computer where you can play literal point and click game where you have to 'shoot' all the balls on the screen. The 2nd gameplay mechanic is the phone in the corner that you can access by sliding the UI right to move the camera, you can pick up the phone talk and hear some cartoon talking noise thats about it, i wanted to have more but due to time constrains i couldnt here are gifs showing the 2 gameplay mechanics, for more info go the mechanics part of the page

I did find it fun to make this kind of a game but when i was done i was super frustrated since i got a 6 as final score, all that work when i got a decent grade when it should be atleast a bit higher. most of the time i could have put to developing and polishing the game was put into making documents since i never got concrete information on what to do and since this project was treated as a part of my education final score i didnt want to take any chances. at the end of the project i understandable had to turn in the leapmotion device for the 1st years that will have the same project a year later Overal a great example how miscommunication and vague explanations can burn me out, i only really was burned out from projects when they were realy vague and i had to shoot shots in the dark to hopefully get it all right

Game Mechanics

The whole game was build around the handtracking that was implemented by the Leapmotion team working on the Unity package that made it all possible, without any other work then importing the package and plugging in the handtracking module i was able to get my hands in the game. the package also included a couple of test scenes showing off the different features of the unity package. Here is a gif showing of early tests of me playing around with the interaction

Heres also a video me messing around with the interaction after making importing some 3d models and putting it all together Volume warning!!!

Because the player is tied to the hand tracking i wanted to have a static environment where the player could stay in 1 place and everything would be around the player. I wanted first to have big rectangle desk but then i decided to have a cubical desk so i didnt have to worry about where the desk & player is

The computer has a idle state where it just shows a video on the screen of a half life speedrun, then if you click the button on the UI you can start the lazer game, you can see your pointer finger now shows a lazer going out and there will be a button on the left side that you can click to "shoot" on screen a bunch of randomly moving balls will spawn in and to win you have to shoot all of them then a win screen will show up.

Here you can see the seperate areas of the game, the left one is where the player is and the right one is what is shown on the screen when the players plays the lazergame, the green walls are colliders that stop the balls from going off the platform and the pyramid shaped is the viewport of the camera that outputs the view to the computer screen

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

IEnumerator SpawnTargets() { if (Spawning) { for (int i = 0; i < Target_Amount; i++) { yield return new WaitForSecondsRealtime(Spawn_Cooldown); if (Spawning && gamescreen.activeInHierarchy) { GameObject newtarget = Instantiate(Target); targets.Add(newtarget); } } Spawning = false; } if (!Spawning) { TargetsSpawned = true; } } public void Activate_Game() { normalscreen.SetActive(false); gamescreen.SetActive(true); Spawning = true; StartCoroutine(SpawnTargets()); } public void Deactivate_Game() { normalscreen.SetActive(true); gamescreen.SetActive(false); GameOverScreen.SetActive(false); TargetsSpawned = false; GameEnded = false; DestroyTargets(); } public void RestartGame() { GameOverScreen.SetActive(false); TargetsSpawned = false; GameEnded = false; Spawning = true; StartCoroutine(SpawnTargets()); } public void DestroyTargets() { targets.Clear(); TargetScript[] targets_to_destroy = FindObjectsOfType<TargetScript>(); foreach (TargetScript target in targets_to_destroy) { target.DestroySelf(); } }

You can pick up the phone and a cartoon talking sound will play, then you can put the phone back by putting it near the base, you can also reset the phone position if you accidently lose/drop the phone somewhere

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

public class Phone_Script : MonoBehaviour { public bool isplaying; Vector3 startingpos; Quaternion startingrot; public GameObject phone; private InteractionBehaviour behaviour; public SoundManagerScript soundmanager; public bool nearbase; public bool isgrasped; float vol; private void Start() { soundmanager = FindObjectOfType<SoundManagerScript>(); startingrot = transform.rotation; startingpos = transform.position; behaviour = phone.GetComponent<InteractionBehaviour>(); vol = soundmanager.SFXVolume; soundmanager.phonesource.volume = vol; InvokeRepeating("WaitForPhone", 0, 3); } private void Update() { if (behaviour.isGrasped) { soundmanager.phonesource.volume = vol; if (!isplaying) { PlaySFX(); } } else { soundmanager.phonesource.volume = 10f; } } void PlaySFX() { if (behaviour.isGrasped) { isplaying = true; soundmanager.PickUp(); } } public void WaitForPhone() { if (nearbase && !behaviour.isGrasped) { ResetPosition(); if (isplaying) { soundmanager.HangUp(); isplaying = false; } } } public void ResetPosition() { transform.position = startingpos; transform.rotation = startingrot; } }