Jump to content
Unity Insider Forum

Nax

Members
  • Gesamte Inhalte

    15
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von Nax

  1. Verdammt ich starte nun wirklich freiwillig mit #Springboot und #springcloud 😭. Work seems to **** me

    1. Damon93

      Damon93

      Verstehe deinen *wein* smiley nicht^^ Springboot ist meiner Meinung nach eines der geilsten frameworks für Java...

  2. Habt ihr bereits mit #go-micro gearbeitet? Was sind eure Eindrücke? https://t.co/f8dT2vMuy9

  3. @NathanGDquest Good luck man

  4. Wo findet man wohl am besten nen Sound Designer O_o

    1. Sleepy
    2. Nax

      Nax

      Dem hatte ich schon vor einer weile geschrieben ^^ aber noch keine Antwort erhalten.

  5. Nax

    #7 Tabl - Sprint Alpha #1

    Heyho Tabl, na!! Alles klar bei dir? In meinen (privat) GameDev Projekt geht es wirklich heiß her! Erst vergangenen Dienstag hatten wir ein krass geiles Teammeeting. Nee...ehrlich jetzt... Es war das alle erste Teammeeting seit der Gründung des Teams Naja was heisst hier Gründung...wir haben mal mit 8 Leuten angefangen (naja...es war noch quasi vor dem Anfang. Bevor dir erste Zeile Code gescriptet wurde - wie dem auch sei! Wir haben mal mit vielen angefangen und nun sind wir nur noch 3 Ein Programmierer, eine Grafikdesignerin und ein 3D Modellierer! Naja und wenn man meine kleine Tochter (Malen und Basteln xD) mit dazu zählt sind es sogar 4 Noch kann ich nicht viel zu dem Spiel sagen. Das Team gibt es zwar schon ne weile, aber wir haben viel hin und her gemacht, um unsere Fähigkeiten erstmal auszubauen. So habe ich mich mit Projektplanung und Programmierung beschäftigt, während die anderen beiden Ihre jeweiligen Talente weiterausgebaut haben. Die Grafikdesignerin hat viel auf Papier gezeichnet und mit Photoshop rumhantiert und der 3D Modellierer hat mit Autodesk Maya krass geile Scheisse umgesetzt Jedenfalls haben wir hier und da auch kleine Game-Projekte gehabt. Wie nen geiles Tetris. Netzwerk sowie Ranked TicTacToe. Oder 3D Mini Shooter like AngryBots aber halt selfmade und das mit First Person und Third Person Ansicht Jedenfalls arbeiten wir nun seit kurzem an unserem ersten echten Projekt. Aber hey bevor man anfängt braucht man ein ordentliches Konzept und genau das haben wir in dem Meeting gemacht. Naja wir haben mehrere Sachen gemacht. Hier mal eine Liste:[list] [*]Kick Off Meeting [*]Konzept Planung [*]Einführung in Projekt Planung - na wie wir nun alles durch ziehen: [list] [*]Trello als Taskboard [*]BitBucket (Git) zur Versionierung (Bitbucket Wiki für Dokumentation) [*]Raw Assets im Dropbox [*]Skype/Whatsapp/Telefon für Kommunikation [/list][*]Wir haben alle zusammen Raclette gegessen (Mann war das Lecker) [*]Und zum Abschluss haben wir unseren ersten Meilenstein definiert - die sogenannte Alpha #1 [/list] Das Meeting war am Dienstag. Heute ist Freitag. Was soll ich sagen - Version 0.0.2 ist nach drei Tagen bereits vorhanden xD. Version 0.0.1 war Mittwoch Nacht schon vorhanden, sprich:[list] [*]erste Version des Terrains [*]Charakter Steuerung [*]Charakter Attribute (diverse Status Attribute) [*]Beleuchtung [*]System Prefab [/list] Mit Version 0.0.2 kam nun:[list] [*]Charakter HUD [*]Charakter Inventar [*]Charakter Audios [*]Charakter Events [*]Super geiler GUI Skin [*]Eigenes Font [*]Sprites für Status Attribute [*]Sprites für erstes Gegenstände [*]zweite Version des Terrains [*]Erweiterung der System Prefab (hier liegen alle wesentlichen System Dienste (Manager) [*]Diverse Game Objekte Items usw [*]uvm [/list] Tjo, Tabl, wie du siehst. Bei mir geht es ab! Mach heute nicht zu lang [font=courier new,courier,monospace]Lösung Post Rätsel #5: [i]"Der Fahrstuhl"[/i][/font] [font=courier new,courier,monospace]Lösung Post Rätsel #6: [i]"Der Zahnarzt."[/i][/font] [font=courier new,courier,monospace]Post Rätsel: [i]"Wer hört alles und sagt nichts?"[/i][/font]
  6. Noch mehr Anmerkungen...:[list] [*]Es hat sich gezeigt, das ich die Prefab nur in einer Szene brauchte...ich lade sie trotzdem in jeder [*]Des Weiteren sollte das EventSystem nicht mehr Deklaration - initialisiert werden, sondern in der Start Funktion eines Skriptes [/list] Nicht so gut: [CODE] private var eventSystem : GlobalEventSystem = GlobalEventSystem.GetInstance(); [/CODE] Besser: [CODE] private var eventSystem : GlobalEventSystem; function Start() { eventSystem = GlobalEventSystem.GetInstance(); } [/CODE] Ersteres sollte Funktionieren wenn man die Prefab einmalig in der ersten Szene initialisiert und danach nicht wieder in szenen einbindent. Da aktuell aber kein "[url="http://docs.unity3d.com/ScriptReference/30_search.html?q=DontDestroyOnLoad"]DoNotDetroyOnLoad[/url]" aufgerufen wird kann es sein, das die Instanz trotzdem mal verschwindet. Zweitere Methode sollte stabiler sein. Ich werd es weiter beobachten ;D
  7. Hier ein kleiner Bonus! Da es doch vorkommen kann das man sich bei den Identifiern vertippt und Ewig nach einer Lösung suchen kann, habe ich nach einer eleganten Lösung gesucht Events zusammen zu fassen. Neben Enums in String Listen bin ich auf die einfach Variante mit Klassen und Statischen Klassen zurück gesprungen. Ungefähr so: [CODE] #pragma strict public class Fruit { public static class Events { // Some Event public var FruitDropEvent : String = "SpecialUniqueIdentifierForFruitDropEvent"; } } [/CODE] Nun kann man einfach folgendes machen: [CODE] eventSystem.Broadcast(Fruit.Events.FruitDropEvent); [/CODE]
  8. Etwas das C# kann aber JS nicht? Generics fällt mri da spontan ein *wein*

    1. Vorherige Kommentare anzeigen  %s mehr
    2. jashan

      jashan

      Was C# vor aber allem hat, was JS/UnityScript nicht hat, ist eine saubere, öffentliche Spezifikation. Daher ist auch der Vergleich etwas schwer ... Unterschiede zwischen UnityScript und JavaScript: http://wiki.unity3d.com/index.php/UnityScript_versus_JavaScript - UnityScript Keywords: http://wiki.unity3d.com/index.php/UnityScript_Keywords

    3. Sascha

      Sascha

      jashan sagt's, wie es ist.

    4. Nax

      Nax

      Will trotzdem einwerfen - hab mit den generics versucht und auch die manuals von unity sagen ganz klar das Generics in JS/US nicht unterstützt werden ^^

  9. Nax

    #1 UnCat - Video Tutorials?

    Moin lieber Leser, ich frage dich, ob es gut wäre neben meinen kleinen Skripten hier im Blog, auch das eine oder andere Video Tutorial bereitzustellen. Ich habe extra für dich eine Umfrage gestartet. Denn mich interessiert es wirklich was du von dieser Idee denkst. Natürlich steht es dir frei einen Kommentar zu schreiben. Bis denne
  10. Jo heyho Leute, hier kommt #2 der CharakterSkripte Heute geht es darum für das Skript "CharacterStats" - vom letzten Beitrag ([url="http://forum.unity-community.de/blog/41/entry-99-1-charakterskripte-characterstats/"]#1 CharacterStats[/url]) - ein weiteres Skript zu erstellen, sodass die Status Attribute, welche durch "CharacterStats" beeinflusst werden, auch anzuzeigen Wir machen es uns ganz gaaaannnzz einfach! Wir wollen einfach die vier Attribute[list] [*]Health [*]Hunger [*]Thirst [*]Stamina [/list] oben links auf dem Bildschirm dargestellt werden. Hinweis: Damit das ganze auch in Unity funktioniert solltet ihr die Skripte einfach dem FPSController hinzufügen (also via Add Component > Scripts > usw...). Ok hier noch Kleinigkeiten, die wir für das GUI Skript festhalten:[list] [*]Wir können bei bedarf ein GUISkin anfügen [*]Die allgemeine Größe soll definierbar sein [*]Die Position für folgende Attribute sollen Variabel sein: [list] [*]Health [*]Hunger [*]Thirst [*]Stamina [/list][*]Und jedes der o.g. Attribute soll mit schicken Texturen ergänzt werden können (so farbige Balken oder so ^^) [/list] Daraus ergibt sich, das wir so um die 14 Attribute brauchen ^^. Hier kommen sie: [CODE] #pragma strict var guiSkin : GUISkin; // Default Bar Size var size : Vector2 = new Vector2(200, 20); // View for Health var healthPos : Vector2 = new Vector2(20, 10); var healthBarEmpty : Texture2D; var healthBarFull : Texture2D; // View for Hunger var hungerPos : Vector2 = new Vector2(20, 40); var hungerBarEmpty : Texture2D; var hungerBarFull : Texture2D; // View for Thirst var thirstPos : Vector2 = new Vector2(20, 70); var thirstBarEmpty : Texture2D; var thirstBarFull : Texture2D; // View for Stamina var staminaPos : Vector2 = new Vector2(20, 100); var staminaBarEmpty : Texture2D; var staminaBarFull : Texture2D; [/CODE] Ok sieht super aus ;-). Nun können wir die Attribute auch über den Editor anpassen. Top! Nun brauchen wir noch ein Attribut. Die Verbindung zu den CharacterStats! [CODE] // Character Stats private var characterStats : CharacterStats; function Start() { characterStats = GetComponent(CharacterStats); } [/CODE] Damit wir nun nicht viermal dasselbe schreiben für jedes Attribut basteln wir uns eine Methode welches die dementsprechenden Elemente auf der GUI erzeugt (für jedes Attribut halt..). [CODE] function CreateGUIBoxForAttribute(pos:Vector2, display:float, empty:Texture2D, full:Texture2D) { // GUI for Attribute GUI.BeginGroup(new Rect(pos.x, pos.y, size.x, size.y)); GUI.Box(Rect(0, 0, size.x, size.y), empty); GUI.BeginGroup(new Rect(0, 0, size.x * display, size.y)); GUI.Box(Rect(0, 0, size.x, size.y), full); GUI.EndGroup(); GUI.EndGroup(); } [/CODE] Hui, waren das viele Parameter Nun wird es gaaaannnz einfach. Wir brauchen einfach die OnGUI Methode implementieren und alles funktioniert! (Nicht vergessen, wir haben noch den GUI Skin!) [CODE] function OnGUI() { if(guiSkin) { GUI.skin = guiSkin; } CreateGUIBoxForAttribute(healthPos, characterStats.health, healthBarEmpty, healthBarFull); CreateGUIBoxForAttribute(hungerPos, characterStats.hunger, hungerBarEmpty, hungerBarFull); CreateGUIBoxForAttribute(thirstPos, characterStats.thirst, thirstBarEmpty, thirstBarFull); CreateGUIBoxForAttribute(staminaPos, characterStats.stamina, staminaBarEmpty, staminaBarFull); } [/CODE] Na ist das nicht EASY????? Nun können wir das Skript einfach dem FPSController beifügen und schon haben wir die Attribute auf der Oberfläche angezeigt ;-). Solltet ihr passende Texturen haben (halt solche Balken oder so xD) könnt ihr die noch beifügen ;D Viel Spaß damit!
  11. Hey Danke für die Info. Hab es korrigiert
  12. Nax

    #3 Snippets - Globales Event System

    Heyho Leute, mal wieder habe ich ein neues Snippet oder Skript für euch am Start. Diesmal geht es um ein Globales Event System. Sprich ein Ort, wo ich Events ablegen kann, um später mit Listener darauf zu horchen, falls irgendwas ansteht. Z.B. der Charakter springt und es soll eine Audio Datei für das Springen abgespielt werden. Oder der Charakter hebt ein Item auf und der Sound des Items soll abgespielt werden. Also mal direkt ins kalte Wasser. Hier ist das Skript für die Datei "GlobalEventSystem.js": [CODE] #pragma strict import System; public class GlobalEventSystem { // Singleton / Class private static var _instance : GlobalEventSystem = new GlobalEventSystem(); public static function GetInstance() : GlobalEventSystem { return _instance; } private function GlobalEventSystem() { //if the constructor must be public, you can do this: if (_instance != null) { throw new Exception("This is a singleton class! Use GlobalEventSystem.GetInstance() instead!"); } } // Instance / Object private var events : Hashtable = new Hashtable(); public function On(eventName : String, callback : Function) : void { if(!events.ContainsKey(eventName)) { events.Add(eventName, new Array()); } var callbacks : Array = events[eventName] as Array; callbacks.Push(callback); } public function Broadcast(eventName : String, args : Hashtable) : void { if(events.ContainsKey(eventName)) { var callbacks : Array = events[eventName] as Array; for(var index : int = 0; index < callbacks.length; index++) { var callback : Function = callbacks[index] as Function; callback(args); } } } } [/CODE] So hier kommt die Erklärung! Der Anfang ist denk ich mal selbsterklärend. Wir definieren eine neue Klasse namens GlobalEventSystem und importieren System, da wir etwas daraus benötigen. [CODE] #pragma strict import System; public class GlobalEventSystem { [/CODE] Da wir ein Globales Event System wollen, darf das Objekt dieser Klasse im gesamten Spielablauf auch nur einmal vorkommen. Die einfachste Möglichkeit sowas zu realisieren, sind Singletons! Mehr zu Singleton erfahrt ihr von Dr. Google Hier seht ihr auch, das wenn jemand versucht ein Objekt der Klasse durch den Kontruktor zu erzeugen, das eine Exception geworfen wird (dafür der Import von System). [CODE] // Singleton / Class private static var _instance : GlobalEventSystem = new GlobalEventSystem(); public static function GetInstance() : GlobalEventSystem { return _instance; } private function GlobalEventSystem() { //if the constructor must be public, you can do this: if (_instance != null) { throw new Exception("This is a singleton class! Use GlobalEventSystem.GetInstance() instead!"); } } [/CODE] Nun kommt der Interessante Part! Die Instance [CODE] // Instance / Object private var events : Hashtable = new Hashtable(); public function On(eventName : String, callback : Function) : void { if(!events.ContainsKey(eventName)) { events.Add(eventName, new Array()); } var callbacks : Array = events[eventName] as Array; callbacks.Push(callback); } public function Broadcast(eventName : String, args : Hashtable) : void { if(events.ContainsKey(eventName)) { var callbacks : Array = events[eventName] as Array; for(var index : int = 0; index < callbacks.length; index++) { var callback : Function = callbacks[index] as Function; callback(args); } } } [/CODE] Wir definieren:[list] [*]ein Attribut, das alle unsere Events und deren Listener festhält. [*]eine Instanz Methode zum hinzufügen eines Listeners [*]eine Instanz Methode zum senden eines Events [/list] Beim Triggern (absenden/auslösen) von Events können wir eine Hashtable mit Argumenten mit geben, welche an die Listener Funktionen übergeben wird. (das Löschen von Listenern, ist aktuell nicht vorgesehen ) Aber wir benutzen wir das ganze nun? Gute Frage! Man stelle sich vor wir haben eine Datei "Example.js", welche darauf wartet eine Audio Datei abzuspielen. Dabei ruft sie vom Event System die Methode "On" mit einem Schlüssel (hier "PlaySoundEvent") auf und übergibt zusätzlich eine Callback Funktion. Eine Funktion die ausgeführt werden soll, wenn das Event ausgelöst wird. [CODE] #pragma strict var anySound : AudioClip; private var eventSystem : GlobalEventSystem = GlobalEventSystem.GetInstance(); private var audioSource : AudioSource; function Start () { audioSource = GetComponent(AudioSource); eventSystem.On("PlaySoundEvent", function(args) { PlaySound(); }); } function PlaySound() : void { audioSource.clip = anySound; audioSource.Play(); } [/CODE] Irgendwo anders in unserem Spiel sagen wir, das wenn irgendwas passiert (z.B. die Leertaste gedrückt wird), dann soll dieses Event ausgelöst werden. [CODE] #pragma strict private var eventSystem : GlobalEventSystem = GlobalEventSystem.GetInstance(); function Update() { if(Input.GetKeyDown(KeyCode.Space)) { eventSystem.Broadcast('PlaySoundEvent", new Hashtable()); } } [/CODE] Und "BÄÄMMM" passiert es Ich hoffe es gefällt euch. Wieso ich das geschrieben habe? Als ich über Unity und Events via Google auf dieser Seite gelandet bin: [url="http://unity3d.com/learn/tutorials/modules/intermediate/scripting/events"]http://unity3d.com/l...cripting/events[/url] Las ich folgendes unter JS Source: [quote] [color=#708090]//Javascript doesn't have a built-in "event". Instead,[/color][color=#708090]//you will need to use C# to gain this functionality.[/color][color=#708090]//Other scripts written in Javascript can still subscribe[/color][color=#708090]//to events created in C#.[/color] [/quote] Schrecklich oder? EDIT: 20.03.2015 - 21:12 Uhr Heyho - ich hab wirklich nen miesen Bug in der ganzen Sache gefunden. Beim wieder laden von Szenen kann/wird es passieren das Instanzen der Singleton mehrfach existieren, da sie beim wechseln einer Szene nicht die Static Member eine Klasse entfernen xD ist das nicht schrecklich. Man glaub nen leeren/neuen Kontext zu bekommen, aber das ist nur augenscheinlich der Fall. Jedenfalls soll mich das nicht stören. Ich hab die Klasse wesentlich angepasst, damit es in die Kategorie MonoBehaviour Objekt fällt und somit vom GC beachtet wird. Im groben sieht es nun so aus: [CODE] #pragma strict import System; import UnityEngine; public class GlobalEventSystem extends MonoBehaviour { // Singleton / Class private static var _instance : GlobalEventSystem; // = new GlobalEventSystem() public static function GetInstance() : GlobalEventSystem { return _instance; } function Awake() : void { _instance = this; } // private function GlobalEventSystem() { // //if the constructor must be public, you can do this: // if (_instance != null) { // throw new Exception("This is a singleton class! Use GlobalEventSystem.GetInstance() instead!"); // } // } // Instance / Object private var events : Hashtable = new Hashtable(); public function On(eventName : String, callback : Function) : void { if(!events.ContainsKey(eventName)) { events.Add(eventName, new Array()); } var callbacks : Array = events[eventName] as Array; callbacks.Push(callback); } public function Broadcast(eventName : String) { Broadcast(eventName, null); } public function Broadcast(eventName : String, args : Hashtable) : void { if(args == null) args = new Hashtable(); if(events.ContainsKey(eventName)) { var callbacks : Array = events[eventName] as Array; for(var index : int = 0; index < callbacks.length; index++) { var callback : Function = callbacks[index] as Function; callback(args); } } } } [/CODE] Damit das ganze läuft hab ich mir einfach ne System Prefab gebastelt, die alle meine Szenenweiten System Singleton Skripte hält ;-). Diese einfach in die Szene einzubinden sollte ja wohl easy sein xD So Far - Nax
  13. Im Prinzip mach die Methode dasselbe wie die Range Annotation für minimal und maximal wert. Sprich wenn der Wert unter 0 sinkt, wird er auf 0 gesetzt. und wenn der wert über 1 geht, wird er auf 1 gesetzt.
  14. Nax

    #6 Tabl - Krank -.-

    Heyho [b]Tabl [/b] ich schreibe dich nun zum dritten mal an, in der Hoffnung das dieser Post endlich mal stehen bleibt... Ich drücke immer eine mir vom Mac bekannte Tastenkombination, welche hier auf Windows wohl die vorherige Seite lädt. Wirklich ätzend Naja was wollte ich dir schreiben? Achja! Sind dir die anderen Beiträge aufgefallen? Toll oder? Nein nicht nur damit du mehr Gesellschaft hast. Ich dachte mir einfach, wenn ich irgendwelche tollen Skripte habe, welche ich ruhig einfach mal posten kann so mach ich das auch einfach. Ja...ich sag doch das ist toll Natürlich kann ich das nicht andauernd machen...zu mal ich auch seit heute morgen mega Kopf- und Nackenschmerzen habe. Dazu noch dieser verdammte Schnupfen... Hast du eigentlich gewusst, das die Insider hier hin und wieder eine Challenge Veranstalten. Also eine Herausforderung meine ich. In was? Natürlich wird ein Spiel entwickelt. Überall auf der Welt finden solche kleinen Turniere statt und was dabei rauskommt ist manchmal wirklich verdammt cool. Ich frage mich schon die ganze Zeit was das Thema der nächsten Challenge wird. Wie ich das mit dem Thema meine? Naja, irgendjemand setzt grobe Eigenschaften, welche die eingereichten Spiele, die sich für die Challenge anmelden erfüllen müssen. Soll es 2D oder 3D sein. Sollen bestimmte Skripte oder Assets verwendet werden. Oder soll eine zentrale Schlüsselfigur Bestandteil der Handlung sein. Es gibt viele Wege die Challenge möglichst spannend zu gestalten und für die Teilnehmer soll natürlich auch ein diverser Lohn bei rausspringen. Zum Beispiel diverse Schlüssel zum Freischalten von Spielen auf der Plattform Steam oder so. Schließlich muss man die Entwickler doch mit irgendwas locken. So wie die Maus mit dem Käse Naja bis zum nächsten mal [b]Tabl[/b] [font=courier new,courier,monospace]Post Rätsel: [/font][i]"[font=courier new,courier,monospace]Wer lebt von der Hand im Mund?"[/font][/i]
  15. Nax

    Moin Moin

    Willkommen Sascha
  16. Nax

    #2 Snippets - Internationalisierung

    Heyho, ich hab einbissl mit Internationalisierung herumgespielt und dabei ist folgendes rausgekommen ([url="https://gist.github.com/Naxmeify/8519ae9dde7857a26585"]Github Gist[/url]) Nehmen wir an, wir haben eine Datei für die englische Sprache: [CODE] #pragma strict public class English { public static var lang : Hashtable = { // General "game_name": "My Awesome Game" // Menus , "new_game" : "New Game" , "save_game" : "Save Game" , "load_game" : "Load Game" , "quit_game" : "Quit Game" , "end_game" : "End Game" , "settings" : "Settings" }; } [/CODE] Und erstellen nun auch eine Datei für die deutsche Sprache: [CODE] #pragma strict public class German { public static var lang : Hashtable = { // General "game_name": "Mein ehrfürchtiges Spiel" // Menus , "new_game" : "Neues Spiel" , "save_game" : "Spiel speichern" , "load_game" : "Spiel laden" , "quit_game" : "Spiel verlassen" , "end_game" : "Spiel beenden" , "settings" : "Einstellungen" }; } [/CODE] Und möchten nun die passende Übersetzung ganz einfach benutzen, z.B. so: [CODE] #pragma strict function Start() { Debug.Log(I18N.Get('game_name')); } [/CODE] Dann brauchen wir was dahinter, das es uns einfach macht. Z.B. sowas: [CODE] #pragma strict public class I18N { private static var defaultLang : String = "en"; private static var gameLang : String = ""; private static var noTranslationText : String = "Translation missing for {0}"; private static var langs : Hashtable = { "en": English.lang, "de": German.lang }; private static function CheckAndSetUserLanguage() : boolean { switch(Application.systemLanguage) { case SystemLanguage.Afrikaans: SetLang("af"); break; case SystemLanguage.Arabic: SetLang("ar"); break; case SystemLanguage.Basque: SetLang("eu"); break; case SystemLanguage.Belarusian: SetLang("be"); break; case SystemLanguage.Bulgarian: SetLang("bg"); break; case SystemLanguage.Catalan: SetLang("ca"); break; case SystemLanguage.Chinese: SetLang("zh"); break; case SystemLanguage.Czech: SetLang("cs"); break; case SystemLanguage.Danish: SetLang("da"); break; case SystemLanguage.Dutch: SetLang("nl"); break; case SystemLanguage.English: SetLang("en"); break; case SystemLanguage.Estonian: SetLang("et"); break; case SystemLanguage.Faroese: SetLang("fo"); break; case SystemLanguage.Finnish: SetLang("fu"); break; case SystemLanguage.French: SetLang("fr"); break; case SystemLanguage.German: SetLang("de"); break; case SystemLanguage.Greek: SetLang("el"); break; case SystemLanguage.Hebrew: SetLang("he"); break; case SystemLanguage.Icelandic: SetLang("is"); break; case SystemLanguage.Indonesian: SetLang("id"); break; case SystemLanguage.Italian: SetLang("it"); break; case SystemLanguage.Japanese: SetLang("ja"); break; case SystemLanguage.Korean: SetLang("ko"); break; case SystemLanguage.Latvian: SetLang("lv"); break; case SystemLanguage.Lithuanian: SetLang("lt"); break; case SystemLanguage.Norwegian: SetLang("nn"); break; // TODO: Check case SystemLanguage.Polish: SetLang("pl"); break; case SystemLanguage.Portuguese: SetLang("pt"); break; case SystemLanguage.Romanian: SetLang("ro"); break; case SystemLanguage.Russian: SetLang("ru"); break; case SystemLanguage.SerboCroatian: SetLang("sr"); break; // TODO: Check case SystemLanguage.Slovak: SetLang("sk"); break; case SystemLanguage.Slovenian: SetLang("sl"); break; case SystemLanguage.Spanish: SetLang("es"); break; case SystemLanguage.Swedish: SetLang("sv"); break; case SystemLanguage.Thai: SetLang("th"); break; case SystemLanguage.Turkish: SetLang("tr"); break; case SystemLanguage.Ukrainian: SetLang("uk"); break; case SystemLanguage.Vietnamese: SetLang("vi"); break; case SystemLanguage.ChineseSimplified: SetLang("zh_Hans"); break; case SystemLanguage.ChineseTraditional: SetLang("zh_Hant"); break; case SystemLanguage.Unknown: SetLang(defaultLang); break; // Unknow Fallback to defaultLang case SystemLanguage.Hungarian: SetLang("hu"); break; }; if(gameLang.length > 0) { return true; } return false; } public static function GetCurrentLang() : String { CheckAndSetUserLanguage(); return gameLang; } public static function SetLang(lang:String) : void { if(langs.ContainsKey(lang)) { gameLang = lang; } else { gameLang = defaultLang; } } /** * Example use: I18N.Get("game_name") -> "My Awesome Game" */ public static function Get(key:String) : String { return Get(key, {}); } public static function Get(key:String, args:Hashtable) : String { var lang : Hashtable = langs[GetCurrentLang()] as Hashtable; var value : String = lang[key] as String; if(value.length == 0) { return String.Format(noTranslationText, key); } else { return StringManipulation.Format(value, args); } } } [/CODE] Ich hoffe es gefällt euch - bis denne
  17. In my mind? Time to sleep! Gute Nacht an alle Insider xD

  18. Wenn ich diese ganzen DataBinding dinger sehe - frage ich mich ob ein Scope Objekt wie in Angular möglich ist. Und noch interessanter wäre vllt sogar das soweit zu treiben das an sich jedes Game Objekt innerhalb des Scopes davon betroffen sein könnte - sprich das ich jedes passende Model Attribute an jedes Asset passend legen könnte O_o Also quasi MVVM gesamt drüber gelegt mit Sub-Scopes für diverse Controller oder Directives.... xD Die Frage nach diversen Injections käme an der stelle ebenfalls ^^ Durch das EventSystem könnten watcher realisiert werden...Broadcasting gibts ja bereits damit ^^ Über Editor Scripts oder Prototyping hätte man vielleicht auch ein paar Möglichkeiten ....ah ich steig aus xDD
  19. Nax

    #1 CharakterSkripte - CharacterStats

    Jo hier möchte ich ein einfach Charakter Skript vorstellen. Dieses Skript kann dem Charakter (Spieler/Player bzw. FPSController/CharakterController) angefügt werden. Das Skript soll Charakter Informationen festhalten und im Verlauf der Zeit auch aktualisieren. Ein Beispiel ist ein Überlebensspiel (Survival Game), wie Rust oder Stranded Deep. Halten wir fest, das wir folgende Status-Attribute steuern wollen:[list] [*]Leben (Health) [*]Hunger (Hunger) [*]Durst (Thirst) [*]Ausdauer (Stamina) [/list] Halten wir ebenfalls fest, das Hunger und Durst sich im Verlauf der Zeit reduzieren und Ausdauer durch Anstrengungen reduziert wird, wie z.B laufen oder springen. Wir erstellen also ein neues Skript (JavaScript) und beginnen erstmal ganz stupide mit: [CODE] #pragma strict [/CODE] Super! Nun können wir unsere Attribute (Variablen) definieren (die vier o.g.) - wir wollen das diese auch Variable sind (nicht private): [CODE] // Health var health : float = 1; var healthFallRate : int = 150; // Hunger var hunger : float = 1; var hungerFallRate : int = 150; // Thirst var thirst : float = 1; var thirstFallRate : int = 100; // Stamina var stamina : float = 1; var staminaFallRate : int = 35; var staminaFallRateSwim : int = 60; var staminaFallRateJump : int = 3; [/CODE] Sollte unser Charakter sterben, weil er kein Leben hat, muss entschieden werden, was danach passiert. Lassen wir doch einfach ein anderen Level laden (also eine andere Szene). Ganz einfach die "Start" Szene. Natürlich machen wir das als Attribute und Variable, damit man im Editor das noch anpassen kann. [CODE] // Level to Load if Character die var characterDeathLevel : String = "Start"; [/CODE] Die nun erwähnten Attribute halten wir fest, für die nächsten Blog Beiträge (#3 und #4): [CODE] private var characterMovCon: CharacterMovementCondition; private var characterHeaCon: CharacterHealthCondition; [/CODE] [b]CharacterMovementCondition[/b] wird uns Informationen liefern, ob und wie sich unser Charakter gerade bewegt. [b]CharacterHealthCondition[/b] gibt uns diverse Informationen über den Gesundheitlichen Zustand unseres Charakters. Damit diese beiden deklarierten Variablen auch initiale Werte erhalten benutzen wir die Start Funktion (wir gehen davon aus, das die Komponenten am selben GameObject hängen): [CODE] function Start() { characterMovCon = GetComponent(CharacterMovementCondition); characterHeaCon = GetComponent(CharacterHealthCondition); } [/CODE] Die Update Funktion nutzen wir zur stetigen Aktualisierung der Status-Attribute: [CODE] function Update() { HealthControl(); HungerControl(); ThirstControl(); StaminaControl(); } [/CODE] Erstellen wir unsere Hilfsfunktionen bevor wir die Kontrolfunktionen definieren. Wir brauchen:[list] [*]Eine Funktion zur Normalisierung unserer Attribute (Alle Status-Attribute sind niemals über 1 oder unter 0) [*]Eine Funktion für die kontinuierliche Reduzierung eines Status-Attributes [*]Eine Funktion, welche beim Tod die nächste Szene lädt [/list] [CODE] function Normalize(min:int, max:int, value:float) { value = value <= min ? min : value; value = value >= max ? max : value; return value; } function StatFall(stat:float, fallRate:int) { if(stat >= 0) { stat -= Time.deltaTime / fallRate; } return stat; } function CharacterDeath() { Application.LoadLevel(characterDeathLevel); } [/CODE] Und nun schreiben wir uns die dementsprechenden Kontrollfunktionen! Als erstes Die Kontrollfunktion für das Leben. Wir wollen, das das Leben sich reduziert, wenn:[list] [*]Der Charakter hungrig ist [*]Der Charakter durstig ist [*]Wenn hungrig und durstig, dann doppelt so schnell [/list] Sollte das Leben auf 0 sinken, ist der Charakter tot... [CODE] function HealthControl() { if(hunger <= 0 && thirst <= 0) { health -= Time.deltaTime / healthFallRate * 2; } else { if(hunger <= 0 || thirst <= 0) { health -= Time.deltaTime / healthFallRate; } } if(health <= 0) { CharacterDeath(); } } [/CODE] Geil! Nun wollen wir dafür sorgen, das der Charakter auch hungrig wird. Wir wollen das der Charakter kontinuierlich hungriger wird: [CODE] function HungerControl() { hunger = StatFall(hunger, hungerFallRate); hunger = Normalize(0, 1, hunger); } [/CODE] Das selbe gilt natürlich für den Durst: [CODE] function ThirstControl() { thirst = StatFall(thirst, thirstFallRate); thirst = Normalize(0, 1, thirst); } [/CODE] Bei der Ausdauer machen wir einwenig mehr. Wir wollen das der Charakter bei Anstrengungen seine Ausdauer reduziert bis diese Erschöpft ist. Nach muss er warten bis er genug Ausdauer hat, um seine Anstrengungen fortsetzen zu können. Wie z.B. laufen und springen. Fassen wir zusammen:[list] [*]Wenn der Charakter normal geht oder steht lädt sich seine Ausdauer auf [*]Wenn der Charakter läuft wird seine Ausdauer reduziert [*]Wenn der Charakter springt wird seine Ausdauer reduziert [*]Wenn seine Ausdauer zu niedrig ist kann nicht laufen und auch nicht springen [/list] [CODE] function StaminaControl() { if(characterMovCon.isRunning) { stamina -= Time.deltaTime / staminaFallRate; } else if(characterMovCon.isSwimming) { if(characterMovCon.isFastSwimming) { stamina -= Time.deltaTime / staminaFallRateSwim * 2; } else { stamina -= Time.deltaTime / staminaFallRateSwim; } } else { stamina += Time.deltaTime / staminaFallRate; } if(characterMovCon.isJumping) { stamina -= Time.deltaTime / staminaFallRateJump; while(characterMovCon.isJumping) { yield WaitForSeconds(0.1); } //stamina -= Time.deltaTime / staminaFallRateJump; } if(stamina <= (Time.deltaTime / staminaFallRateJump)) { characterMovCon.denyJumping(); } else { characterMovCon.allowJumping(); } if(stamina <= (Time.deltaTime / staminaFallRate)) { characterMovCon.denyRunning(); } else { characterMovCon.allowRunning(); } stamina = Normalize(0, 1, stamina); } [/CODE] Na wenn das mal nicht gut aussieht ;-) Ich hab euch das Skript in den Anhang gelegt. Viel spaß damit, und natürlich viel spaß beim erweitern Nächstes CharakterSkript wird CharacterStatsGUI - da visualisieren wir dann die Stats
  20. Jo hi, ich hab ein kleines Snippet erstellt, um Vorlagen in Unity3D gerendert dazustellen. Mit "gerendert" meinte ich natürlich den Texte in seiner Endgültigen Version. Beispielsweise haben wir einen Text in dem Platzhalter versteckt sind, so können mit dem normalen "String.Format" Platzhalter, Komma-Separiert angefügt werden. Beispiel: [CODE] var text = "Hallo {0}, wie geht es dir? Heute haben wir {1}. Wie geht es eigentlich {2}? Bis dann {0}."; var result = String.Format(text, "Thomas", "Regen", "Julia"); // Result = "Hallo Thomas, wie geht es dir? Heute haben wir Regen. Wie geht es eigentlich Julia? Bis dann Thomas." [/CODE] Doch was wäre wenn wir sowas haben: sometext: [CODE] Sehr geehrter Herr {0}, Wir haben mit dem Kaufvertrag vom {1} die Lieferung eines {2} zum {3} fix vereinbart. Der Liefertermin ist nun über {6} Tage verstrichen, aber Sie haben nicht geliefert. Deshalb treten wir hiermit vom Kaufvertrag zurück und verzichten auch auf eine spätere Lieferung. Stattdessen mussten wir uns kurzfristig einen PKW-Anhänger leihen und werden später bei einem anderen Lieferanten bestellen. Die Kosten für die Ausleihe sowie eventuelle Mehrkosten für die neue Beschaffung, werden wir Ihnen belasten. Mit freundlichen Grüßen {7} [/CODE] Man stelle sich vor, man hätte mehrere Lange Texte mit Variablen Inhalt, dann immer String.Format passend aufzurufen wäre verdammt nervig...besonders wenn man alle Parameter dafür zwar zu Hand hat, vielleicht sogar noch viele weitere, und dann muss man den entsprechenden Quellcode dafür schreiben. Meiner Meinung nach, viel zu viel. Besser wäre da eine extrem einfache Vorlagen Lösung, die die passenden Stellen im Text identifiziert und aus einer Tabeller möglicher Variablen herausnimmt. Der Text könnte dann so aussehen: [CODE] Sehr geehrter Herr {spielername}, Wir haben mit dem Kaufvertrag vom {kauf_datum} die Lieferung eines {produkt_genetiv} zum {liefer_datum} fix vereinbart. Der Liefertermin ist nun über {tage_ueberfaellig} Tage verstrichen, aber Sie haben nicht geliefert. Deshalb treten wir hiermit vom Kaufvertrag zurück und verzichten auch auf eine spätere Lieferung. Stattdessen mussten wir uns kurzfristig einen PKW-Anhänger leihen und werden später bei einem anderen Lieferanten bestellen. Die Kosten für die Ausleihe sowie eventuelle Mehrkosten für die neue Beschaffung, werden wir Ihnen belasten. Mit freundlichen Grüßen {absender} [/CODE] Nun brauchen wir quasi nur noch eine Tabelle mit passenden Werten. Die könnte so aussehen: [CODE] { "spielername": "Max", "produkt_genetiv": "Autos", "kauf_datum": "01.02.2015" "liefer_datum": "11.02.2015", "tage_ueberfaellig": "10", "absender": "Horst Walter", "id": "123123", "produkt_id": "123123", "blabla": "blub blub" } [/CODE] Wenn ein Schlüssel nicht vorhanden ist, wird ein entsprechender Platzhalter Text hinterlegt und andere Schlüssel werden einfach Ignoriert. Hier die Lösung für einfach String Manipulation ([url="https://gist.github.com/Naxmeify/899685a556a9f4a12ff4"]Github Gist[/url]): [CODE] #pragma strict import System.Text.RegularExpressions; public class StringManipulation { private static var interpolate : String = "\\{(.+?)\\}"; /** * Example use: StringManipulation.Format("{name} {weather}", { "name": "Tom", "weather": "Rain" }); -> "Tom Rain" */ public static function Format(value:String, args:Hashtable) : String { var match = Regex.Match(value, interpolate); while(match.Success) { var key : String = match.Groups[1].Value; var replacement : String = args[key] as String; if(replacement.length > 0) { value = value.Replace(match.Value, replacement); } // Debug.Log("Value: "+value); // Debug.Log("Key: "+key); // Debug.Log("Replacement: "+replacement); // Debug.Log("Match: " + match.Value + " Success: "+match.Success); // Debug.Log("============================================"); match = match.NextMatch(); } return value; } } [/CODE] Bis zum nächsten Snippet
  21. Nax

    Hallo

    (erster Foren Post - ewiges zu schauen und lesen reicht nicht mehr xD) Ich bin der Matt. Ich bin 28 Jahre alt und komme aus Niedersachsen. Ich arbeite als Programmierer - angestellt sowie selbstständig. Tjo, bis denne
  22. Nax

    #5 Tabl - Return of Nax

    Heyho [b]Tabl[/b], was geht? Wir haben uns ja schon ewig nicht mehr gesprochen. Ist alles klar bei dir? Schon fast 1 Jahr her unser letztes treffen oder? Du glaubst nicht, was in diesem (fast) Jahr passiert ist . Neuer Job in anderer Firma. Unendlich viele Stunden nur Fehleranalyse und Debugging. Weg von GWT und Spring. Dafür Grails und Angular. Bei Unity unzählige Skripte geschrieben. Seit einer kurzen Weile Unity5. Seit einer weile entwickle ich selbst ein feines Spiel und das [url="https://github.com/Ninevillage/u3d"]U3D-CLI[/url] Tool ist schon richtig krass . Das Tool unterstützt neben einfach starten und initialisieren nun auch das Bauen der Projekte. Wenn ich das Testen fertig habe, ist das eine saubere Grundlage für CI sowie Automatische Veröffentlichung, und der Asset Manager nimmt auch langsam aber stetig Form an . Gerade arbeite ich noch einbissl an dem View für den Asset Manager, aber die Richtung in die das ganze laufen wird gefällt mir . Achja, ich hatte erwähnt, das ich selbst seit einer Weile ein Spiel entwickle. Joa so langsam bin ich bei Unity gut dabei. Aber ich mache das nicht allein. Nein, nein. Meine Freundin als Grafikerin mischt gut mit und meine kleine Tochter hat unglaubliche Ideen. Hin und wieder glotze ich sogar Dokus mit ihr, um an diversen Stellen vom Spiel der Realität näher zu kommen. Worum es dabei geht? Nein, nein. Das verrate ich noch nicht . Achja, und wir haben noch jemanden im Boot. Jemand der sich verdammt gut mit 3D Modellen auskennt. Der macht wirklich Hammer Modelle . Wirklich ein kleines gutes Team. Bis dann [b]Tabl[/b] [font=courier new,courier,monospace]Rätsel Post #3 Tabl war: [font=courier new,courier,monospace][i]"Welche Brille trägt man nicht auf der Nase?"[/i][/font][/font] [font=courier new,courier,monospace]Die Antwort lautet: [i]"Die Klobrille[/i][/font][i]"[/i] [font=courier new,courier,monospace]Rätsel Post #4 Tabl: [/font][i]"[i][font=courier new,courier,monospace]Welcher Fisch ist der höflichste?"[/font][/i][/i] [font=courier new,courier,monospace]Die Antwort lautet: [/font][i]"[font=courier new,courier,monospace]Der Bückling"[/font][/i] [font=courier new,courier,monospace]Post Rätsel: Welcher Stuhl hat keine Beine und kommt doch hoch hinaus?[/font]
  23. Nax

    #3 Tabl - The Riddler?

    Bisher kam ich noch gar nicht dazu die Fragen zu lesen Aber sollte ich eine Lesen zu der es noch keine Antwort gibt, werde ich es versuchen, sofern ich es kann
  24. Nax

    #4 Tabl - Pure Stress

    Hi [b]Tabl[/b], sorry das ich dich nicht regelmäßig aufsuchen kann. Leider werde ich andauernd mit irgendwelchen Anfragen oder Aufträgen abgelenkt. Was man nicht alles für sein täglich Brot tut.[list] [*]Webseiten bauen [*]Webseiten aktualisieren [*]Shop Plattformen konfigurieren [*]Java Applikationen zur Steuerung und Auswertung von Produktionslinien [*]Java Web Applikationen usw. usw. [/list] Tja, und dann muss ich auch noch an einem anderen Projekt schrauben, was das Zeug hält. So im Bereich e-commerce over all. Natürlich versuche ich meine Zeit für Unity zu finden, aber leider verlangt auch mein Körper regelmäßig nach Erholung. Bisher kam ich auch nicht dazu am u3dam weiterzumachen. [b]Tja, wo sind denn die guten Neuigkeiten? [/b] Mein Team wächst. Neben einer Grafikerin kam noch ein weiterer Programmierer dazu. Vielleicht ist das der moment, wo ich das Projekt "dc" erwähnen sollte. [b]Was das ist?[/b] Die Erwähnung an dieser Stelle muss reichen. Mehr Informationen gibt es zu einem anderen Zeitpunkt. Bis denn [b]Tabl[/b] [i][font=courier new,courier,monospace]Post Rätsel: Welcher Fisch ist der höflichste[/font][/i]
×
×
  • Neu erstellen...