Using External Version Control Systems with Unity

Unity offers an Asset Server add-on product for easy integrated versioning of your projects. If you for some reason are not able use the Unity Asset Server, it is possible to store your project in any other version control system, such as Subversion, Perforce or Bazaar. This requires some initial manual setup of your project.

Before checking your project in, you have to tell Unity to modify the project structure slightly to make it compatible with storing assets in an external version control system. This is done by selecting Edit->Project Settings->Editor in the application menu and enabling External Version Control support by selecting Metafiles in the dropdown for Version Control. This will create a text file for every asset in the Assets directory containing the necessary bookkeeping information required by Unity. The files will have a.meta file extension with the first part being the full file name of the asset it is associated with. Moving and renaming assets within Unity should also update the relevant.meta files. However, if you move or rename assets from an external tool, make sure to syncronize the relevant .meta files as well.

When checking the project into a version control system, you should add the Assets and the ProjectSettings directories to the system. The Library directory should be completely ignored - when using external version control, it's only a local cache of imported assets.

When creating new assets, make sure both the asset itself and the associated .meta file is added to version control.

 

Example: Creating a new project and importing it to a Subversion repository.

First, let's assume that we have a subversion repository at svn://my.svn.server.com/ and want to create a project at svn://my.svn.server.com/MyUnityProject. Then follow these steps to create the initial import in the system:

 
  1. Create a new project inside Unity and call it InitialUnityProject. You can add any initial assets here or add them later on.
  2. Enable Meta files in Edit->Project Settings->Editor
  3. Quit Unity (this ensures that all the files are saved).
  4. Delete the Library directory inside your project directory.
  5. Import the project directory into Subversion. If you are using the command line client, this is done like this from the directory where your initial project is located:
    svn import -m"Initial project import" InitialUnityProject svn://my.svn.server.com/MyUnityProject
    If successful, the project should now be imported into subversion and you can delete the InitialUnityProject directory if you wish.
  6. Check out the project back from subversion
    svn co svn://my.svn.server.com/MyUnityProject
    And check that the Assets and ProjectSettings directory are versioned.
  7. Open the checked out project with Unity by launching it while holding down the Option or the left Alt key. Opening the project will recreate the Library directory in step 4 above.
  8. Optional: Set up an ignore filter for the unversioned Library directory:
    svn propedit svn:ignore MyUnityProject/
    Subversion will open a text editor. Add the Library directory.
  9. Finally commit the changes. The project should now be set up and ready:
    svn ci -m"Finishing project import" MyUnityProject
 
 
 
Using Version Control with Unity

In this article, I will briefly describe how to setup a Unity project together with a Version Control System (VCS). I will show you how you can setup a Unity project to work with Subversion (SVN) but the method to use Unity with other version control systems should be similar.

Introduction

Unity is a game development tool that allows you to create great games and deploy them to almost any platform you can imagine. Unity provides a great asset handling pipeline. Most of your game assets (like models, textures, audio files, and scripts) are automatically built for the platform for which they are to be used.

Although Unity is a great platform for creating games, historically it has not always been very easy to work in large teams with Unity. Unity has traditionally encouraged developers to use the Unity Asset Server for managing the Unity project across large teams. And although the Unity Asset Server is a good solution for working in large teams, it does incur additional licensing costs that may not be practical for smaller teams.

The developers at Unity recognized that their users wanted to integrate their Unity projects into their existing version control systems so they provided the ability to work with meta files which are used to keep track of the different assets in the project. By enabling these meta files, you can now work with version control systems like Subversion and Git in large teams and across different platforms without losing the references to your assets.

Meta Files

It is important to understand the need for Meta Files when wor  king with a Version Control System. When you reference a game asset in a scene, Unity does not use the name and location and name of an asset internally, instead Unity uses a Globally Unique Identifier (GUID) to uniquely refer to an asset in your project. This GUID is stored in a meta file that is created for each folder and each asset in your Unity project’s Asset folder.

The use of GUIDs has its advantages but it also has its disadvantages. The advantage of using GUIDs is that you can move or rename or modify the contents of an asset and the asset can still be referenced by its GUID (as long as the GUID stays the same, the asset can be referenced). The disadvantage is that you must be aware of the presence of the meta file that is associated to a particular asset. If you delete the meta file that is associated with a particular asset, Unity will think the original asset has been deleted a new GUID is generated and associated to that asset. This is the most common reason why references to assets will suddenly break in your scene file.

In addition to the GUID, the meta files store information about the asset that is used to re-import it. For example, texture assets can be configured to be imported as a standard texture, a normal map, a GUI texture, a cookie, texture, or a lightmap texture. These import settings are also stored in the meta file.

Enable Meta Files

By default, meta files are not enabled for new projects. You must explicitly enable meta files for each new Unity project you want to manage with version control.

To do this, open your Unity project in the Unity game editor. If you don’t yet have a project, download the unityproject file below and import it into an empty Unity project (It’s just a crate, but it’s enough to use as an example).

TestScene.unitypackage.

 

With Unity open, go to Edit > Project Settings > Editor.

Unity – Enable Meta Files

You will notice that the Inspector panel turns into Editor Settings.

Select the Meta Files option for the Mode setting under Version Control.

Unity – Enable Meta Files

After enabling this option, you should see a .meta file for every file and folder in your Unity project’s Asset folder.

Meta Files

Working with Version Control

At this point, I assume you have access to a version control repository somewhere. Setting up a repository is beyond the scope of this article so I will not explain that here.

I will show how to work with Subversion using the TortoiseSVN client on Windows. Working with other version control systems will be similar but the steps to manage your repository may be different.

Checkout

Before you can add your files to the repository, you need to perform a checkoutoperation (if you haven’t already done so). If you already have a working copy where you want to put your Unity project, then you can skip this step.

Navigate to the directory where you created your Unity project.

Right-click on the project root folder (the folder that contains the Assets folder) and select “SVN Checkout…” from the pop-up menu that appear.

SVN Checkout

Specify the URL of the Subversion repository and the directory where you want to create the working copy (this should be the root of your Unity project folder) and press OK to perform the checkout operation.

SVN Checkout Dialog

The TortoiseSVN client should display a warning dialog box stating that the directory is not empty. Confirm that you want to checkout to this folder by clicking the Yes button.

TortoiseSVN Warning

You should be presented with a confirmation dialog stating that the checkout operation completed.

Checkout Confirmation

Adding Files

Now that we’ve created a working of the SVN repository, we can add the necessary files to it.

Not all of the files in the Unity project folder should be added to the repository.

DO ADD THESE FILES

Only two folder (and all of their contents) should be added to the repository:

  • Assets
  • ProjectSettings

DON’T ADD THESE FILES

The following folders should NOT be added to version control:

  • Library
  • Temp

Also, all of the files that Unity generates in the root folder of the Unity project folder should not be added to version control (because these can be regenerated by selecting Assets > Sync MonoDevelop Project from the main menu in the Unity editor).

Ignore Files

It is highly recommended that you tell subversion to always ignore the files and directories that you do not need to add to version control. To do this, right-click on the files/folders that you do not want to add to version control and select TortoiseSVN > Add to ignore list > Ignore items by name (or ignore by extension if you want to ignore all files with a particular extension).

SVN Ignore Folders

Once a file or folder has been ignored, it won’t show up in the commit dialog anymore.

Commit Changes

Once the necessary files have been added to the working copy and the Library, Temp, and other files have been marked as ignore, we need to commit the changes to the SVN repository.

Do do that, right-click on the root folder of the Unity project and select SVN Commit…from the pop-up menu that appears.

SVN Commit

You should be presented with a commit dialog box. Enter a message that describes the changes you are committing and confirm that all of the files and folders that should be added to the repository are checked (including the .meta files!)

Commit Changes

Click OK to confirm you want to commit the changes to the repository. If everything was okay, you should see the following dialog box:

Commit Finished

Moving and Renaming Files (Very Important)

If you have read the standard Unity documentation, you may have noticed that the guys at Unity recommend that you never use Windows Explorer (or Finder on OS X) to move or rename files that are in your Unity project’s Asset folder. They recommend that you only use the Project View in the Unity editor. This is true if you are using the Unity Asset Server or not using version control at all. However, if you are using a version control system (like Subversion) then you MUST use the SVN client (in the case of Windows, this is usually TortoiseSVN) to move or rename files that are part of an SVN working copy. The most important thing to remember is that if you move a file or folder that you also move/rename the corresponding .meta file that is associated with that folder or asset.

When moving asset files or folders in a Unity project folder, always move/rename the corresponding .meta file! Not doing this will break the references to those assets in all of your scene files!

If you don’t move/rename the corresponding .meta file for a folder or an asset in a Unity project’s Asset folder you will break the reference to that asset in every scene file it is used.

BE VERY CAREFUL WHEN MOVING/RENAMING FILES IN YOUR UNITY PROJECT!

If you accidently move/rename files in the Project View in the Unity editor, you will break the link to the file as known by the Subversion system. To resolve this, move/rename the file/folder back to it’s original name in the Project View and perform the move/rename using the SVN client instead. Make sure you also move/rename the corresponding .meta file that is associated with the file/folder you are moving/renaming.

Copying Files

If you want to make a copy an asset, do not copy the .meta file with it. The .meta file contains the GUID for that asset and if you make a copy of the .meta file, Unity will not longer know which is the correct asset for the GUID.

Conclusion

In this article, I showed you how to add your Unity project to a version control system. The most important thing to remember is to always enable Meta Files when working with a version control system such as Subversion. Failing to do this, or not committing the .meta files with the corresponding assets will break the references to those assets in the scene files.

Don’t commit the Library and the Temp folder to the version control system because Unity will automatically create these folders if they don’t already exist. You should also not commit the solution files and project files that are automatically generated by Unity when you select Assets > Sync MonoDevelop Project from the main menu in the Unity editor. These files get overwritten when Unity regenerates them and they don’t need to be put in version control.

Exercise

Practice this own your own or with your team. Make sure that you can perform a fresh checkout of your project in a new folder or on a teammates computer and confirm that all of the references to assets in the scene files are correct.

If you have turned on Meta Files, you should be able to delete the Library folder in the root of your Unity project and Unity should correctly recreate the Library files and restore all the references to the assets in the scene files.

 
You may also like:

Projected Shadow Mapping with Cg and OpenGL

Rendering Primitives with OpenGL

Game Engines 2 (GE2)

Courses

Understanding Quaternions

Introduction to Cg Runtime with OpenGL
 

This entry was posted in Unity by Jeremiah van Oosten. Bookmark the permalink.

4 THOUGHTS ON “USING VERSION CONTROL WITH UNITY”

  1. Here’s another good suggestion for using version control with Unity.

    As of Unity 4.2, they’ve made the option for text serialization of assets available to all users, not just Pro. After doing this, all asset files that were previously saved in binary format are saved in a completely readable YAML representation in a text file. Changes to scene files can actually be read, and merged if you’re careful. Very useful if you have multiple people working in a project.

    • Sigmund,

      Thanks for this great tip. But be careful, large scene files with many gameobjects will still be difficult or impossible to merge correctly if you not very careful.

      A better solution is to split level design into separate scene files and use Application.LoadLevelAdditive to combine several levels into one at runtime.

      The best solution would be to have this concept “Additive” level design integrated into unity. UDK does this with Persistent and Streamed levels ()

  2. Chufraise on January 4, 2014 at 1:34 am said:

    Hi Jeremiah,
    Great article, thanks! I’m having some troubles tho when checking out a project without a Library folder. All prefab and script link are broken, which means something is broken in the meta data. I’ve done everything according to the best practises before importing the project in the first place, such as enabling visible meta files. I initially imported the Assets- and the ProjectSettings folders, but when checking the project out on another computer everything’s screwed up. When checking out the original Library folder everything works fine. Do you possibly have an idea on what I’ve done wrong? I’m using Unity Free 4.3. Thanks!

    • If meta files are regenerated then the references to those assets will be broken. Make sure that when you put files in the Assets folder that they have corresponding meta files and the contents of the files should not be changed after Unity imports those files (the UUID’s should not change).

      The best thing to do is to use the Import Package function in Unity to import assets created in another Unity project. Doing this will maintain references to assets within the package.

Unity使用外部版本控制的更多相关文章

  1. Unity使用外部版本控制SVN

    原地址:http://www.cnblogs.com/realtimepixels/p/3652146.html Using External Version Control Systems with ...

  2. unity 播放外部视频

    摘要: Unity支持的播放视频格式有.mov..mpg..mpeg..mp4..avi和.asf.只需将对应的视频文件拖拽入Project视图即可,它会自动生成对应的MovieTexture对象. ...

  3. unity 读取外部exe程序控制台信息

    由于需要获取显卡信息,但是unity的自带函数,只能输出1个显卡 c#倒是可以但是引用了一个下载的dll   System.Management.dll 这个dll放到unity用不了,因为mono不 ...

  4. Unity基础-外部导入C# Dll(汇编集)

    外部导入C# Dll(汇编集) 使用创建一个dll工程 添加依赖的dll 导入Unity中,放入Assets的任意文件夹中 使用代码生成的dll汇编集只要"use dll的名字"引 ...

  5. Unity调试外部DLL

    1.更改DLL的.csproj工程配置文件,在里面添加如下属性:<PropertyGroup Condition=" '$(OS)' == 'Unix' ">     ...

  6. Unity 3D的版本控制问题

    译林军 李慧爽|2014-02-13 11:21|9231次浏览|Unity(286)移动应用(19)技术开发(9)0 Unity中的源码控制并非和其他开发环境一样简单.我们可以从开发和美术两个角度讲 ...

  7. unity 开启外部摄像头

    在unity中建立一个image作为摄像头显示画面,然后通过命令render到image上即可. public WebCamTexture webTex; public string deviceNa ...

  8. Unity调用外部摄像头,全屏显示摄像头画面

    有两种方法,常用的是GUI方法,代码如下: public class CameraTest : MonoBehaviour { WebCamTexture camTexture; void Start ...

  9. Unity的资源管理

    本篇文章翻译自Unity的官方文档,原文地址:https://docs.unity3d.com/Manual/BehindtheScenes.html Unity自动导入资源的同时为你管理这些资源产生 ...

随机推荐

  1. Ajax的特点

    [传统提交方式] 客户端提交请求后,服务器会找到相应的资源进行执行.并将执行结果重新发送给客户端.客户端接收到服务器端的响应会进行重新解释并显示.此时的页面是一个全新的页面. [Ajax提交] 客户端 ...

  2. android 的Manifest对图标的影响

    转自 http://blog.csdn.net/yuan1590/article/details/6700683 先看看网路上的说法: Android.intent.action.MAIN决定应用程序 ...

  3. android开发里跳过的坑——adb connect连不上

    user版本在系统init.rc里已经添加了setprop service.adb.tcp.port 5555 ,但是刷机以后,发现adb connect怎么都连不上,重启电脑,改变网络,巴拉巴拉,能 ...

  4. 【ZJOI2017 Round1练习】D8T1 mushroom(点分治)

    题意: 思路: num[a[u]]表示存在a[u]这个颜色且终点在u子树中的链长总和 ans[i]表示以当前的u为根,前面的子树对i的贡献之和 ..]of longint; size,f,ans,su ...

  5. webstrom设置代码缩进四个空格

    言,今天在github上拉了一份代码,发现代码缩进是2个空格,不习惯.找到了解决方案. 一.File ---> Settings 搜索Code Style,取消勾选使用现文件的缩进方式,见下图. ...

  6. Rooks-LightOj1005(规律)

    A rook is a piece used in the game of chess which is played on a board of square grids. A rook can o ...

  7. 详解MySQL分区表

    当数据库数据量涨到一定数量时,性能就成为我们不能不关注的问题,如何优化呢? 常用的方式不外乎那么几种: 1.分表,即把一个很大的表达数据分到几个表中,这样每个表数据都不多. 优点:提高并发量,减小锁的 ...

  8. Atitit.auto complete 自己主动完毕控件的实现总结

    Atitit.auto complete  自己主动完毕控件的实现总结 1. 框架选型 1 2. 自己主动完毕控件的ioc设置 1 3. Liger  自己主动完毕控件问题 1 4. 官网上的code ...

  9. (linux shell)第一章--小试牛刀(下)

    文章来源: (linux shell)第一章--小试牛刀(下) 1.6 数组和关联数组 1.6.1 预备知识 Bash同一时候支持普通数组和关联数组.普通数组仅仅能使用整数作为数组索引,而关联数组能够 ...

  10. netty4与protocol buffer结合简易教程

    各项目之间通常使用二进制进行通讯,占用带宽小.处理速度快~ 感谢netty作者Trustin Lee.让netty天生支持protocol buffer. 本实例使用netty4+protobuf-2 ...