MATTHEW VENTURES
  • Home
  • Career
    • Resume
    • About Me
  • Get Into Game Dev
    • GIGD: Fundamentals
    • GIGD: C++ Topics
    • GIGD: Data Structures
    • GIGD: Patterns
    • GIGD: Multithreading
    • GIGD: Misc Coding
    • GIGD: Maths >
      • GIGD: Maths - Vectors I
      • GIGD: Maths - Vectors II
      • GIGD: Maths - Matrices
      • GIGD: Maths - Rotations
      • GIGD: Maths - Planes
      • GIGD: Maths - Polygons & Polyhedrons
      • GIGD: Maths - AABBs & OBBs
      • GIGD: Maths - Spatial Partitions
      • GIGD: Maths - Circles & Spheres
    • GIGD: Behavioral Questions
    • GIGD: Design Questions
    • GIGD: Asking Questions
    • GIGD: Additional Reading
    • GIGD: Practice Test
  • Personal
    • Recommendations
    • Beliefs
  • Misc
    • Side Quests
    • My Companies >
      • VVLLC
      • BVP
    • Research >
      • NASA
      • Glyph: Website
      • Glyph: Awards

Creating a Resume

1/11/2020

3 Comments

 
Attributes of a Standout Resume
What to write:
​- One page, one role

- Text is in bullet points

- Minimal color/images to guide the viewer, exclude portraits
- Highlight skills as you mention projects that involved them

- Only include your GPA if you're a new grad and it's impressive
- Include your links to your projects and email address
- Exclude your phone number and address​


​How to write:
- Reference numerically calculated results
- Summarize achievements rather than responsibilities
- Avoid using passive verbs (observed, participated, etc.)
Using Templates
I highly recommend finding an online template as a starting point. Try to find one that catches your eye though good design and color. When searching on Google, specifically search for a template that you can download an edit yourself rather than design in an online editor. Freesumes.com is a great option!
Picture
My Resume
Top right is an example of my resume as of November 2020, it uses images to draw attention to big brands (Facebook, Zynga, Stanford, etc.) as well as a minimal color pallet (blue border) to frame the page. My title as well as my graduation date are listed at the top. Skills are tucked away in the corner in addition to some jokes.
​
Quick Tip: The Long One-Page
Resumes should always be one page, but if you’re very close you can actually just make the page taller without folks noticing! Ingenious, right? I can use Microsoft word to extend the page size and, when it’s exported as a PDF, recruiter’s can’t tell that they scrolled the extra inch. Since people rarely print resumes these days it’s pretty hard to get caught with this trick so it’s definitely worth considering.
Quick Tip: Multiple Resumes
If you have multiple skills you may want to be seen as multiple applicants. In practice this might be a person, who is both a designer and engineer. In this case, they should create two resumes; one to focus on their design background and one on their engineering background. Avoid creating a resume that includes wildly different titles (for example, Matthew the artist/designer/engineer/CEO).
Case Study (Before and After): Scott
Below are two versions of my friend Scott's resume. This case study was a difficult challenge because Scott had a wide variety of background experiences, many unrelated to the jobs he was applying for. The key to revising this resume was nailing a specific title "Developer Relations Coordinator" and whittling down the experiences to the relevant examples. Notice how the headline of each experience clearly identifies the project, role, and date. The Profile section was used similar to a cover letter in order to frame his experiences. A bold line down the center helps the resume stand out. This resume could be further improved by making the role descriptions more concise and perhaps squeezing education into the top right if more space is required. Generally I would advocate avoiding a list of skills but it served as a nice space-filler in this case.
Picture
Picture
Case Study (Before and After): Melissa
Below are two versions of my sister Melissa's resume. The focus of this case study became balancing an appealing visual design with concise text to describe her work experience. I made a particular effort to replace vague statements such as "Generated cash flow" with measured, numerical achievements such as "Increased purchase orders by 10%". Excessive detail was removed where possible and a firm title of "Junior Business Associate" was placed directly beneath her name. This title and an objective section, similar to a cover letter, provide a space for her to briefly contextualize her work experience with respect to whichever position she applies to. 
Picture
Picture
Deep Dive
In this video, I provide feedback on the resume and portfolio of an aspiring Gameplay Engineer.
3 Comments

Downloading Google Sheets

11/5/2019

11 Comments

 
Introduction / Motivation
Sometimes it is helpful to think of games in terms of code and data. In this model, "data" contains the art, music, information, etc of a game and "code" contains the instructions of how to use it. When we design game architectures, we usually aim to separate the two when possible. This allows us to perform actions such as "patching" which means downloading remote data without the need to recompile our game. This is tremendously helpful when you have small changes you want to make and would prefer to avoid uploading the entire game again to the App Store or PlayStore (also useful if someone buys your game on a physical disk!)
​Using Google Sheets we can store and edit our data to make live changes to our games! This tutorial covers how to download CSV's from Google Sheets and then parse them for data!

Overview
In this tutorial we will breakdown an approach to downloading data from Google Sheets in a CSV format. This will allow you to update your game by simply changing a few values online! This approach will make use of three classes...
  • TermData - this class is a small structure which we will fill with the data we download
  • CSVDownloader - this class manages the download part
  • Loader - this class initiates the download  and manages the processing of data afterwards
I will be using this Google Sheet as my example. Its role is to contain translations for different terms. The far right column is the English and each row is a term translated differently for each column.

Note that the first cell is "3=English" instead of "English" this "3=" is a system I am using to denote the version of the document. When I make an update, I increment the version (for example the next version would be  "4="). 
Picture
TermData
CSVDownloader
Loader
11 Comments

Collecting Player Feedback

8/17/2019

14 Comments

 
Introduction / Motivation
In The Tipping Point Malcolm Gladwell explores how the success of a product can be impacted by that product's most passionate and knowledgeable users. He calls these users "mavens" or experts. He also explains how companies can create "maven traps" to solicit feedback from them. Our goal is to create these maven traps in our games so that if a passionate or expert user has feedback to provide, they have an easy means to do so!
Overview
We will be covering three methods of collecting user feedback including...
- Opening the user's email client
- Opening a link to a Google Form for the user to manually fill out
- Automatically completing a Google Form using a UnityWebRequest
This tutorial include snippets from the full FeedbackCollecter.cs found here.

Setup
I have created a simple Unity scene for testing which includes an input field, a button, and the script we will be writing. The script has the text of the input field and the button linked to it as Serialized Fields. There is also a serialized enum so that switch between methods.
Picture
Setup
I have created a simple Unity scene for testing which includes an input field, a button, and the script we will be writing. The script has the text of the input field and the button linked to it as Serialized Fields. There is also a serialized enum so that we can switch between methods.
For now, we don't need to worry about the last two lines, they will only be needed once we get to the Google Forms approach. the kReceiverEmailAddress should be initialized with the email address you would like the feedback emails to be sent to. This may be your email or your company's email. The following code will complete our setup including connecting several methods we will write to the submit button's onClicked event.
Opening the user's email client
For our first approach, we will use data entered into the text field to populate an email that will open on the native email app of their device. To do this, we construct a link using the information provided and we will make use of a OpenLink helper method. This method is required because we must escape space characters on iOS devices (they simply cannot open links that contain spaces, poor Apple). It would just so happen that google search results also reject spaces so I included that in the method in case you use it elsewhere in your code. (Preview of what it looks like on device: LINK).
Opening a Google Form
The email approach was great for empowering players but I have found it can sometimes be easier to sift through player data on a spreadsheet. Google Forms is an easy alternative. With the below method we can simply direct them to a form for them to fill out. This method will require that we create a Google Form on a Drive account. Then view the form and to find it's URL. That should look something like this:
"https://docs.google.com/forms/d/e/1FAIpQLSchQzdbNs_wY_EWSpAtohQHRDQeliy0o6yLoRs7C5D17B-1qg/viewform"
We will be using the "base URL" which is everything before the "viewform" in my case, my base URL would be:
"https://docs.google.com/forms/d/e/1FAIpQLSchQzdbNs_wY_EWSpAtohQHRDQeliy0o6yLoRs7C5D17B-1qg/"
Find your base URL and use it to for the 
kGFormBaseURL constant which we defined earlier.
Automatically completing a Google Form
The above code will successfully open a Google Form for the user to edit. But we can do better. Below is an approach that uses Unity's web request system to complete the Google Form all on its own. For this method to work we will need to find the kGFormEntryID we defined earlier. This ID corresponds to the question on the form, each question has a unique ID. To find the ID of your question, right click on the form, select "inspect page" then Ctrl+F your way to the text "entry." this text is a prefix of the ID we desire. See this .gif if you have any trouble finding it!
Picture
Once you find the entry ID, use it to properly intialize kGFormEntryID and then the below code will be good to go! Note that is makes use of a JSON serializer. This can be useful if you want to save data this is not a string. For example, you may desire to record a player's save data or settings. By converting this data into a JSON string, we can send it along to the form. However, we need to avoid using the utility when dataContainer is actually of type string because the serializer will otherwise convert the string to simply "{}". Not very helpful! 
These are only a few homebrew approaches to collecting player data, trying different approaches is the best way to find the right fit for your needs. Please consider "liking" this post or commenting on which aspects were most helpful / confusing. Your readership is very much appreciated!
14 Comments

Sending Emails From Your Unity Game

8/14/2019

16 Comments

 
Have you ever wanted to send emails from your Unity Indie Game? This tutorial covers two ways including direct emails, through the C# .Net, and forwarding the message through a server-hosted php script.​
Update (June 3, 2021):
Hey it's me, from the FUTURE! I would no longer recommend these methods expect in one special case where you do not want to show the user that you're sending an email (secret email). If it's okay to show the user the email, and allow them to send it from their personal address, I would advise an alternative approach: https://pastebin.com/EKHsvWNQ (also uploaded below if this link dies).
emailaddendum.cs
File Size: 1 kb
File Type: cs
Download File

Introduction / Motivation
Here are some reasons why you might consider sending emails from your game:
- Setup two-factor authentication
- Enable players to give you feedback or bug reports
- Secretly record error messages, crash logs, or suspicious player activity

For these purposes and more, we shall explore two methods of sending an email...

Overview of "Method 1: Direct message"
This method will require us to setup a Gmail account from which we can send an email using .Net libraries. This is the best, fastest, method for sending emails. However, this method will not work on games that are hosted online such as the WebGL target platform (for example a game hosted in-browser on itch.io).

Overview of "Method 2: Server request"
This method involves sending an email to a server script which can then forward our data to the destination address. This is a slower method and we face a greater risk of Gmail labeling our messages as spam. However, this method will work on all platforms.

Setup
I have created a simple Unity scene for testing which includes an input field, a button, and the script we will be writing. The script has the text of the input field and the button linked to it as Serialized Fields. There is also a checkbox we can toggle to switch between methods of delivery.
Picture

​Implementing "Method 1: Direct message"
First we need to create a Gmail account. I highly recommend creating a new one explicitly for this purpose because we will need to include both the username and password of this account in the source code. A naughty hacker could, in theory, get access to the code so please be careful what you include there.

With our Gmail setup, we can now start defining the code for our Emailer.cs file. Some code is preceeded by the comment "Method 2" to let you know it will not be needed for this first approach. Mind the import statements here which include the .Net libraries we will need to verify our email credentials. Of course, make sure you replace my email credentials with yours.

By using the .Net support for emailing along with the Gmail we created, the above method SendAnEmail will reliably get our message where it needs to go! However, a limitation of this method is that it will not work on WebGL games. For these cases, we need to consider an alternative approach.

​Implementing "Method 2: Server request"
Method 2 will allow us to send a WWW request to a server-hosted php script that can forward our data. While it is not as fast or reliable as Method 1, it does work on all platforms! The C# side of this approach is included in the code of Emailer.cs (above) and includes creating a WWWForm with the data we want to send, then forwarding it to our server. With that aspect completed, all that is left for us to do is create and host our server script! Let's setup the hosting first.
​I used the free hosting website 
https://www.000webhost.com.
Using 000webhost
If you choose to use their hosting services as well, select the "Create a new Site" button on their "My Sites" page. Record the website name and password somewhere safe!
Then look inside the "Create new website" options for a "Upload own website" button. From there you can select "New File", and later "Edit", on the top right toolbar to create your server script.
Picture
Once you have a server host setup you can use the code of "Emailer.php" (below) to receive the form we sent from our C# code. This code ensures that it is receiving a form with the necessary data before sending an email. The headers include data which is meant to suppress Gmail's spam filters allowing your message to reach an inbox as desired (however in my test, it did get stuck in a spam folder at first).

These are only two of many approaches you may consider for sending emails in your games. Please consider "liking" this post or commenting on which aspects were most helpful / confusing. Your readership is very much appreciated!
16 Comments
Forward>>
  • Home
  • Career
    • Resume
    • About Me
  • Get Into Game Dev
    • GIGD: Fundamentals
    • GIGD: C++ Topics
    • GIGD: Data Structures
    • GIGD: Patterns
    • GIGD: Multithreading
    • GIGD: Misc Coding
    • GIGD: Maths >
      • GIGD: Maths - Vectors I
      • GIGD: Maths - Vectors II
      • GIGD: Maths - Matrices
      • GIGD: Maths - Rotations
      • GIGD: Maths - Planes
      • GIGD: Maths - Polygons & Polyhedrons
      • GIGD: Maths - AABBs & OBBs
      • GIGD: Maths - Spatial Partitions
      • GIGD: Maths - Circles & Spheres
    • GIGD: Behavioral Questions
    • GIGD: Design Questions
    • GIGD: Asking Questions
    • GIGD: Additional Reading
    • GIGD: Practice Test
  • Personal
    • Recommendations
    • Beliefs
  • Misc
    • Side Quests
    • My Companies >
      • VVLLC
      • BVP
    • Research >
      • NASA
      • Glyph: Website
      • Glyph: Awards