Unity 3D and MDriven
(Created page with "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...")
 
(Automatically adding template at the end of the page.)
 
(11 intermediate revisions by 3 users not shown)
Line 1: Line 1:
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 <span style="background-color: #ffff00;">Visual Studio 2015 Tools for Unity</span>. I would paste link – but I think its better if you google “Visual Studio 2015 Tools for Unity”.
Unity3D uses Mono. Mono builds do not follow the usual .net versioning with 2.0,3.5 etc. There is a special .net Framework edition you must use. To get this, install the <span style="background-color: #ffff00;">Visual Studio 2015 Tools for Unity</span>. I suggest pasting the link – but it's better to Google “Visual Studio 2015 Tools for Unity”.  


This framework will show up like this:
The Framework will show:  
[[File:Unity -1 .png|none|frame|510x510px]]


<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb.png" alt="image" width="701" height="538" border="0" /></a>
I have added this to our build script and it will be part of the EcoCore package on Nuget. Once you have a class library with Target Framework Unity 3.5 .net full Base Class Libraries, do this in the package manager console:
 
<html>
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:
<pre class="code"><span style="background: white; color: black;">PM&gt; <span style="background-color: #ffff00;">Install-Package EcoCore</span>
<pre class="code"><span style="background: white; color: black;">PM&gt; <span style="background-color: #ffff00;">Install-Package EcoCore</span>
Attempting to gather dependency information for package 'EcoCore.7.0.0.8536' with respect to project 'ClassLibrary1', targeting <span style="background-color: #ffff00;">'.NETFramework,Version=v3.5,Profile=Unity Full v3.5'</span>
Attempting to gather dependency information for package 'EcoCore.7.0.0.8536' with respect to project 'ClassLibrary1', targeting <span style="background-color: #ffff00;">'.NETFramework,Version=v3.5,Profile=Unity Full v3.5'</span>
Line 17: Line 17:
Added package 'EcoCore.7.0.0.8536' to 'packages.config'
Added package 'EcoCore.7.0.0.8536' to 'packages.config'
Successfully installed 'EcoCore 7.0.0.8536' to ClassLibrary1
Successfully installed 'EcoCore 7.0.0.8536' to ClassLibrary1
</span></pre>
</span></pre> </html>
After that you will find the MDriven Assemblies in you project:


<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image1.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb1.png" alt="image" width="356" height="386" border="0" /></a>
After that, you will find the MDriven Assemblies in your project:
[[File:Unity - 2.png|none|frame|297x297px]]


That was requirement 1.
That was requirement 1.


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


I suggest that you add a temporary project that has these – drag them over – then throw away the left overs:
I suggest you add a temporary project that has these. Drag them over and throw away the leftovers:
[[File:Unity - 3.png|none|frame|464x464px]]


<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image2.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb2.png" alt="image" width="835" height="566" border="0" /></a>
Also, delete Class1 if you have it since it's unwanted and your default model contains another Class1.
[[File:Unity - 4.png|none|frame|283x283px]]


Also delete the Class1 if you have it – since we don want it and our default model contains another Class1.
You might want to use an existing model – then you would use a file link to this model and Package folder (EcoProject1).


<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image3.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb3.png" alt="image" width="423" height="412" border="0" /></a>
Do a little modeling and generate the code:
[[File:Unity - 5.png|none|frame|409x409px]]


Of course we might want use an existing model – then you would use a file link to this model and Package folder (EcoProject1).
You will still have some errors but they will be easy to fix:
[[File:Unity - 6.png|none|frame|586x586px]]


Do a little modeling and then generate code:
You do not have access to the PersistenceMapperSharer here (its main use is serverside when many clients share the same PersistenceMapper). Change to a PersistenceMapperXml for local storage in an XML.


<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image4.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb4.png" alt="image" width="703" height="455" border="0" /></a>
<html>
 
We will still have some errors but they will easily fixed:
 
<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image5.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb5.png" alt="image" width="908" height="157" border="0" /></a>
 
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.
<pre class="code"><span style="text-decoration: line-through;">    <span style="background: white; color: blue;">private </span></span><span style="background: white; color: black;"><span style="text-decoration: line-through;">Eco.Persistence.PersistenceMapperSharer persistenceMapperSharer1;</span>
<pre class="code"><span style="text-decoration: line-through;">    <span style="background: white; color: blue;">private </span></span><span style="background: white; color: black;"><span style="text-decoration: line-through;">Eco.Persistence.PersistenceMapperSharer persistenceMapperSharer1;</span>
     </span><span style="background: white; color: gray;">/// &lt;summary&gt;
     </span><span style="background: white; color: gray;">/// &lt;summary&gt;
Line 75: Line 73:


     }</span></pre>
     }</span></pre>
</html>
That was requirement 2.
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
To get access to Unity3D, you 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
Once you have that, you can construct your Information access:
<html>
<pre class="code"><span style="background: white; color: blue;">using </span><span style="background: white; color: black;">System;
<pre class="code"><span style="background: white; color: blue;">using </span><span style="background: white; color: black;">System;
</span><span style="background: white; color: blue;">using </span><span style="background: white; color: black;">System.Collections.Generic;
</span><span style="background: white; color: blue;">using </span><span style="background: white; color: black;">System.Collections.Generic;
Line 92: Line 93:
   }
   }
}</span></pre>
}</span></pre>
<span style="background: white; color: black;">MonoBehaviour will be found by the Unity runtime and it will see if the object has a Start and an Update Method:</span>
<span style="background: white; color: black;">MonoBehaviour will be found by the Unity runtime and will see if the object has a Start and an Update Method:</span>
<pre class="code">    <span style="background: white; color: blue;">void </span><span style="background: white; color: black;">Start()
<pre class="code">    <span style="background: white; color: blue;">void </span><span style="background: white; color: black;">Start()
     {
     {
Line 102: Line 103:
       </span><span style="background: white; color: #2b91af;">Debug</span><span style="background: white; color: black;">.Log(</span><span style="background: white; color: #a31515;">"works?"</span><span style="background: white; color: black;">);
       </span><span style="background: white; color: #2b91af;">Debug</span><span style="background: white; color: black;">.Log(</span><span style="background: white; color: #a31515;">"works?"</span><span style="background: white; color: black;">);
     }
     }
</span></pre>
</span></pre>  
Now let us start Unity – create a project or find the project we want to use our information in.
</html>


<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image6.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb6.png" alt="image" width="644" height="373" border="0" /></a>
Now, start Unity. Create a project or find the project you want to use your information in.  
[[File:Unity - 7.png|none|frame|513x513px]]


I need to make my Assmbly and its dependcies available to unity.
You need to make your Assembly and its dependencies 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:
Set a build event on your project to copy over everything from your bin folder – but set the “Copy Local” of UnityEngine.dll to FALSE. This is because Unity will have its own copy of this important assembly:  
[[File:Unity - 8.png|none|frame|431x431px]]


<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image7.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb7.png" alt="image" width="644" height="424" border="0" /></a>
The text in Post-Build is: “xcopy "$(TargetDir)*.*" "C:\temp\TheMDrivenTestProject1000\Assets\MyVSAssemblies" /Y” (I created a Folder in Unity called MyVSAssemblies).


The text in Post-Build is: “xcopy "$(TargetDir)*.*" "C:\temp\TheMDrivenTestProject1000\Assets\MyVSAssemblies" /Y”  (I created a Folder in Unity called MyVSAssemblies)
Now, build your assembly in VS, and after that, the post-build-event copies the result to your Unity project. As a result, Unity should find out the class that implements MonoBehaviour:  
[[File:Unity - 9.png|none|frame|435x435px]]


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:
To get Unity to find a reason for executing our script as part of the game, associate the script with a GameObject. Add an empty GameObject whose only purpose is to be a reference for your script.
[[File:Unity - 10.png|none|frame|434x434px]]


<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image8.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb8.png" alt="image" width="644" height="366" border="0" /></a>
Then drag your script onto this game object:  
[[File:Unity - 11.png|none|frame|441x441px]]


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.
You can now verify that the script works by hitting Play in Unity and watching for your Debug.Log messages:
[[File:Unity - 12.png|none|frame|455x455px]]


&nbsp;
You have come pretty far. You can now make a prefab in Unity (look this up on a Unity blog) and call it “Player”.


<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image9.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb9.png" alt="image" width="644" height="232" border="0" /></a>
Oh, one note about the Console – you will find compilation errors here like this:  
[[File:Unity - 13.png|none|frame|472x472px]]


I then drag my script onto this game object:
In this case, it says you are missing a reference to WindowsBase – you need to add it – and set Copy Local.


<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image10.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb10.png" alt="image" width="644" height="158" border="0" /></a>
Create a Prefab and call it MyCarPrefab:  
[[File:Unity - 14.png|none|frame]]


I can now verify that the script works by hitting Play in Unity and watch for my Debug.Log messages:
It has a Text Mesh and you use that to show the score. In Start, create prefabs from your Player objects, and spread them over the terrain:  
 
<html>
<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image11.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb11.png" alt="image" width="630" height="436" border="0" /></a>
 
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:
 
<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image12.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb12.png" alt="image" width="644" height="344" border="0" /></a>
 
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:
 
<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image13.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb13.png" alt="image" width="220" height="244" border="0" /></a>
 
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:
<pre class="code">    <span style="background: white; color: blue;">void </span><span style="background: white; color: black;">Start()
<pre class="code">    <span style="background: white; color: blue;">void </span><span style="background: white; color: black;">Start()
     {
     {
Line 168: Line 162:
     }
     }
</span></pre>
</span></pre>
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
</html>
 
Since you do not have any Player-objects yet, turn to the MDriven debugger to create a few in the xml file c:\temp\Gamedata10.xml  
<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image14.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb14.png" alt="image" width="644" height="351" border="0" /></a>
[[File:Unity - 15.png|none|frame|387x387px]]
 
Finally, save them by switching to the DirtyObjects tab and pressing "Update selected":  
Lastly I save them by switching to DirtyObjects tab and press Update selected:
[[File:Unity - 16.png|none|frame|390x390px]]
 
<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image15.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb15.png" alt="image" width="681" height="449" border="0" /></a>
 
And then I get my cars and their scores like this:
 
<a href="//www.capableobjects.com/wp-content/uploads/2016/07/image16.png"><img style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="image" src="//www.capableobjects.com/wp-content/uploads/2016/07/image_thumb16.png" alt="image" width="741" height="570" border="0" /></a>


&nbsp;
Then, get your cars and their scores like this:
[[File:Unity - 17.png|none|frame|286x286px]]


Ok – that’s it for now
Ok – that’s it for now.


We also did this clip that shows the process:  
We also have this clip that shows the entire process:  


<html>
<html>
Line 190: Line 179:
<div class="video">
<div class="video">
   <div class="video__wrapper">
   <div class="video__wrapper">
<iframe src="https://www.youtube.com/embed/cAqq0LIvIHM?rel=0&autoplay=0" frameborder="0" allowfullscreen></iframe>
<iframe src="https://www.youtube.com/embed/ytkSQ-ppzfo?rel=0&autoplay=0" frameborder="0" allowfullscreen></iframe>
</div>
</div>
<div class="video__navigation">
<div class="video__navigation">
Line 197: Line 186:


</html>
</html>
[[Category:MDriven Framework]]
[[Category:Visual Studio]]
{{Edited|July|12|2024}}

Latest revision as of 15:49, 10 February 2024

Unity3D uses Mono. Mono builds do not follow the usual .net versioning with 2.0,3.5 etc. There is a special .net Framework edition you must use. To get this, install the Visual Studio 2015 Tools for Unity. I suggest pasting the link – but it's better to Google “Visual Studio 2015 Tools for Unity”.

The Framework will show:

Unity -1 .png

I have added this to our build script and it will be part of the EcoCore package on Nuget. Once you have a class library with Target Framework Unity 3.5 .net full Base Class Libraries, do this in the package manager console:

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

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

Unity - 2.png

That was requirement 1.

The next step is to provide an EcoSpace and Model for the project.

I suggest you add a temporary project that has these. Drag them over and throw away the leftovers:

Unity - 3.png

Also, delete Class1 if you have it since it's unwanted and your default model contains another Class1.

Unity - 4.png

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

Do a little modeling and generate the code:

Unity - 5.png

You will still have some errors but they will be easy to fix:

Unity - 6.png

You do not have access to the PersistenceMapperSharer here (its main use is serverside when many clients share the same PersistenceMapper). Change to a PersistenceMapperXml for local storage in an XML.

    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)
        {
          this.components.Dispose();
        }
      }

      base.Dispose(disposing);
    }

    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, you must reference the UnityEngine: I found it here C:\Program Files\Unity\Editor\Data\PlaybackEngines\WindowsStandaloneSupport\Managed\UnityEngine.dll

Once you have that, you can construct your 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 will see if the object has a Start and an Update Method:

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

    void Update()
    {
      Debug.Log("works?");
    }

Now, start Unity. Create a project or find the project you want to use your information in.

Unity - 7.png

You need to make your Assembly and its dependencies available to Unity.

Set a build event on your project to copy over everything from your bin folder – but 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).

Now, build your assembly in VS, and after that, the post-build-event copies the result to your Unity project. As a result, Unity should find out the class that implements MonoBehaviour:

Unity - 9.png

To get Unity to find a reason for executing our script as part of the game, associate the script with a GameObject. Add an empty GameObject whose only purpose is to be a reference for your script.

Unity - 10.png

Then drag your script onto this game object:

Unity - 11.png

You can now verify that the script works by hitting Play in Unity and watching for your Debug.Log messages:

Unity - 12.png

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

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

Unity - 13.png

In this case, it says you are missing a reference to WindowsBase – you need to add it – and set Copy Local.

Create a Prefab and call it MyCarPrefab:

Unity - 14.png

It has a Text Mesh and you use that to show the score. In Start, create prefabs from your 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)
      {
        c++;
        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();
      }

    }

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

Unity - 15.png

Finally, save them by switching to the DirtyObjects tab and pressing "Update selected":

Unity - 16.png

Then, get your cars and their scores like this:

Unity - 17.png

Ok – that’s it for now.

We also have this clip that shows the entire process:

This page was edited 90 days ago on 02/10/2024. What links here