Log in

Unity 3D and MDriven

From MDrivenWiki

Unity3D use Mono – and Mono builds do not really follow the usual .net versioning with 2.0,3.5 etc… There is a special .net Framework edition you must use. You get this by installing the Visual Studio 2015 Tools for Unity. I would paste link – but I think its better if you google “Visual Studio 2015 Tools for Unity”.

This framework will show up like this:

Unity -1 .png

I have added this to our build script and it will be part of the EcoCore package on nuget – so once you have a class library with Target Framework Unity 3.5 .net full Base Class Libraries you can go like this in the package manager console:

PM> Install-Package EcoCore
Attempting to gather dependency information for package 'EcoCore.' with respect to project 'ClassLibrary1', targeting '.NETFramework,Version=v3.5,Profile=Unity Full v3.5'
Attempting to resolve dependencies for package 'EcoCore.' with DependencyBehavior 'Lowest'
Resolving actions to install package 'EcoCore.'
Resolved actions to install package 'EcoCore.'
Installing EcoCore
Adding package 'EcoCore.' to folder 'c:\users\hasse\documents\visual studio 2015\Projects\ClassLibrary2\packages'
Added package 'EcoCore.' to folder 'c:\users\hasse\documents\visual studio 2015\Projects\ClassLibrary2\packages'
Added package 'EcoCore.' to 'packages.config'
Successfully installed 'EcoCore' to ClassLibrary1

After that you will find the MDriven Assemblies in you project:

Unity - 2.png

That was requirement 1.

Next step is to provide an EcoSpace and a Model for the project.

I suggest that you add a temporary project that has these – drag them over – then throw away the left overs:

Unity - 3.png

Also delete the Class1 if you have it – since we don't want it and our default model contains another Class1.

Unity - 4.png

Of course we might want use an existing model – then you would use a file link to this model and Package folder (EcoProject1).

Do a little modeling and then generate code:

Unity - 5.png

We will still have some errors but they will easily fixed:

Unity - 6.png

We do not have access to the PersistenceMapperSharer here (its main use is server side when many clients share the same PersistenceMapper). I will change to a PersistenceMapperXml for local storage in an xml file.

    private Eco.Persistence.PersistenceMapperSharer persistenceMapperSharer1;
    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose(bool disposing)
      if (disposing)
        Active = false;
        if (this.components != null)


    private void InitializeComponent()

      this.persistenceMapperSharer1 = new Eco.Persistence.PersistenceMapperSharer();
      this.persistenceMapperSharer1.MapperProviderTypeName = "EcoProject1.EcoSpaceAndModel1.EcoProject1PMP";
      this.PersistenceMapper = this.persistenceMapperSharer1;

      Eco.Persistence.PersistenceMapperXml xmlpm = new Eco.Persistence.PersistenceMapperXml();
      xmlpm.FileName = @"c:\temp\Gamedata10.xml";
      this.PersistenceMapper = xmlpm;


That was requirement 2.

To get access to Unity3D I must reference the UnityEngine: I found it here C:\Program Files\Unity\Editor\Data\PlaybackEngines\WindowsStandaloneSupport\Managed\UnityEngine.dll

Once we have that we can construct our Information access

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;

namespace ClassLibrary1
  public class MyScriptThatUseMDriven: MonoBehaviour
MonoBehaviour will be found by the Unity runtime – and it will see if the object has a Start and an Update Method:
    void Start()
      Debug.Log("Start!!! works?");

    void Update()

Now let us start Unity – create a project or find the project we want to use our information in.

Unity - 7.png

I need to make my Assmbly and its dependcies available to unity.

I set a build event on my project to copy over everything from my bin folder – but I set the “Copy Local” of UnityEngine.dll to FALSE. This is because Unity will have its own copy of this important assembly:

Unity - 8.png

The text in Post-Build is: “xcopy "$(TargetDir)*.*" "C:\temp\TheMDrivenTestProject1000\Assets\MyVSAssemblies" /Y”  (I created a Folder in Unity called MyVSAssemblies)

I now build my assembly in VS and then the post-build-event copies the result to my Unity project. As a result Unity should find out class that implements MonoBehaviour:

Unity - 9.png

To get Unity to find any reason for actually executing our script as part of the game – we must associate the script with a GameObject. So I add an empty GameObject that has the only purpose to be a reference to our script.

Unity - 10.png

I then drag my script onto this game object:

Unity - 11.png

I can now verify that the script works by hitting Play in Unity and watch for my Debug.Log messages:

Unity - 12.png

So we have come pretty far. Now we can now make a prefab in Unity (look up this on a Unity blog) and call it “Player”.

Oh and one note about the Console – you will find compilation errors here like this:

Unity - 13.png

In this case it says I am missing a reference to WindowsBase – and they I need to add it – and set Copy Local.

I create a Prefab and call it MyCarPrefab:

Unity - 14.png

It has a Text Mesh and I use that to show the score. In Start I create prefabs from my Player objects, and spread them over the terrain:

    void Start()
      Debug.Log("Start!!! works?");

      _es=new EcoProject1EcoSpace();
      _es.Active = true;

      var players=_es.Extents.AllInstances<Player>();

      int c = 0;
      foreach (var x in players)
        GameObject go = (GameObject)Instantiate(Resources.Load("MyCarPrefab"));
        var p = go.transform.position;
        p.Set(p.x + (c * 2.5f), p.y + (c * 2), p.z/*+ (c * 1)*/);
        go.transform.position = p;
        go.GetComponentInChildren<TextMesh>().text = x.Score.ToString();

Put since I do not have any Player-objects yet I turn to the MDriven debugger to create a few in the xml file c:\temp\Gamedata10.xml

Unity - 15.png

Lastly I save them by switching to DirtyObjects tab and press Update selected:

Unity - 16.png

And then I get my cars and their scores like this:

Unity - 17.png

Ok – that’s it for now

We also did this clip that shows the process: