Jump to content
Unity Insider Forum

Mark

Members
  • Gesamte Inhalte

    2.769
  • Benutzer seit

  • Letzter Besuch

  • Tagessiege

    138

Alle erstellten Inhalte von Mark

  1. Wie siehts mit Steuern in Deutschland aus wenn ihr was übers AssetStore vertickt? So: http://ideone.com/lWMEuI

  2. Hier wurden einige Vor und Nachteile dazu aufgeführt. Passt, denke ich, ganz gut zum Thema: http://forum.unity-community.de/topic/9758-szenenubergreifende-variablen/
  3. Tuts aber nicht child ist null oder hat kein MeshFilter.
  4. Ok, ich rate nur, aber was macht man wenn du die gespiegelte Seite auf Vertexebene editieren willst? Dann müsste er das ja irgendwie wieder auflösen können.
  5. Kannst du das Objekt in Maya nicht in ein ganzes Mesh umwandeln lassen, so dass die Spiegelungs Modifikation verloren geht, aber das Mesh komplett erhalten bleibt? Mods Collapsen oder sowas?
  6. Nächstes Wochenende, vom 17. bis 18. Oktober ist die Devmania in Mainz. Das größte deutsche Hobbyentwickler Treffen. http://2015.devmania.net/

    1. turritom

      turritom

      cool Devmania ist ja quasi der Nachfolger der Dusmania ..die ich immer mit veranstaltet habe ... hätte schonmal bock wieder auf so ein Treffen.

    2. Mark
    3. John

      John

      Schade leider zu weit weg. Aber ich wünsch euch viel Spaß ;)

  7. http://forum.unity-community.de/topic/10297-gfxwaitforpresent/page__hl__gfx.waitforpresent__fromsearch__1
  8. Der Spass wenn man in VS ca 50 C++ Threads gleichzeitig debuggen möchte...

    1. Vorherige Kommentare anzeigen  %s mehr
    2. SilentDev
    3. devandart

      devandart

      Was treibst Du da? :D

    4. Mark

      Mark

      Ich hab was debuggt was Chromium benutzt und das hat gern mal 2 Prozesse + 1 Prozess je Browserfenster, jeder Prozess hat gern seine 5 bis 1 Threads. Das summiert sich und VS mag es nicht wenn soviele native Threads angezeigt werden sollen.

  9. Deutscher Unity Chat mit Bezug zu diesem Forum: http://tinyurl.com/UnityIRC

    1. Felix K.
    2. Slayer

      Slayer

      habt ihr den schon irgendwo eingebunden auf der seite so das man auch ohne deinen Status hinfindet?? Habs noch nirgends gesehen.

    3. Mark

      Mark

      Ich kann das nicht, Sascha könnte das eventuell.

  10. Schau dir einfach mal die System.TimeSpan Klasse an. Das was auch Tiwaz schon gezeigt hat.
  11. Lädst du den Webplayer in einem IFrame oder lädst du sonst irgendwie die Seite mit dem WebPlayer nach? Wenn ja dann lass das. Du kannst HTML Elemente per CSS display style auf none verstecken, das sollte genügen.
  12. Vielen Dank für die Antworten. Ich hätte noch ein paar Fragen wenn denn noch Zeit vorhanden ist. Wie sehr hat eigentlich Markus Heitz Einfluss auf das Spiel? Konnte euch Shaderforge bei den Shadern helfen oder setzt ihr lieber auf eher natürlicheren Shadercode? Habt ihr Tipps für angehende Spieleentwickler? Habt ihr Tipps für angehende Softwareentwickler? Kann man mehr über HORDE erfahren? Kann es von DieZwerge entkoppelt werden? Habt ihr schöne Anekdoten zu der KI, ala lustige und unerwartete Verhaltensweisen?
  13. Multithreading erst später für die Sache einzubauen finde ich interessant als Entscheidung. Was waren eure Hürden im Umgang mit Unity? Was vermisst ihr oder habt ihr vermisst? Wie sehr reizt ihr das Komponentensystem aus? Kann man Zwerge werfen wenn ja wie weit?
  14. Eine Idee ist btw absolut gar nichts Wert. Die Realisierung dagegen schon. Gibt genug Beiträge im Netz die sich genau damit auseinander setzen.
  15. Hallo und danke für die Vorstellung und Gelegenheit Fragen zu stellen. Ich habe auch gleich eine. Es wurde geschrieben dass Battle.Update() sich mit Unity um die Mainthreadzeit streitet. Wieso habt ihr da keine Parallelisierung in Form von Threading wie es zB Unity intern mit der Physik macht und wie es auch viele andere Spiele machen um die Simulation von der Darstellung zu trennen? So wie der Rest des Abschnittes verlauten lässt scheint es ja schon irgendwie im Bereich des möglichen zu sein, oder ich habe das falsch verstanden. Ich freue mich auf eine Antwort, Mark.
  16. Banished war doch sowas wie Überleben+Aufbau und Wirtschaft.
  17. Hier haben sicher die meisten wenn nicht sogar alle eigene Ideen.
  18. Klar, entweder als Prefab was du einfach spawnst wenn du es brauchst, oder du packst es in eine separate Szene und lädst diese, oder du sagst dem UI GameObject dass es sich nicht beim laden einer neuen Szene löschen sollst. Gibt viele Wege dafür.
    1. Vorherige Kommentare anzeigen  %s mehr
    2. Life Is Good

      Life Is Good

      allerdings kleiner als das was man sonst an den branch predictor verlieren würde."

       

      Auf das Schnellersein bei sortierten Daten noch bezogen: "Das gilt natürlich nur für kleinere Werte, bei großen Werten gleicht sich das irgendwann wieder aus "

    3. Djeurissen

      Djeurissen

      Da wäre ja die Frage, was ist wenn man die Daten jedesmal sortiert wenn ein neues Element zur Collection hinzugefügt wird. Das kann in bestimmten Fällen ja dann wieder hilfreich sein oder nicht?

    4. Mark

      Mark

      In dem fall ist das sortieren sogar egal wenn man nur die Schleifen tauscht oder eben den compiler besseroptimieren lässt oder den Code leicht umschreibt. Wirklich relevant ist nur was genau branch prediction für Auswirkungen hat.

  19. Hilft dir das eventuell schon weiter? http://answers.unity3d.com/questions/157940/getoutputdata-and-getspectrumdata-they-represent-t.html
  20. Falsch! Firmen wollen ihre Marken schützen, um den Ruf nicht zu ruinieren durch schlechte Spiele oder ähnlichem. Steckt noch ne ganze menge mehr dahinter, klar. Vorher anfragen ist eine gute Sache.
  21. Man kann den Code so anpassen dass anstatt einer string ID einfach ein enum genommen wird, oder noch cooler die ID per Generic typisieren. Hab auch wirklich mit dem Gedanken gespielt das so zu machen, aber war mir dann doch etwas zuviel des Guten Besonders da es unter Umständen echt viele Stats gibt (man kann dadurch auch Skillsets darstellen, Level, Skillpoints, etc) Ausserdem sollte es ein ähnliches System auch für die Modifikationen selbst geben und da kann es auch wieder hunderte geben. Die Möglichkeit die IDs der Modifikationen und Stats mit einer DB für Beschreibungen etc zu kombinieren hat mich dann doch sehr zu diesem string basierten IDs getrieben.
  22. ACM: Mit Enums meinst du EnumValues anstatt Namen? Ich glaube irgendwo hier im Forum hatten wir das schonmal in der Art und ich finde Enums in dem Fall auch viel besser. Musste aber strings für die Erweiterbarkeit nehmen. Das Problem kann ich aber weitgehendst umgehen indem ich beides kombiniere: enum StatNames { Health, Strength, Dextery NutSize Mana } ... var healthStat = new Stat<float>(StatNames.Health.ToString(), 100); Auch möglich wäre dass ich den Stat CTor Parameter für die ID von string auf object ändere und dann das hier mache: public Stat(object id, T baseValue) { this.ID = id.ToString(); } Aber das würde dann wieder verdecken dass die ID die reingegeben wird zu einen String wird. Oder ich arbeite einfach mit const strings, wäre auch machbar.
  23. Ich möchte euch ein etwas größeres Snippet für RPG Stats und Modifikationen (Items, buffs, etc) vorstellen. Das ganze ist ein Grundgerüst und es muss darauf aufbauend von der Nutzerseite noch etwas gemacht werden, liegt aber daran dass ich unmöglich alle Bereiche die man haben möchte abdecken kann. Was das System aber so in dieser Grundversion schon kann ist: - Beleibige Charakterstats/attribute darstellen, sei es ein Float Attribut, Int, Bool, String oder was anderes. - Stats können verändert werden, sei es permanent oder temporär - Stat Veränderungen können beliebig rückgängig gemacht werden (Buff verfällt, Item wird abgelegt) - Stat Veränderungen und Stats sind so transparent gestaltet dass man eine beliebige UI drauf ansetzen kann um dem Spieler alle wichtigen Infos zu zeigen - Stat Veränderungen und Veränderungen an den Veränderungen können durch Events verarbeitet werden. Zuerst etwas Zucker, wie man das ganze in einer simplen Art und Weise verwenden kann: var health = new Stat<float>("Health", 100); Debug.Log(health.Value); // 100 HP // HP reduzieren var baseModification = (IStatModification<float>)health.Modifications.First(); baseModification.Value -= 10; // leben um 10 HP reduzieren Debug.Log(health.Value); // 90 HP // HP um 50 HP boosten, zB durch ein Item var healthBuff = new StatModification<float>("HealthBuff", 0, new RPG.Stats.Accumulators.Add(), 50); healthBuff.Attach(health); Debug.Log(health.Value); // 140 HP // Buff wieder entfernen healthBuff.Detach(); Debug.Log(health.Value); // 90 HP // Auf Veränderungen reagieren health.Modified += (sender, arguments) => { var floatArguments = (StatModifiedEventArgs<float>)arguments; if (floatArguments.OldValue < floatArguments.NewValue) Debug.Log("Ich wurde geheilt!"); else Debug.Log("Ich wurde verletzt!"); }; baseModification.Value += 20; // Ich wurde geheilt! baseModification.Value -= 10; // Ich wurde verletzt! healthBuff.Attach(health); // Ich wurde geheilt! Stats und StatModifications haben eine ID die eindeutig sein sollte, aber vom System selbst nicht weiter verwendet wird. Durch die ID können extra Informationen von einem Drittsystem abgerufen werden um zB Beschreibungstexte zu den einzelnen Elementen anzuzeigen. Stats können wie man sehen kann durch Modifikationen mit Werten befüllt werden, also auch der Grundwert ist eine Modifikation welche wie im Health Beispiel oben implizit erstellt wird. Die Modifikationen können eine Priorität haben (die Grundmodifikation hat eine Priorität die dafür sorgt dass diese immer zuerst angewandt wird) Prioritäten dienen dazu die Stackmechaniken zu managen, so kann zB dafür gesorgt werden dass alle Wertveränderungen die durch Items verursacht werden (Rüstungsplus, etc) vor Wertveränderungen angewandt werden die durch Verzauberungen kommen (+50% HP). Modifikationen können die Stats dabei auf unterschiedlichste Art und Weise beeinflussen. Im System selbst gibt es 4 Möglichkeiten: - setzen des Wertes - addieren des Wertes - subtrahieren des Wertes - Multiplizieren des Wertes Im Health Beispiel wird das Setzen und Addieren gezeigt. Das wichtigste ist aber das Hinzufügen und Entfernen der Modifikationen selbst, denn darauf basiert das ganze System und ermöglicht es schnell und einfach beliebige Änderungen vorzunehmen. Auch CharakterStats Wachstum beim Levelup ist damit ideal umsetzbar wenn man denn noch die Möglichkeit haben möchte den Charakter zu respeccen. Sprich wenn ich ein LevelDown vornehmen möchte oder gar alle Werte zurücksetzen möchte ist das sehr einfach machbar: var levelUpStatModifications = stat.Modifications.Where(stat => stat.ID == "Levelup").ToArray(); foreach (var modification in levelUpStatModifications) { modification.Detach(); availableSkillPoints++; } Ich hoffe ihr findet es nützlich und könnt damit irgendetwas sinnvolles anfangen. Das ganze besteht aus einigen C# Files, aber davon muss man sich nicht abschrecken lassen um zu wissen was möglich ist reicht ein Blick auf die Interfaces. Im Anhang findet ihr das ganze als zip. Stats.zip Zuerst der Accumulator, welcher benötigt wird um die Verschiedenen Modifikationen miteinander zu verrechnen: IAccumulator.cs namespace RPG.Stats { public interface IAccumulator<T> { T Accumulate(T left, T right); } } Add.cs namespace RPG.Stats.Accumulators { public class Add : IAccumulator<float> { public float Accumulate(float left, float right) { return left + right; } } } Multiply.cs namespace RPG.Stats.Accumulators { public class Multiply : IAccumulator<float> { public float Accumulate(float left, float right) { return left * right; } } } Set.cs namespace RPG.Stats.Accumulators { public class Set<T> : IAccumulator<T> { public T Accumulate(T left, T right) { return right; } } } Subtract.cs namespace RPG.Stats.Accumulators { public class Subtract : IAccumulator<float> { public float Accumulate(float left, float right) { return left - right; } } } Dann die Stats selbst: IStat.cs (enthält auch gleich die eventHandler und EventArgumente für die Stat Veränderungs Events) using System; using System.Collections.Generic; namespace RPG.Stats { public class StatModifiedEventArgs : EventArgs { public enum ModifyType { ModificationAdded, ModificationRemoved, ModificationChanged } public readonly ModifyType Type; public readonly IStatModification Modification; public StatModifiedEventArgs(ModifyType type, IStatModification modification) { Type = type; Modification = modification; } } public class StatModifiedEventArgs<T> : StatModifiedEventArgs { public readonly T OldValue; public readonly T NewValue; public StatModifiedEventArgs(ModifyType type, IStatModification modification, T oldValue, T newValue) : base(type, modification) { this.OldValue = oldValue; this.NewValue = newValue; } } public delegate void StatModifiedEventHandler(object sender, StatModifiedEventArgs e); public interface IStat { string Id { get; } event StatModifiedEventHandler Modified; IEnumerable<IStatModification> Modifications { get; } } public interface IStat<T> : IStat { T Value { get; } } } Stat.cs using System.Collections.Generic; namespace RPG.Stats { public class Stat<T> : IStat<T> { private List<IStatModification<T>> modifications = new List<IStatModification<T>>(); private bool isDirty = true; private T value; public Stat(string id, IStatModification baseModification = null) { this.Id = id; if (baseModification != null) baseModification.Attach(this); } public Stat(string id, T baseValue) : this(id, new StatModification<T>(string.Empty, int.MinValue, new Accumulators.Set<T>(), baseValue)) { } public string Id { get; private set; } public event StatModifiedEventHandler Modified; public IEnumerable<IStatModification> Modifications { get { return modifications; } } public T Value { get { if (isDirty) { isDirty = false; value = default(T); foreach (var modification in modifications) value = (modification as StatModification<T>).Accumulate(value); } return value; } } internal void AddModification(IStatModification<T> modification) { isDirty = true; modifications.Add(modification); modifications.Sort((a, => a.Priority.CompareTo(b.Priority)); if (Modified != null) Modified(this, new StatModifiedEventArgs<T>(StatModifiedEventArgs.ModifyType.ModificationAdded, modification, value, Value)); } internal void RemoveModification(IStatModification<T> modification) { isDirty = true; modifications.Remove(modification); if (Modified != null) Modified(this, new StatModifiedEventArgs<T>(StatModifiedEventArgs.ModifyType.ModificationRemoved, modification, value, Value)); } internal void FireModificationChanged(IStatModification<T> modification) { isDirty = true; if (Modified != null) Modified(this, new StatModifiedEventArgs<T>(StatModifiedEventArgs.ModifyType.ModificationChanged, modification, value, Value)); } } } Und zu guter letzt die Modifikationen: IStatModification.cs using System; namespace RPG.Stats { public class ModificationModifiedEventArgs : EventArgs { public enum ModifyType { Added, Removed, Changed } public readonly ModifyType Type; public readonly IStat Owner; public ModificationModifiedEventArgs(ModifyType type, IStat owner) { Type = type; Owner = owner; } } public class ModificationModifiedEventArgs<T> : ModificationModifiedEventArgs { public readonly T OldValue; public readonly T NewValue; public ModificationModifiedEventArgs(ModifyType type, IStat owner, T oldValue, T newValue) : base(type, owner) { this.OldValue = oldValue; this.NewValue = newValue; } } public delegate void ModificationModifiedEventHandler(object sender, ModificationModifiedEventArgs e); public interface IStatModification { string Id { get; } int Priority { get; } event ModificationModifiedEventHandler Modified; IStat Assignee { get; } void Attach(IStat stat); void Detach(); } public interface IStatModification<T> : IStatModification { T Value { get; set; } } } StatModification.cs namespace RPG.Stats { public class StatModification<T> : IStatModification<T> { private T value; private IAccumulator<T> accumulator; public StatModification(string id, int priority, IAccumulator<T> accumulator, T value) { this.Id = id; this.Priority = priority; this.accumulator = accumulator; this.Value = value; } public string Id { get; private set; } public int Priority { get; private set; } public event ModificationModifiedEventHandler Modified; public IStat Assignee { get; private set; } public T Value { get { return value; } set { if (object.Equals(this.value, value)) return; var oldValue = this.value; this.value = value; if (Assignee != null) (Assignee as Stat<T>).FireModificationChanged(this); if (Modified != null) Modified(this, new ModificationModifiedEventArgs<T>(ModificationModifiedEventArgs.ModifyType.Changed, Assignee, oldValue, value)); } } public void Attach(IStat stat) { if (Assignee != null) return; Assignee = stat; (Assignee as Stat<T>).AddModification(this); if (Modified != null) Modified(this, new ModificationModifiedEventArgs<T>(ModificationModifiedEventArgs.ModifyType.Added, stat, value, value)); } public void Detach() { if (Assignee == null) return; var oldAssignee = Assignee; Assignee = null; (oldAssignee as Stat<T>).RemoveModification(this); if (Modified != null) Modified(this, new ModificationModifiedEventArgs<T>(ModificationModifiedEventArgs.ModifyType.Removed, oldAssignee, value, value)); } internal T Accumulate(T currentValue) { return accumulator.Accumulate(currentValue, value); } } }
×
×
  • Neu erstellen...