Jump to content
Unity Insider Forum

AniProGuy2

Members
  • Content count

    61
  • Joined

  • Last visited

Everything posted by AniProGuy2

  1. Hallo Community, Ich plane ein Spiele Projekt mit Unity, genauergenommen eine App. Das Prinzip ist recht simpel: Multiplayer Survivel mit Crafting und allen drum und dran. Ich habe auch bereits angefangen, ein paar Objekte zu modellieren und ein paar nützliche Scripte zu schreiben, aber bevor ich so richtig anfange, hätte ich gern noch ein paar Tipps zum Thema Performance (weil ich zuvor noch nie für Handys produziert habe). Es ist ja kein Geheimnis, dass Handy wesentlich weniger Rechenleistung haben, als gängige Computer, deshalb komme ich bei dem Thema Performance ziemlich ins wanken. Eigentlich sollte man den Polygone Counter und auch die Objektanzahl niedrig halten, zumindest gehe ich davon aus. Aber ich würde mich schon wünschen, dass die Map so groß wie möglich ist. Einfach weil das bei Survival Spielen den Reiz ausmacht, und v.A. bei Multiplayer Games pielen auch notwendig ist. Ich habe den Vorteil, dass mein Spiel die Vogelperspektive nutzen wird (ähnlich wie bei dem Spiel "Last Day on Earth"). Es müssen also nie wirklich viele Objekte gleichzeitig gerendert. Ich frage mich dabei aber, ob die generelle Anzahl an Objekten in der Szene auch sehr ins Gewicht fällt, wenn es um Performance geht? Oder ist das bei der Vogelperspektive weniger bedeutend? Denn da wird es kritisch, ich möchte viele Bäume, Steine usw. haben und auch durch das Bauen seitens des Spielers kommen einige Objekte dazu. Die Optik ist weniger das Problem. Es soll den klassichen Low Poly Look haben, deshalb ist der Polycount pro Baum z.B. um die 50. Hättet ihr da allgemein ein paar Tipps, was ich beachten muss? Ich bin dankbar für alle! MfG, AniProGuy2
  2. AniProGuy2

    Performance Tipps für mein geplantes Projekt?

    Danke für die Tipps! Was mich aber allgemein einfach interessieren würde: wenn ich mehrere tausend Bäume in meinem Spiel habe, aber immer nur 5-10 gleichzeitig zu sehen sind, ist das dann trotzdem sehr performance lastig? Ich hätte nämlich schon gern ein paar dichte Wälder, aber zur Zeit scheint es so zu sein, dass bei 2.000 Bäumen schon langsam das Limit erreicht ist 😕
  3. Also das mit dem authorativen Server klingt natürlich logisch und auch mehr als wünschenswert. Allerdings bin ich mir nicht sicher, inwiefer nich das umsetzen kann, da wie gesagt meine Fähigkeiten in diesem Bereich noch nicht so ausgereift sind. Allerdings werde ich mir das definitiv einmal ansehen und eventuell auch einmal ausprobiere (je nachdem, wie schwierig das ist). Aber ansonsten ist meine Variante nachvollziehbar, bzw. logisch, oder? Es ist natürlich sehr cheatanfällig, das ist richtig und leider wohl auch mit meiner Umsetzung nicht wirklich vermeidbar
  4. Hallo liebe Community, ich arbeite ja bereits seit einiger Zeit an einem Spiel, welches ich durch PUN netzwerkfähig machen möchte. Dabei handelt es sich allerdings um meinen ersten Versuch, Networking in einem Spiel umzusetzen und dementsprechend bin ich auf diesem Gebiet auch noch ein Anfänger (wobei ich schon einiges gelernt habe, in den letzten Monaten). Nun stellt sich mir allerdings eine grundsätzliche Frage zum Thema "Synchronisation" für mein Spiel. Und zwar ist die Synchronisation von Spieler-Objekten in meinen Augen noch verhältnismäßig simpel. Client A hat seinen Spieler und auf diesem Spieler lasse ich alle wichtigen Funktionen laufen, deren Auswirkungen (Animationen hauptsächlich) ich dann auf allen anderen Clienten für dieses Spieler-Objekt nachmachen lasse (dafür kann ein Spieler-Objekt immer im aktiven und im nicht-aktiven Modus sein, sprich selbst aufführen oder nachmachen). Damit gibt es soweit eigentlich auch keine Probleme. Was mir allerdings Kopfschmerzen bereitet, sind Nicht-Spieler-Objekte. In meinem Spiel sind diese ein essentieller Bestandteil des Grundkonzeptes. So gibt es z.B. Baumaterial wie Holz oder Steine und auch Waffen wie Bomben, die als Objekte in der Landschaft herumliegen, und mit denen jeder Spieler interagieren kann (z.B. diese aufsammeln). Nun ist für mich die Sychronisation dieser Objekte ein großes Fragezeichen. Und zwar ist es meines Wissens nach ja so, dass die Position eines Objektes - nehmen wir einmal das Spieler-Objekt - immer von Besitzer des Objektes hin zu den anderen Clienten synchronisiert wird. Sprich, wenn Client A seinen Spieler bewegt, wird diese Bewegung zu allen anderen Clienten synchronisiert. Allerdings haben besagte Nicht-Spieler-Objekte ja eigentlich keinen Besitzer, da jeder Client das gleiche "Anrecht" auf sie hat, sprich mit ihnen interagieren und sie aufsammeln kann. Somit steht nicht statisch fest, von welchem Clienten aus z.B. ihre Position zu den anderen Clienten synchronisiert werden muss. Und genau das ist für mich das Problem. Mein bisheriger Lösungsweg sieht folgendermaßen aus: Wird eines dieser Nicht-Spieler-Objekte von einem Spieler aufgesammelt, wird automatisch dieser Spieler zum neuen "Besitzer", was via "Ownership Transfer" in PUN umgesetz wird. Die Position dieses Objektes und auch die Berechnungen im Objekt werden nun von besagtem Spieler aus sychronisiert (das Aufsammeln dieser Objekte stellt in meinem Spiel glücklicherweise in den meisten Fällen die Grundlage einer Interaktion mit ihnen dar). Sammelt ein Spieler also nun eine Bombe auf und wirft diese auf einen anderen Spieler, ist das Treffen der Bombe und somit der entsprechende Schaden für den anderen Spieler, davon abhängig, ob die Bombe in der Version des "Aufsammlers" auch wirklich trifft. Das liegt daran, dass das Treffen und all seine Konsequenzen (Explosion, Schade, Zerstörung der Bombe) nur bei dem "Aufsammler" be,-und errechnet werden und zu allen anderen Clienten nur sychnronisiert wird (der Aufsammler ist ja wie bereits gesagt der Besitzer). Das Prinzip is also gleich dessen der Spieler-Objekte, nur dass der Besitzer nicht mehr statisch ist, sondern durch das Aufsammeln eines Objektes wechseln kann. Somit ist eine Sychronität dieser Objekte (sofern ich es richtig umsetze ;P) immer gewährleistet. Alleridings ist es auch möglich, dass in der Version des Aufsammlers die Bombe aus besagtem Beispiel trifft und Schaden macht, aber in der Version des Ziels dies gar nicht der Fall ist (durch einen Lagg oder aus anderen Gründen). In diesem Fall ist also der Besitzer im Vorteil. Meine eigentliche Frage ist nun: Haltet ihr dieses Konzept für sinnvoll? Oder gibt es da viel bessere Lösungswege? Oder habe ich da etwas komplett falsch verstanden und es ist eigentlich ganz einfach? ^^ Ich bin dankbar für jede Hilfe! mfG, AniProGuy2
  5. AniProGuy2

    .txt File nach erstellen direkt bearbeiten?

    Ok, danke für die Hilfe. Das werde ich direkt ausprobieren! Gibst immer super Hilfe! Danke dafür ^^
  6. Hallo liebe Community, Ich habe schon seit längerem mit dem Problem zu kämpfen, dass ich eine .txt File nicht bearbeiten kann, nachdem ich sie erstellt habe, sofern ich beides in der selben Methode mache. Ich verstehe nicht genau warum, aber es kommt immer der Error "Sharing violation on path", wenn ich es versuche. Mein Code ist recht simpel: File.Create (path); StreamWriter currentClonkData = File.AppendText (path); currentClonkData.Close (); Weiß jemand von euch, was ich machen muss, um beides in einer Methode tun zu können? MfG, AniProGuy2
  7. AniProGuy2

    PlayerPrefs in neuer Scene abfragen?

    Hallo Community, Ich habe ein Problem mit den PlayerPrefs, das ich allein einfach nicht lösen kann. Das Prinzip dessen, was ich machen will, ist recht simpel erklärt. Ich mache ein Multiplayer Spiel mit der Photon Engine und dabei gibt es eine Integer "HostOrClient" in den Playerprefs, die jenachdem ob man hostet oder joint auf 0 oder 1 gesetzt wird. Damit wird dann in der Lobby-Scene gearbeitet, also z.B. ob man das Spiel starten kann oder ob man ein neues Passwort setzen kann usw. Das Problem ist nur, dass wenn ich beim joinen die Integer auf "1" setze und dann in der Lobby-Scene abfrage, sie dort immernoch als "0" angegeben wird. Wenn ich in der Registry nachschaue, ist sie aber dort auch "1". Das ist der Scriptteil für das Joinen. Im Prinzip wird durch das Klicken des Buttons einfach die "JoinRoom" Methode aufgerufen. Nachdem man in den Photon Room gejoint ist, kommt dann "OnJoinedRoom" zurück und man kommt öffnet die Lobby-Scene. // join room void JoinRoom () { PlayerPrefs.SetInt ("HostOrClient", 1); joinedRoom = true; PhotonNetwork.JoinRoom (roomInfo.Name); } // open lobby public void OnJoinedRoom () { if (joinedRoom) SceneManager.LoadScene ("Lobby"); } Und in der Lobby-Scene wird dann dieses Script hier aufgerufen (nur der wichtige Teil versteht sich). Ausgegeben wird dann aber "0" und nicht "1" // start void Start () { print (PlayerPrefs.GetInt ("HostOrCLient")); Könnt ihr mir helfen? Ich verstehe das echt nicht. Wenn ich dann übrigens das Spiel starte (also das eigentliche Level lade) und dort nochmal die Integer abfrage, ist sie dann "1" o.O Danke schonmal im Voraus, MfG, AniProGuy
  8. AniProGuy2

    PlayerPrefs in neuer Scene abfragen?

    Dazu kann ich nur sagen: "verdammt ist mir das peinlich!" Danke xD Damit haben 2 Stunden des verzweifelten Suchens ein Ende!
  9. AniProGuy2

    Wert aus Hashtable als String auslesen?

    Ok danke, werde ich machen ^^
  10. Hallo liebe Community, Ich bin gerade dabei, meinem Spiel eine eigene "Settings" funktion zu geben, also einfach eine gewisse personale Einstellbarkeit. Die dazugehörigen Werte speichere ich in einer hastable (und später dann in einer .txt), was auch super funktioniert. Allerdings ist es nun so, dass ich diese Hashtable gern auslesen würde und einige Werte dort als Strings gespeichert werden. Ein bestes Beispiel ist die Einstellung, ob Chatlogs in Spielelobbies gespeichert werden sollen oder nicht. Der entsprechende Wert ist ein String und kommt aus einem Dropdown-Menü. Diesen speichere ich dann in der Hashtable. Wenn ich ihn nun auslese und zurück zu einem String konvertiere, kann ich diesen aber nicht abfragen. Es kommt zwar kein Error, aber die Abfrage kann niemals einen postiven Wert erhalten, also true werden. Ich versteh nicht so ganz warum, aber es schonmal kein Fehler in der Abfrage, denn der Wert wird richtig abgefragt. Wenn ich allerdings eine Integer abspeichere, sie aus der Hashtable zu einem String konvertiere und dann zu einer integer, kann ich sie abfragen. Ich verstehe das nicht so ganz, da ich auch erst seit kurzem mit Hashtables arbeite. Ich würde mich sehr freuen, wenn mir hier jemand weiterhelfen und es mir ggF. auch gleich richtig erklären könnte ^^ MfG, AniProGuy2 Mein Code: (die Console gibt mir nicht die "1" aus, auch wenn der Wert in der Hashtable eigentlich der Richtige ist) if (settings["SaveLobbyChatLog"].ToString() == "Don't save") print (1);
  11. AniProGuy2

    Wert aus Hashtable als String auslesen?

    @Mark Achso, das wusste ich gar nicht >.< Danke! @Zer0Cool Tatsache, bei den Settings hängt am Ende noch "13 0 13 0 13 0" dran >.<
  12. AniProGuy2

    Wert aus Hashtable als String auslesen?

    Wenn ich es via "print" in die Konsole schreibe, dann ist dort kein \r dabei. Die Theorie klingt zwar logisch, aber ich gehe nicht davon aus, dass das bei mir der Fall ist. . Hier aber mal das Script, mir dem ich die .txt in die Hashtable (bzw. mittlerweile Dictionary) lade: StreamReader sr = new StreamReader ("Settings/Settings.txt"); string[] import = sr.ReadToEnd ().Split ('\n'); sr.Close (); string key; string value; for (int i = 0; i <= import.Length - 1; i++) { key = ""; value = ""; int index = import [i].IndexOf (":"); for (int j = 0; j <= import [i].Length - 1; j++) { if (j < index) key += import [i] [j]; else if (j > index) value += import [i] [j]; } settings.Add (key, value); }
  13. AniProGuy2

    Wert aus Hashtable als String auslesen?

    @ Zer0Cool Die Strings sind definitiv richtig, weil ich sie aus einer .txt in die Hashtable reinlade und dann auch direkt das abfrage, was in der .txt steht. Ich kann gar keinen Schreibfehler haben, aber natürlich habe ich das immer wieder geprüft. @ Hrungdak Das ist eine ziemlich gute Idee! Ich habe zwar für mein Problem mittlerweile eine andere Lösung gefunden, aber ich werde mir das defintiv für die nächsten Male merken. Danke!
  14. AniProGuy2

    Wert aus Hashtable als String auslesen?

    Ich antworte vielleicht etwas spät, aber genau das mache ich gerade ^^ Ich lese Strings aus einem Dictionary aus und vergleiche sie, was aber genauso wenig funktioniert...
  15. Hallo Cummunity, Ich habe ein kleines Problem (mal wieder ^^). Und zwar möchte ich bei meinem Spiel alle offenen Spiele (Rooms) in einer Liste haben. Das funktioniert soweit auch ganz gut, sofern ich für die List-Items nur die jeweiligen RoomOptions auslese (die Rooms selbst bekomme ich ja durch PhotonNetwork.GetRoomList). Nun möchte ich aber auch, dass dort der Name des Hosts angezeigt wird, welchen man in den Spieleeinstellungen festlegen kann. Sprich, ich möchte für den Raum einen extra String anlegen, der diesen Namen speichert. Ich habe mich im Internet belesen und gehe nun davon aus, dass das über Custom Properties funktionieren sollte. Das Problem ist, dass ich nicht so ganz verstanden habe, wie man diese anlegt. Ich habe einen Hasthable und dort ein Objekt Namens "HostName" mit einem String für den Namen angelegt. Nun möchte diesen von einem anderen Clienten, der die Liste mit den Spielen offen hat, auslesen. Aber wie genau geht das? So, wie ich es bis jetzt mache, kommt die Fehlermeldung "NullReferenceException: Object reference not set to an instance of an object" Meine Scripte: Zum Hosten des Raumes: ExitGames.Client.Photon.Hashtable props = new ExitGames.Client.Photon.Hashtable(); props.Add ("HostName", "TestHost"); RoomOptions newOptions = new RoomOptions () { IsVisible = true, MaxPlayers = 5 , CustomRoomProperties = props}; PhotonNetwork.JoinOrCreateRoom ("test1", newOptions, TypedLobby.Default); Zum Auslesen des Hostnamens: item.GetComponent<NetworkListItem> ().Initialize (game.Name, game.CustomProperties["HostName"].ToString(), game.MaxPlayers, game.PlayerCount); Ich bin dankbar für jede Hilfe MfG, AniProGuy2
  16. Hallo Community, Meine Frage ist eigentlich fast selbsterklärend. Ich möchte für mein Spiel ein Script anfertigen (bzw. habe es schon soweit fertig), das als Schnittstelle für Interaktionen dient (z.B. etwas steuern). Dazu wäre es hilfreich, wenn man in eine Liste Components/ Scripte legen kann, bei denen dann Voids angestoßen werden, wie z.B. "UserJoined", "UserQuitted" usw. Welche Scripte in diese Liste gelegt werden, ist dabei variabel und vorher nicht definiert. Es ist nur wichtig, dass die Voids angestoßen werden, und was dann damit gemacht wird, hängt dann vom jeweiligen Script ab. Meine Frage ist nun: ist das möglich? Also Voids in Scripten anstoßen, die vorher nicht definiert sind? Ich habe dazu nichts gefunden und wäre für jede Hilfe dankbar. MfG, AniProGuy2
  17. AniProGuy2

    C#: Voids in nicht definierten Scripten anstoßen?

    Danke für die Korrektur ^^ Ich kenne es aus dem Informatikunterricht als "Anstoßen" aber das ist ja eigentlich auch egal. Ich werde es einmal damit versuchen, danke für den schnellen Rat!
  18. Hallo Community, Ich befasse mich seit einiger Zeit mit der Photon Engine und würde diese gern zur Entwicklung meines Multiplayers nutzen. Es ist nun so, dass ich meine Spieler am Anfang spawne und diese mehrere Avatare haben, die ebenfalls zu beginn instantiatet werden. Nun will ich auf diese zugreifen und nutze dabei gezwungenermaßen für RPC die View Ids. Das Problem ist dabei aber, dass diese bei 1001 anfangen, was ich nicht so ganz verstehe. Ich habe 1.) keine 20 Objekte zu Beginn in der Scene, die ebenfalls eine Photon View haben und 2.) ist das Limit auf 1000 gesetzt. Müsste nicht eigentlich das neu gespawnte Objekt eine ID von sagen wir 20 haben, wenn die zuvor höchste ID 19 war? Wenn ich auf die Objekte über ihre ID zugreifen will, dann beginnt es bei 1001 wieder von vorn und gibt mir das Objekt mit der ID 1. Habe ich einen Fehler gemacht oder habe ich da etwas falsch verstanden? Ich bin dankbar für jede Hilfe! MfG, AniProGuy2 Ps.: Hier habe ich mal sicherheitshalber den Code für das Spawnen des Players, auch wenn der eigentlich ganz normal sein sollte. GameObject player = PhotonNetwork.Instantiate ("NetworkPlayer", transform.position, transform.rotation, 0);
  19. Hallo lieber Unity-Community, Ich habe mal wieder eine Frage. Und zwar bin ich es von der Blender Game Engine gewohnt, dass ich Animationen an eine Variable anpassen kann. Sprich dass die Animation nicht regulär abgespielt wird, sondern sich immer auf dem Frame befindet, der den Wert der Variable hat. Das war sehr nützlich, z.B. wenn man Dinge steuern sollte. Genau das versuche ich nun mit einem Modell in Unity. Und zwar gibt es dort mehrere Zahnräder, die ineinander greifen und letztlich ein bewegliches Teil (Zielvorrichtung) rotieren. Ich wollte, daher eine Animation erstellen, bei der sich der bewegliche Kopf einmal so weit, wie er es kann, nach oben und nach unten rotiert. Diese Animation wollte ich dann über eine Variable an die Mausbewegung anpassen, damit man das Ganze gut steuern kann. Meine Frage ist nun, ist das überhaupt möglich? Oder gibt es da bessere Möglichkeiten, um das umzusetzen? Ich bin wie immer dankbar für jede Hilfe! MfG, AniProguy2
  20. AniProGuy2

    Dinge schieben mit Character Controller

    [Danke für die Hilfe ^^ Ich mache das jetzt erstmal mit dem Kinematic und versuche mal, ob ich noch was anderes finde, das besser funktioniert.
  21. Hallo liebe Community! Zuallererst wünsche ich euch natürlich frohe Weihnachten! Wie ihr im Titel schon lesen könnt, möcht ich in meinem Spiel die Möglichkeit integrieren, etwas zu schieben. Das ist dabei aber nicht einfach ein "dagegenlaufen", sondern eine richtige Interaktion (im spielerischen Sinne). Der Spieler wird also hinter das Objekt gesetzt und bewegt es dann. Bisher habe ich es so gemacht, dass bei der Interaktion der Spieler an die Position eines Empty gesetzt wird (sprich hinter das Objekt) und dann natürlich auch entsprechend dessen rotiert wird. Danach wird das Objekt an Spieler geparented und als Rotationspunkt der Mittelpunkt des zu schiebenden Objektes gesetzt. Man steht also nun dahinter und kann sich um die Achse es Objektes drehen. Was ich nun versuche ist, dass man sich damit bewegen kann. Theoretisch funktioniert das ja automatisch, weil der Spieler über Root Motion gesteuert wird und sich da geparentete Objekt natürlich mit bewegt. Allerdings ist es nun so, dass wenn man gegen etwas läuft (also mit dem zu schiebenden Objekt) sich die Position des Spielers ändert und er nicht mehr hinter dem Objekt steht. Und genau das will ich beheben. Man soll quasi wenn das zu schiebende Objekt sich nicht mehr bewegen kann, sich ebenfalls nicht mehr bewegen können (also in die entsprechende Richtung, z.B. wenn man frontal gegen eine Wand läuft). Den Spieler an das Objekt zu parenten möchte ich nicht machen, weil es da Probleme mit der Steuerung gab (weil der Spieler einen Charakter Controller hat und das Objekt ein RigidBody ist). Wisst ihr, wie ich das machen kann? Zur Hilfe habe hier ich mal das bisherige Bewegungsscript für euch: using UnityEngine; using System.Collections; public class VehicleMovement : MonoBehaviour { public GameObject pushPosition; public Interaction interaction; public Rigidbody physics; private ClonkSettings settings; void Update () { // if the vehicle is in use if (interaction.inUse == true) { if (interaction.start == true) { settings = interaction.user.GetComponent<ClonkSettings> (); settings.rotYAxis = transform.gameObject; settings.blockJump = true; interaction.user.transform.position = pushPosition.transform.position; interaction.user.transform.rotation = pushPosition.transform.rotation; transform.SetParent (interaction.user.transform); interaction.start = false; } } } } Die Settings sind die Einstellungen des Spielers und "interaction" ist einfach ein Script, das bei Interaktion auf "inUse" gestellt wird. Damit man den Beginn der Interaktion abfragen kann, gibt es die Variable "start", die ich bisher auch für die Anfangseinstellung nutze. Ich hoffe ihr versteht wie ich das meine ^^ MfG, AniProGuy
  22. Nun also ich habe Refresh probiert und auch Reimport (all). Bei all denen hat sich aber nichts geändert. Es muss irgendein Bug oder so gewesen sein, denn jetzt funktioniert es ja.
  23. Hallo Community, Ich habe mal wieder ein Problem ^^ Und zwar habe ich als meinen Spieler als ein Pregab. Er besteht aus dem Mesh und der Armature (aus einer .fbx) und dazu noch aus ein paar Emptys, die ich in Unity hinzugefügt habe. Nun ist es so, dass ich an dem Objekt noch ein paar Dinge ändern will, und es dann neu in Unity importieren muss. So will ich z.B. die Augenbrauen des Spielers als seperates Objekt machen (es war vorher eben ein Objekt) und ich brauche auch ein paar "Extra Transforms" für die Dinge, die er halten soll. Wenn ich aber in blender die Augenbrauen seperiere und es dann neu exportiere (und dann die .fbx im Unityordner damit überschreibe), dann fehlen bei dem Prefab die Augenbrauen einfach und sind nicht als einzelnes Mesh vorhanden. Bei dem importierten Objekt stimmt alles, aber bei dem Prefab eben nicht. Ähnlich ist es auch, wenn ich die Extra Transforms in Unity hinzufüge, die fehlen dann bei dem Prefab auch. Wisst ihr, wie ich das machen kann? Bzw. ist das ein Fehler in Unity oder soll das auch gar nicht funktionieren? Ich muss nunmal leider immer wieder kleinere Änderungen an dem Model vornehmen und daher muss ich auch häufiger neu imporieren. Aber ich will eben nicht jedes mal aufs neue das Prefab zusammenbauen müssen, weil das einfach ewig dauert. Ich bin dankbar für jede Hilfe! MfG, AniProGuy2
  24. So, ich habe jetzt nochmal das Prefab erstellt und wenn ich nun in der fbx neue Extra Transforms hinzufügen, dann werden die auch ins Prefab aktualisiert. Ich weiß nicht, woran es lag aber scheinbar war es ein Bug.
  25. Ok, also ich habe die .fbx mal von der Szene ins Prefab gezogen aber da löscht es ja alles raus und das ist im Prinzip dasselbe wie neu machen ^^
×