top of page

Placing Picasso

  • Writer: Michael Jusman
    Michael Jusman
  • Nov 29, 2023
  • 1 min read

Placing Picasso is a puzzle game based on cubism paintings that was made as a University project. The team had 3 people working on it, my role was as a programmer and UI. I also did the character animations in the game.

Project Description
  • Project Type : University project

  • Duration : 20 February 2023 - 7 May 2023

  • Engine : Unity

  • Language : C#

  • Roles : UI Designer, Programmer, Animator

  • Other Apps : Figma, Procreate, Photoshop, Illustrator, Excel

My Contributions
Mr. Moustache Animation & Reaction

When making the game, we wanted a way for the player to know how far they were from the correct location. we felt that we needed this function due to the fact that cubism painting can be quite abstract and the less artistically inclined players seems to struggle when assembling the puzzle. We decided that a companion of some sort was needed to guide the players by their reaction to what the player is doing.


This is Mr. Moustache, designed and created by another team member, Emily. I was tasked to create animations of him, creating different expression depending on how well the player were doing, along with some voice accompanying the animation.


Mr. Moustache himself is made out of separated pieces and was animated in Unity. We did it this way so that we could be more flexible with what expression he could have. It also reduced the workload on our artist, as she needed to make other paintings.


To control the expression Mr. Moustache gives, our other programmer, Lilli, who was in charge of gameplay, made a range parameter that I could adjust and call whichever reaction that I think fits what the player is doing.

Here is a code snippet from the function that I wrote:

public void ProtagonistAnim()
    {
        switch (characterEmotion)
        {
            case CharacterEmotion.Enter:
                textBox.text = "We need to restore the painting";
                break;
                
            ....
            
            case CharacterEmotion.Idle:
                anim.SetTrigger("Idle");
                textBox.text = "A few more pieces";
         }
     }

Here is an example of how Mr. Moustache reacts to gameplay:


Main Menu Gallery Hall

When making the main menu, I wanted the menu to feel like a part of the gallery itself, so I made a room with paintings there, where when you click on a painting, the camera zooms into the painting and brings you to the level itself. This is how I want the player to choose a level, and to differentiate selectable levels from the un-selectable ones, I used a light fixture, where the lit up ones are the playable levels. I also made the credits and exit a motion in the main menu, where the credits is one of the side wall, while the exit is the player physically exiting the building.


Other UI Programming

I wrote UI & audio related code for the project, here are a few example of the scripts that i made.


Audio Slider Script:

void Start()
    {
        audioMixer.SetFloat("Volume", Mathf.Log10(PlayerPrefs.GetFloat("Volume", 1) * 20));
    }

    public void OnChangeSlider(float Value)
    {

        switch (audioType)
        {
            case AudioType.BGM:
                soundSource = bgmSource.GetComponent<AudioSource>();
                bgmMix.audioMixer.SetFloat("Volume", Mathf.Log10(Value) * 20);
                break;

            case AudioType.Player:
                soundSource = playerSource.GetComponent<AudioSource>();
                playerMix.audioMixer.SetFloat("Volume", Mathf.Log10(Value) * 20);
                break;

            case AudioType.Effects:
                soundSource = effectsSource.GetComponent<AudioSource>();
                effectsMix.audioMixer.SetFloat("Volume", Mathf.Log10(Value) * 20);
                //udioMixer[audio]a
                break;
            case AudioType.Master:
                audioMixer.SetFloat("Volume", Mathf.Log10(Value) * 20);
                break;

        }

        // Update is called once per frame
        //void Update()
        //{

        //}
    }

Level Selector Script:

private void OnMouseOver()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Debug.Log(gameObject.name + " is being clicked");
            cam.GetComponent<CameraMovement>().PlayAnimation(gameObject.name.ToString());
        }
    }

 
 

© 2035 by Michael Jusman. Powered and secured by Wix

bottom of page