Jump to content
Unity Insider Forum

MaZy

Members
  • Posts

    706
  • Joined

  • Last visited

  • Days Won

    35

MaZy last won the day on February 21 2023

MaZy had the most liked content!

About MaZy

  • Birthday 02/20/1988

Profile Information

  • Gender
    Male
  • Location
    Hannover

Recent Profile Visitors

42,217 profile views

MaZy's Achievements

Advanced Member

Advanced Member (3/3)

197

Reputation

  1. Ein Smartphone selbst kann keine Videos aufzeichnen, sondern die Apps tun das in dem sie auf das Bild und Ton zugreifen. Das heißt du musst selber schreiben, wie du ein Video aufnehmen willst. Dafür gibt es bestimmt Libraries. Z.B. AVPro Movie Capture, aber kostet 200 Euro und ist für mehr komplexere Sachen gedacht.Das einzige was Unity tatsächlich eingebaut hat sind Screenshots. Wenn du selber wagen willst kannst du Mit Texture die Pixel form screen lesen. Das tust du ganz Zeit und packst dann in eine Liste. Ab da musst du mal schauen, was so man so benutzen kann um daraus ein Video zu machen. Mir fällt da spontan nichts ein.
  2. Hallo im Inspector lasse ich mir ein ObjectField anzeigen. So sieht das in OnInspectorGUI(). SerializedProperty textComponentProperty = serializedObject.FindProperty("m_textComponent"); EditorGUILayout.ObjectField(textComponentProperty); if (GUI.changed) { Debug.Log(textComponentProperty.objectReferenceValue); serializedObject.ApplyModifiedProperties(); EditorUtility.SetDirty(target); } Dort kann ich ein text component reinwerfen. Wenn ich nun ein Text component drag and drop mache, wird beim Debug.Log auch kein null angezeigt. Heißt, dass es funktioniert hat mit drag and drop, doch danach ist es sofort wieder null. Ich weiß gar nicht mehr was ich machen soll. Im selben component ist string dabei und das lässt sich speichern. Benutze 2020.2.3f1 Hab es doch heraus gefunden: Ich hab zwei Types die Text heißen und hat nach falschen Text gesucht. Unity hat mir aber keine Fehlermeldung gezeigt, dass die Types nicht passen, sondern machte daraus direkt null. Zweites Type ist ein Child von UI.Text.
  3. Ist bissel her, aber ich würde es übers Netzwerk machen. Also einfach eine Konsolenanwendung schreiben, welches auch als Server dient. Wenn man Unity startet sollte es damit verbinden und die Daten runterladen.
  4. Wenn irgendwo "Draw" steht, geht es meistens um eine Zeichnung in einem Frame. Leider kenn ich mich da nicht aus, aber bei 100.000 Meshs kann ich auch verstehen, dass man da hohe GPU Auslastung hat. Sieht man die 100.000 wirklich gleichzeitig. Du kannst nämmlich vllt sowas wie Culling machen und nicht zeichnen, wenn man sie nicht sieht. Ansonsten nimm doch einfach gameObjects mit Meshs. Da macht das Unity bissel automatisch.
  5. Nicht direkt UI Tutorial, aber es wird gezeigt in einem Beispiel wie sowas aufgebaut werden kann bzw. sollte. Als Beispiel wird ein Inventar gezeigt, wie man Inventar UI-Scripte aufbauen kann ohne, dass die Scripte mit einander verbunden werden müssen. Eigentlich wirklich gutes Beispiel. Ich selbst verwende es mal so wie im Video und mal nicht so. Ich mag eher selber Coden und wahrscheinlich mag ich es deswegen manchmal anders, aber wenn es eher um Designer-fragen und Handhabung geht, dann ist das im Video echt gut, denn wenn du was ändern willst, dann kannst du das ohne im Code was zu ändern tun.
  6. Hast du die Beschreibung gelesen? Es steht da deutlich, dass VTRK SteamVR ab version 2 nicht unterstützt. https://assetstore.unity.com/packages/tools/integration/vrtk-virtual-reality-toolkit-vr-toolkit-64131
  7. Das Forum lebt auf jeden Fall. Eventuell gibt es kein Rat zu manchen Fragen oder, wenn manche Fragen (sorry, wenn das zu hart klingt) zu dämlich klingen, möchte man manchmal (zu Mindest bei mir so) nicht die Zeit da rein investieren. Ich mein jetzt nicht damit, dass die Frage selbst doof ist oder sondern, um den Inhalt bzw. Kontext. Wenn jemand fragt "Wie lösche im Multiplayer etwas", das ist einfach zu Allgemein. Was benutzt du (der die Frage stellte)? Pun, Mirror, Lidgren oder eigenes? Steht nichts davon und lässt sich daher nicht wirklich beantworten und auch eine Frage, was man schnell mit Google raus findet. Aber wer eine Antwort will, der strengt sich schon beim Schreiben an. Wenn man so umguckt da, sieht man auch, dass einige viel schwierigeres versuchen zu lösen und die verdienen meiner Meinung nach mehr Aufmerksamkeit, da dies nicht so mit "googlen" beantworten lässt. Zusätzlich dazu, ich besuche einmal pro Tag bis alle paar Tage das Forum. Wenn man schneller Antworten haben will zu kleinen Fragen, kann man ja sowas wie Discord benutzen. Das hier gehört zum Beispiel zu den Posts, wo ich ungern Lust habe. Du hast es "nicht gebacken" bekommen, aber was hast du versucht zu backen? Hast du zum Beispiel NetworkManager.onlineScene angewendet? Ich muss hier rumrätseln. Und ja mit OnServerAddPlayer kann man arbeiten, aber muss nicht sein, wenn man AutoCreate Player (oder wie das auch heißt) aktiviert hat. Für OnServerAddPlayer muss aber der Spieler ClientScene.AddPlayer ausführen, sonst wird OnServerAddPlayer nicht ausgeführt. Übrigens würde ich Mirror empfehlen. Es ist die weiter Entwicklung von UNet, da ja UNet nicht weiter entwickelt wird. Bis heute wird Mirror noch weiter entwickelt und bin sogar bei den in Discord ein bisschen aktiv.
  8. Bill Gates sagte eins: "I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it.". Ich lebe tatsächlich nach dieser Prinzip. Ich versuche immer alles schneller und leichter zu machen. Und darum hier mal ein kleiner Code von mir, welches ihr wahrscheinlich auch ab und zu brauchen könntet. Hier ist ein Script welches OverlapCircle etwas erweitert. Öfters habe ich das Problem gehabt, dass ich OverlapCircle einsetze, aber dann nochmal durch loopen muss um zu schauen, ob ich die richtigen Collider2D überhaupt gefunden habe. Aber warum das nicht so bauen, dass ich direkt die Richtigen bekomme? https://gist.github.com/MaZyGer/b4c45395bd6a5d06722a0eecf71c850e Beispiel wenn du eine Granate wirfst und beim Aufprall noch Monster suchen willst, die aber auch noch am Leben sind (um denen Schaden hinzuzufügen): List<Monster> monsters = new List<Monster>(); int count = OverlapCircle<Monster>(Vector2.zero, 10f, new ContactFilter2D() { }, monsters, m => !m.IsDead ); // Andere Möglichkeiten int count = OverlapCircle<Monster>(Vector2.zero, 10f, new ContactFilter2D() { }, monsters); int count = OverlapCircle<Monster>(Vector2.zero, 10f, new ContactFilter2D() { }, monsters, c => c.GetComponentInChildren<Monster>()); int count = OverlapCircle<Monster>(Vector2.zero, 10f, new ContactFilter2D() { }, monsters, c => c.GetComponentInChildren<Monster>(), m => !m.IsDead); Der Code im Link wird vllt in der Zukunft erweitert. Je nachdem was ich brauche werde ich hinzufügen.
  9. Wahrscheinlich Mono selbst ist nichts anders um die Möglichkeit zu geben Plattform unabhängig zu programmieren, das mit C#. Ein Beispiel, ich habe ein Server programmiert, welches mit C# geschrieben wurde und welches sogar einen .exe beinhaltet. Das Programm läuft sowohl in Linux aber auch im Windows. Mittlerweile kann man sogar die Datei direkt starten. Früher musste ich noch mono zusätzlich ausführen. Früher war mono nicht für Systeme gedacht. Eigentlich nur windows. Kurz: Mono hilft die diese Programme die programmiert wurde auszuführen, zu compilen (ja auch in Linux kann man sie compilen und ausführen). Net Standard definiert, welche Libraries in der Programmierung benutzt werden können. Beispiel Netstandard 2 die framework 4.6.1 und die netstanard 1 wäre framework 4.5. Da sind auch aber andere Pakete dabei. Nicht nur Framework. Z.B. Core. Net Framework waren nicht beabsichtigt auf anderen Projekten zu funktionieren. Durch Xamarin und Mono wurde was neues erschaffen, wo man dann für anderen Plattformen erweitern konnte. Net Core benutzt KEIN mono. Wurde bewusst so vom Libraries aufgebaut, dass man auch für andere Plattformen verwenden kann. Ich habe jetzt nicht selbst benutzt, aber ich vermute mal, dass da sowas gibt wie if application is linux then usw. So wie ich auch verstanden habe hat Core auch keine libraries für Interfaces. Sprich kein Fenster wo man navigieren kann (Windows forms, WPF usw). Es ist der originale Mono zu mindest in der API Bereich. Zu modifizieren und zu ändern wäre nicht gut, dann müssten wir auch die Libraries dafür runterladen. Z.B. müsste ich irgendwas zusätzlich auf meinem Linux installieren, damit auch Unitys Version funktionieren soll. Aber der Standard Mono läuft. Unity ist ein Editor. Unity benutzt mono vom Microsoft. Natürlich! Man kann derzeit zwischen net 2.0 standard under net 4.x auswählen. Das sind eigentlich keine Versionen sondern Paketzustellungen. Früher konnte man auch Net 3.5 auswählen. Wichtig ist hier zu unterscheiden, dass wenn dahinter standard steht, dass es nicht das gleiche ist wie, ohne Standard. Standard heißt, dass da bis zu bestimmte libraries, versionen usw enthalten sind. beispiel Framework, Core, Mono usw. Die Schreibweise ist um das zu erkennen ist: Net 4.x bedeutet, dass höchst mögliche soll erlaubt werden beim Programmieren. z.B. .Net Framework 4.7.2 usw. Unity Editor natürlich muss das unterstützen. Sonst geht es nicht. Siehe oben Unity hat ist noch nicht bei der Framework Version. Deswegen geht es noch nicht. Ich glaube standard 2.1 wird das nicht werden. Wird eher immer noch net 4.x sein, da wie ich oben schrieb standard auch viele Sachen hat die wir aber nicht in Unity brauchen. Net 4.x sollte nur die Framework Version sein.
  10. Was Namensfindung angeht kann ich euch Tipps geben. Dies bezieht aber auf Spiele, die tatsächlich Erfolg haben sollen z.B. durch Steam. Man muss sich die Fragen erst mal stellen. 1. Hat das Spiel was einzigartiges? Wenn ja, dann auf keinen Fall so leichte Namen nehmen, wo man bei der Suche zisch andere Spiele findet oder ihr nimmt explizit den Namen, was das Besondere hervorhebt. Beispiele: Titanfall - Weil titane aus dem Himmel fallen Dota (Defense of the Ancients) - Weil man die Ancients verteidigen muss.. ist es zerstört, verliert das Team. Payday - Weil es darum geht, dass man im Spiel immer mehr Geld anhäuft. Portal - Weil man fast nur Portale benutzen muss um voranzukommen (hier also auch das Gameplay). Squad - Weil das Spiel hauptsächlich ohen Kommunkation nicht geht. Squadsmitglieder und Leaeder müssen untereinander kommunizieren sonst ist es verloren (wie in Reallife halt^^). Space Engineers 2. Irgendein "dummen" oder "lustigen" Namen Es gibt Spiele (oder auch Filme usw), die bewusst etwas Dummes oder Lustiges als Name nehmen, weil sowas wie Ohrwurm ist und auf den Ohren bleibt. Beispiel: Garry's Mod (weil der Entwickler Garry ist und die Firma heißt Facepunch). Pavlov VR Mehr fallen mir da gerade nicht ein. Aber bei Apps gibt es jede Menge sowas. 3. Einen einzigartigen Namen geben, aber nichts zum Content aussagt oder sehr sehr gering etwas aussagt. Sowas ist finde ich immer wieder toll, wenn es Namen erfunden werden, die gar nicht existieren. Und das macht das Spiel dann sehr besonders. Jeder von uns kennt z.B. Half-Life. Beispiele: Half-Life Rust Counter-Strike Stellaris (Das Wort aber bezieht sich aber auf Stellar und ist ne Mischung aus Latein) - Ist ein Weltraumspiel Just Cause Gothic Fortnite - Wobei hier der Name von Fortnight kommt und um Four Nights (also 14 Tage und Nächte) geht. Max Payne - Kann man auch zu Punkt 1 zuordnen, aber da geht es echt um diesen Charakter selbst und seine Story. Über Content wird hier nichts gesagt. Die Besonderheiten des Spiels ist ja nicht Max Payne selbst sondern die schönen Bullettimes. ANNO XXX - Die ganzen Anno reihen ^^. 4. Namen die einfach gefunden werden sollen. Manchmal nimmt auch Namen bewusst, dass man bei der Suche finden soll. Sowas empfehle ich nicht, weil man da schon sehr oft Namensverletzung hat. Ein Beispiel von mir. The revenge of the Space Invaders. - Geschützter Name Space Invaders. Auch wenn im Spiel um Invader und Space geht, darf man es nicht so verwenden. Was aber geht ist: Invaders from Space: The Revenge. Dot Color Switch - Color Switch geschützt. Dot switch color oder Switch dot color würde gehen. Oder ganz anderen Namen wie Dot color swap. Persönliche Meinung. Ich mag es gar nicht, wenn der Titel eines Spiels so bestimmt wird, was auch Gameplay / Content aussagt. Beispiel: Back to earth: Ist nicht interessant genug. Warum? Ich weiß ok sie waren von der Erde weg und wollen zur Erde zurück. Das war es auch. Anders wäre es aber mit einen interessanten Namen davor (einfach so mal spontan, auch wenn es sich kacke anhört). Hitstrikes: Back to earth - Hier würde man sich fragen, was sind Hitstrikes. Wieso wird das so genannt. Gibt es noch andere Spielreihen davon?. Ein Schluss Wort Garry Newman sagte: Was wenn "Mario" das Spiel einfach nur "Coin Grab" hieße. Niemand würde an das Spiel sich später erinnern.
  11. Nein kein Odin. Also mein Beispiel zeigt auch keine Werte an. War auch für mich nicht wichtig. Könnte es eventuell mit Custom Inspector anzeigen lassen, aber hab sowas für ScriptableObjects nie gemacht.
  12. Glückwunsch für den neuen AssetStore Packet. Ich persönlich bin nicht so der Fan davon (bezogen auf das Video) und ich meine das gab es frei zu downloaden. Aber wenn ich mal sowas brauche mache ich passend zum Objekt. Beispiel passend zu meinem Projekt, Health, Shield.. (siehe unten) alles in einem ScriptableObject und das benutze ich das als Kommunikations (Ja Events gibt es da auch). Ich benutze sehr selten mittlerweile Singletons. Nur bei Komplexen ein System Sachen die einmal da sind (Beispiel mein InputReader Klasse) oder Kleinigkeiten wie (public static) Player.localPlayer. Bei komplizierteren Sachen stell ich mir das aber harter vor. Ich frage mich zum Beispiel, wie man das verwenden könnte, wenn man jetzt kleinere Minibosse hat, die ab und zu da sind dann im HUD einen Healthbar anzeigen möchte. Muss ich für jeden SO Asset erstellen? Gut es könnten ja alle, den einen Asset teilen, aber was wenn mal zwei Minibosse gleichzeitig gibt und ich will beide Healthbars anzeigen lassen.. Dann lässt sich das nicht so leicht teilen. Ein Beispiel wie ich zum Beispiel mein Health und Shield UI update. [CreateAssetMenu] public class DamageEventSO : ScriptableObject { public EventValue<float> Health; public EventValue<float> Shield; } public struct EventValue<T> { public UnityAction<T> OnValueChanged; T value; public T Value { get => value; set { this.value = value; OnValueChanged?.Invoke((T)(object)this.value); } } } So wie man sieht, ist das hier generic und brauche da nicht floats, ints oder sonst ähnliches.
  13. Das dürfte nicht gehen, da ja ein Handshake oder so aufgebaut wird und die sind höchstwahrscheinlich unterschiedlich, aber man kann den node.js client in Unity benutzen und damit verbinden.
  14. Ok hat lange gedauert, aber man muss mit serializeObject arbeiten. Man muss also in meinem fall das hier machen SerializedObject scenenObjectSO = new SerializedObject(scenenObjects); var scenenNetId = scenenObjectSO.FindProperty("scenenNetId"); scenenNetId.intValue = i; scenenObjectSO.ApplyModifiedProperties(); SerializedObject netObjectSO = new SerializedObject(netObject); var netIdProp = netObjectSO.FindProperty("netId"); netIdProp.intValue = i; netObjectSO.ApplyModifiedProperties();
  15. Hallo, ich habe einen Script welches im Editor automatisch läuft. Der überwacht, ob sich in der Hierarchy was geändert hat. Wenn ja sucht es nach bestimmten Components und setzt dann die Werte (einfach jeden eine bestimmte Zahl zuweisen). Doch sobald man von ein anderen Scenen in die Scene in Playmode wechselst sind die Werte plötzlich wieder zurück gesetzt zu den Wert, den ich per Hand eingegeben habe ODER es nimmt den Standardwert von Prefab oder so. Ich vermute mal, dass mir irgendwas wie speichern fehl, aber finde dazu kaum was. Es hat was zwar mit Editor zu tun, aber erbt den Editor Script nicht. Auch was mir eingefallen ist, dass normaleweise ja wenn man in der Scene im Inspector vom Prefab Werte ändert, dass es in Fettschrift angezeigt wird. Das passiert beim Script auch nicht. using Maz.Network.UnityEngine; using System.Linq; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; [InitializeOnLoad] public static class NetworkSceneObjectEditor { static NetworkSceneObjectEditor() { if(!EditorApplication.isPlaying) EditorApplication.hierarchyChanged += OnHierarchyChanged; } static void OnHierarchyChanged() { if (EditorApplication.isPlaying) return; var all = Resources.FindObjectsOfTypeAll<NetworkSceneObject>(); var networkSceneObjects = all.Where(obj => (obj.hideFlags & HideFlags.HideInHierarchy) != HideFlags.HideInHierarchy); //Debug.LogFormat("There are currently {0} GameObjects visible in the hierarchy.", networkSceneObjects.Count()); int i = 0; foreach (var o in networkSceneObjects) { var netObject = o.GetComponent<NetworkObject>(); if (netObject == null) { Debug.Log("NetworkObject is missing! NetworkSceneObject will not work"); continue; } o.scenenNetId = i; netObject.NetId = i; //EditorUtility.SetDirty(o); //EditorUtility.SetDirty(netObject); //EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene()); i++; } Debug.Log($"Hiearchy changed"); } } Hab paar Dinge versucht mit speichern der Scene oder SetDirty, aber da merke ich, dass dann dieser Event gespamt wird. Hab keine weiteren Ideen mehr.
×
×
  • Create New...