Jump to content
Unity Insider Forum
AgentCodeMonkey

Fortlaufende Buildnummer / Versionierung

Recommended Posts

Moin, sowas gefällig?

 

versionsdingsbumms.png

 

Build und Revisionsnummer laufen automatisch. Haupt und Nebennummer müssen von Hand eingestellt werden.

 

Folgendes Script irgendwohin (jedoch NICHT in den Editor oder Plugins-Ordner oder ähnliches!!!):

 

using System.Reflection;
[assembly: AssemblyVersion("0.0.*.*")]
namespace GameFramework
{
	public static class Version
	{
			public static int Major = 0;
			public static int Minor = 2;
			public static int Patch = 0;

			public static readonly string Current;

			static Version()
			{
					var build = Assembly.GetExecutingAssembly().GetName().Version.Build;
					var revision = Assembly.GetExecutingAssembly().GetName().Version.Revision;
					Current = string.Format("{0}.{1}.{2}.{3}.{4}", Major, Minor, Patch, build, revision);
			}
	}
}


 

Folgendes in den Editor-Ordner:

using System;
using UnityEditor;
using UnityEngine;

[initializeOnLoad]
public class OnUnityStartup
{
static OnUnityStartup()
{
	OnFocus();
}
public static void OnFocus()
{
	OnDestroy();
	SceneView.onSceneGUIDelegate += OnSceneGUI;
}

static private void OnDestroy()
{
	SceneView.onSceneGUIDelegate -= OnSceneGUI;
}

private static void OnSceneGUI(SceneView sceneView)
{
	if (EditorApplication.currentScene == null) return;
	string currentScene = EditorApplication.currentScene.Substring(EditorApplication.currentScene.LastIndexOf('/') + 1);
	currentScene = currentScene.Substring(0, currentScene.Length - 6);
	//Handles.BeginGUI(new Rect(Screen.width - 100, Screen.height - 80, 90, 50));
	Handles.BeginGUI();
	GUILayout.BeginArea(new Rect(5, Screen.height - 55, 1000, 50));
	GUILayout.Label(String.Format("{0} v{1} -- {2}", PlayerSettings.productName, GameFramework.Version.Current, currentScene));
	GUILayout.EndArea();
	Handles.EndGUI();
}
}

 

Viel Spass damit!

Edited by AgentCodeMonkey
  • Like 3

Share this post


Link to post
Share on other sites

Gibt's irgendeinen Grund, dass Build als Variable vorhanden ist, obwohl sie immer nur lokal verwendet wird?

Und dass GetBuild in der Methode darüber nicht verwendet wird? :)

Share this post


Link to post
Share on other sites

Gibt's irgendeinen Grund, dass Build als Variable vorhanden ist, obwohl sie immer nur lokal verwendet wird?

Und dass GetBuild in der Methode darüber nicht verwendet wird? :)

 

Ach, das Build war so ein Überbleibsel und das GetBuild brauchte ich noch woanders. Hab es nal angepasst:

 

using System.Reflection;
[assembly: AssemblyVersion("0.0.*.*")]
namespace GameFramework
{
   public class Version
   {
    public static int Major = 0;
    public static int Minor = 2;
    public static int Patch = 0;
    private static string _getVersion()
    {
	    return Major
			   + "." + Minor
			   + "." + Patch
			   + "." + Assembly.GetExecutingAssembly().GetName().Version.Build
		    //+ "." + Assembly.GetExecutingAssembly().GetName().GetVersion.Revision
		    ;
    }
    private static string _version;
    public static string GetVersion
    {
	    //get { return _version ?? (_version = Assembly.GetExecutingAssembly().GetName().GetVersion.ToString()); }
	    get { return _version ?? (_version = _getVersion()); }
    }
   }
}

Share this post


Link to post
Share on other sites

Das könnte man etwas kürzen/einfacher schreiben:

 


using System.Reflection;
[assembly: AssemblyVersion("0.0.*.*")]
namespace GameFramework
{
public static class Version
{
	public static int Major = 0;
	public static int Minor = 2;
	public static int Patch = 0;

	public static readonly string Current;

	static Version()
	{
		var build = Assembly.GetExecutingAssembly().GetName().Version.Build;
		var revision = Assembly.GetExecutingAssembly().GetName().Version.Revision;
		Current = string.Format("{0}.{1}.{2}.{3}.{4}", Major, Minor, Patch, build, revision);
	}
}
}

 

@donbruno: Genauer gehts aber nicht, das eine Script irgendwo hin schmeißen, das andere Script in ein Verzeichniss mit dem Namen "Editor" legen.

  • Like 1

Share this post


Link to post
Share on other sites

ok und auf welcher Ebene ich den Ordner mit dem Namen "Editor" anlege ist egal?

 

und das andere Script an ein GO heften?

 

und zusätzlich bekomme ich nen Error:

 

Assets/Editor/BuildVersion2.cs(29,102): error CS0117: `System.Version' does not contain a definition for `GetVersion'

Share this post


Link to post
Share on other sites
ok und auf welcher Ebene ich den Ordner mit dem Namen "Editor" anlege ist egal?

Ja. Im Idealfall machst du dir ne Sammlunng hilfreicher EditorScripte und anderem Zeugs.

Beispiel: Scripts/Utils/Editor/OnUnityStartup.cs

 

und das andere Script an ein GO heften?

Nein, wie du siehst erbt Version nicht von MonoBehaviour -> merken: nur MonoBehaviours können an Objekte gehängt werden.

 

und zusätzlich bekomme ich nen Error:

Ich empfehle dir Marks Variante des Scripts.

Schau mal, da steht was von namespace GameFramework. Wenn du nur Version.Current nutzt, und in deinem Script System eingebunden hast, guckt das Script in den falschen namespace, den dort gibts auch eine Version-Klasse, die hier aber nicht genutzt werden soll.

...au0derdem wollte Ich keinen sinnlosen neuen Namen für "Version" erfinden, also habe ich einfach einen neuen namespace erstellt.

du kannst es so verwenden:

 

GameFramework.Version.Current;

 

...oder oben im Header des Scripts ein

 using GameFramework; 

hinschreiben, dann geht das auch so:

Version.Current;

Wenn du allerdings auch den namespace System nutzt, kommst du um Variante 1 nicht herum.

Da kann man jetzt noch ein paar Sachen kürzen:

using Ver = GameFramework.Version;

Ver.Current;

 

aber ... muss man nicht...

 

 

Edit: ich habe beide Scripte im ersten Post aktualisiert, sollte klappen.

Edited by AgentCodeMonkey

Share this post


Link to post
Share on other sites

ok erstmal danke :-)

 

nun habe ich folgendes gemacht:

 

import GameFramework;

 

function Start () {

GameFramework.Version.Current;
}

 

so nun bekomme ich aber:

 

Namespace 'GameFramework' not found, maybe you forgot to add an assembly reference?

 

kann man Unity3d irgendwo sagen, wo er suchen soll?

 

früher war es mal im compiler -L oder so, für den Lib-Path

 

dachte eigentlich, das es klappen sollte, da ich die beiden Scripte unterhalb von Scripte/Utils/Editor gepackt habe....

 

was ich noch vergessen habe...

ich arbeite in Javascript und das ist ja C#

Share this post


Link to post
Share on other sites
dachte eigentlich, das es klappen sollte, da ich die beiden Scripte unterhalb von Scripte/Utils/Editor gepackt habe....

Mein Fehler. Ich habe nicht gesagt, das "irgendwohin" den Editor-Ordner auschließt, außerdem im letzten Post einen Fehler gemacht und den falschen Pfad aufgeschrieben, das wurde berichtigt.

das Script namens "Version.cs" kommt irgendwohin, jedoch NICHT in irgendeinem der unity-Ordner wie Editor, Plugins, etc pp.

Pack es einfach in deinen Scripts-Ordner. Dann wird alles gut.

Share this post


Link to post
Share on other sites

also was ich gemacht habe:

 

das Script OnUnityStart.cs habe ich in "..Assets\Scripte\Utils\Editor" kopiert

 

und das andere

 

Version.cs --> "..Assets\Scripte\"

 

Aber irendwie will es trotzdem nicht :-(

 

gleicher Fehler

Share this post


Link to post
Share on other sites

Hey...

 

heute morgen als ich noch fast geschlafen habe...

 

erscheint sowas:

 

v0.2.0.5414.24161 -- Level0

 

ich dachte ich müsste noch was in meine Scripte schreiben, damit es funktioniert...

 

ABER es funktioniert ohne :-)

 

THX @ ALL!!!

Share this post


Link to post
Share on other sites

Ich bekomme folgende Exception geworfen, wenn ich Build&Run ausführe:

ArgumentOutOfRangeException: Cannot be negative.

Parameter name: length

System.String.Substring (Int32 startIndex, Int32 length) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/String.cs:348)

OnUnityStartup.OnSceneGUI (UnityEditor.SceneView sceneView) (at Assets/Editor/OnUnityStartUp.cs:27)

UnityEditor.SceneView.CallOnSceneGUI () (at C:/buildslave/unity/build/Editor/Mono/SceneView/SceneView.cs:1999)

UnityEditor.SceneView.HandleSelectionAndOnSceneGUI () (at C:/buildslave/unity/build/Editor/Mono/SceneView/SceneView.cs:1352)

UnityEditor.SceneView.OnGUI () (at C:/buildslave/unity/build/Editor/Mono/SceneView/SceneView.cs:1188)

System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)

UnityEditor.BuildPlayerWindow:BuildPlayerAndRun()

 

Jemand eine Idee?

 

Ebenso bekomme ich folgenden Fehler, wenn ich das Projekt über UnityVSTool ausführe:

Fehler 1 Fehler beim Ausgeben des 'System.Reflection.AssemblyVersionAttribute'-Attributs -- 'Die angegebene Version 0.0.*.* ist ungültig.'. D:\Dropbox\shared\FatDogGames\___The Lost Rescue Capsule\Unity\Assets\_\Scripts\HelperClasses\VersionHelper.cs 3 12 UnityVS.Unity.CSharp

Share this post


Link to post
Share on other sites
[assembly: AssemblyVersion("0.0.*.*")]

Wahrscheinlich sind die Sternchen ein Platzhalter?

Ist jetzt nur geraten.

Share this post


Link to post
Share on other sites

Hab mal das neue angeschaut aus interesse jedoch kriege ich eine Fehlermeldung, dass GameSettings.Instance nicht existiert.

Share this post


Link to post
Share on other sites
Hab mal das neue angeschaut aus interesse jedoch kriege ich eine Fehlermeldung, dass GameSettings.Instance nicht existiert.

 

Das ist eine Leiche und muss ausgetauscht werden.

GameSettings.Instance verweist einfach auf den Ort, an dem du das machst:

 

public class GameSettings : ScriptableObject
{   
public VersionControl VersionControl = new VersionControl();
}

 

ergo müsstest du etwa sowas machen:

 

public class GameSettings : ScriptableObject
{    private static GameSettings  _instance;
public static GameSettings  Instance{
get{ if(_instance) return _instance;
instance = Resources.Load<GameSettings >("PATH_TO_SCRIPTABLE");
return _instance;
}
public VersionControl VersionControl = new VersionControl();
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×