Jump to content
Unity Insider Forum

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!

bearbeitet von AgentCodeMonkey
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 weeks later...

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()); }
    }
   }
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

bearbeitet von AgentCodeMonkey
Link zu diesem Kommentar
Auf anderen Seiten teilen

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#

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 10 months later...

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 4 weeks later...
  • 1 month later...
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();
}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...