Board game programming tutorial

Now that I have created several board game conversions in Unity, I thought that it might be useful to create a tutorial that describes the process that I go through to make a game.

In this tutorial, I’ll start with a common set of code from prior games and some basic art. I’ll create a new Unity project, import all the reuse code and plugins that I use, and make a complete game.

There is a set of videos to go along with this post which show all the steps that I perform in the Unity game builder.

I’ve also saved my Unity project at a few points along the way so that you can skip ahead or make sure that your project matches mine.

In this post, I’m going to cover all the reuse code and the reasoning behind it. I’ll setup the project, import all the plugins, scripts and assets that I’ll need. Then I’ll build the main menu.

In the next post, I’ll build the UI for the game itself and create the scripts for modeling the game. [Coming soonish] Continue reading “Board game programming tutorial”

Programmatic use of windows search

I recently wanted to add a photo search capability to my Timeline program and discovered that you can open a windows explorer with a custom search. You can also type these searches directly into the address bar in a windows file explorer.

The key is the search-ms protocol. It allows programs (like windows explorer) to directly query the windows search index. The parameters to this command are somewhat obscure, but it is very flexible and it can be used to perform any search that you could perform with the graphical search function in the windows file explorer.

For my application, I wanted to search for all photos that were taken between two dates (the start and end date of an event on my timeline). The idea is to quickly find all the photos that I took on a trip or at an event.

The general syntax for the search-ms command is:

search-ms:query=<query string>&
          crumb=<location and display parameters>&
          syntax=<NQS or AQS(default)>

The query string can be any valid SQL or AQS search. For my application I wanted to query on the date my photo was taken which windows stores as “datetaken” and I wanted to query over a range of dates. Dates have to be in the YYYY-MM-DD format, and a range is specified with “..”.

I used the crumb specifier to target a just the “My Pictures” special folder. To specify a location you put crumb=location:<URL encoded path>. For a special folder you do crumb=location:shell%3a<folder name>.

So my final query string is:

search-ms:query=datetaken:2015-01-01..2016-01-01&crumb=location:shell%3aMy%20Pictures

You can type or copy this into your search bar to see all the photos you took in 2015.

From C# you can start a process by giving the name of a file that has a default program association. So launching a file explorer with a custom search is as easy as:

System.Diagnostics.Process.Start("search-ms:query=datetaken:" + 
  Start().ToString("yyyy-MM-dd") + ".." + End().ToString("yyyy-MM-dd") +
  "&crumb=location:shell%3aMy%20Pictures");

How To: Open the same Unity project twice

When making my first networked game in Unity, I found a way to keep two copies of the same project open at once. Unity will usually only open the same project one time. In a networked application, this means that you either have to build the client or server application, then run as the other side within Unity. Not only is this a hassle, but you can only debug one side of the program at a time.

Being able to have the same project open with two Unity windows allowed me to develop much faster.

The key to having the project open twice is to have two project directories that point to the same source files. A Unity project has three sub-directories: Assets, Library and ProjectSettings. Everything the developer creates goes in Assets and Unity controls the other two directories. So, to have two Unity windows into the same project, you have to create two project directories that share the same Assets directory.

I did this in Windows 10 with Unity 5.3. I’d expect this to work for Windows 7+ and Unity 5.x.

  1. Create your project in Unity. Get everything setup the way you want it. Exit Unity.
  2. Copy the whole project directory: Use the GUI -OR- xcopy /e/h Game GameCopy
  3. Delete the Assets sub-dir In the new project directory: Use the GUI -OR- del /s GameCopy/Assets
  4. Link the original Asset directory to the new directory: (in an elevated command prompt) mklink /j GameCopy/Assets Game/Assets

Now you can bring up one Unit window on the Game project and another on the GameCopy project. Any asset changes (code, scenes, graphics, audio, prefab, etc) that you make in one Unity window will show up in the other Unity. The only thing that isn’t shared are project settings.

Remember that you don’t actually have two copies of your assets. Any changes/additions/deletions in one directory are done to both!

In Linux/Mac, I’d try a soft link first and see if that works. If that fails, make a hard link.