Jump to content
Unity Insider Forum

devandart

Members
  • Content Count

    434
  • Joined

  • Last visited

  • Days Won

    18

Everything posted by devandart

  1. devandart

    Zelda Klon

    Manchmal hilft es auch, einen spielbaren Prototypen zu bauen. Dann fallen einem neue Möglichkeiten des Charakters ein, vielleicht auch Dinge, die sich von anderen Spielen abheben und mit etwas Glück fällt dir daraufhin eine Geschichte ein, die mit diesen Möglichkeiten zusammenhängen. Zudem weißt du dann besser, ob es wirklich technisch umsetzbar ist, was du vorhast. Ein RPG ist nicht gerade die Einstiegsklasse. Du kannst ja z.B. mal The Witcher 3 spielen und dir überlegen, was du anders oder besser machen wollen würdest. Das könnte auch einen kreativen Ausgang haben.
  2. Meinst Du mit Streaming bzw. der Idee sowas wie Google Stadia? Ich glaube, da wirst Du nicht weit kommen, wenn du fragst, ob Unity Bilder übertragen kann. Input an Server und Bild zurück an Client ist kein Problem... Aber Game Streaming in Echtzeit ist noch eine ganz andere Hausnummer mit mindestens(!) einer Million mehr Probleme und Herausforderungen.
  3. Kopieren des ganzen Projektordners reicht aus. Zu dem HUB Problem kann ich leider nichts sagen.
  4. Das war jetzt auch eher der saubere Weg. Mit einem public Feld geht das natürlich auch. Ich würde das ganze eher so machen, damit man von außen nicht ausversehen im Code den Wert verändert. Aber super, dass du damit zurechtkommst. [CreateAssetMenu(menuName = "My Game Assets/Animal Data")] public class AnimalData : ScriptableObject { [SerializeField] private string animalName = "Animal Name"; [SerializeField] private int meatValue; //öffentliches Property public int MeatValue { get { return meatValue; } } }
  5. Gerne. ScriptableObjects sind nicht so viel anders als z.B. eine Komponente. Du erstellst ein "Skript", sprich eine C# Klasse Darin erbst du von ScriptableObject Erstellst die Felder, die du brauchst Nun kannst du im Asset Explorer mit Rechtsklick über das Kontextmenü dein Objekt bzw. eine Instanz dessen erstellen und die Werte im Inspector editieren [CreateAssetMenu(menuName = "My Game Assets/Animal Data")] public class AnimalData : ScriptableObject { [SerializeField] private string animalName = "Animal Name"; [SerializeField] private int meatValue; } Nun kannst du über Rechtsklick - Create - My Game Assets - Animal Data eine Instanz erstellen und diese benennen (z.B. "Zebra"). Anschließend kannst du in jedem Skript ein Feld vom Typ AnimalData anlegen und das ScriptableObject über den Inspector in dem Slot zuweisen. public class Zebra : MonoBehaviour { [SerializeField] private AnimalData data; } Und immer, wenn du in dem einen ScriptableObject "Zebra" den Wert meatValue änderst, kriegen alle Objekte, die dieses zugewiesen haben, die neuen Werte. Ich hoffe, es ist verständlich.
  6. Genau für sowas gibt es ScriptableObjects.
  7. Du hast also EIN Enum mit den Werten Zebra, Gnu usw.? Dann so: enum AnimalType { Zebra = 30, Gnu = 20 } //... AnimalType animal = AnimalType.Zebra; int value = (int)animal; Aber abgesehen davon könntest Du auch ein ScriptableObject machen, welches z.B. eine Basisklasse Animal hat. Dann kannst Du Zebra, Gnu etc. davon ableiten und deine Objekte im Inspector auch weitergehend bearbeiten, sofern es nicht nur bei dem einen Wert bleibt. Dann hat dein Fleisch einfach einen ScriptableObject "Animal" Slot, wo Du dann das entsprechende SO aus den Assets reinziehst. Aber ich weiß ja nicht, wie komplex die Logik da wird.
  8. Das passiert, weil Du keine Variable vom Typ Camera in deiner Klasse hast. Du musst also entweder die Main Camera nehmen, oder die Kamera im Inspector der Komponente zuweisen. //im Inspector zuweisen [SerializeField] private Camera screenshotCamera; //und unten dann screenshotCamera.Render(); //usw... //Main Camera nutzen z.B. camera.Render() ersetzen durch Camera.main.Render(); Du kannst übrigens Code mit dem Code-Tag in deinen Post einbetten, dann kann man den auch direkt kopieren und korrigiert posten. Ich hoffe, das hilft dir.
  9. Schaue mal hier in der Antwort, ich nutze für sowas eine RenderTexture, in welche die Kamera den Render schreibt und ich meine, dass dies auch nötig ist. https://answers.unity.com/questions/22954/how-to-save-a-picture-take-screenshot-from-a-camer.html
  10. Die Idee finde ich gut. Oder dein Charakter geht in eine Höhle, Schlafplatz oder was auch immer. So wie viele andere Spiele das auch machen. Damit verhinderst du auch ohne viel Denken, dass in deinem Charakter irgendwas dummes spawned.
  11. Du kannst Areale für Tiere machen, aus denen diese nicht herausdürfen. Beim "hetzen" laufen sie an der Grenze dann eben wieder zurück oder schon vorher in eine andere Richtung. Und dann kannst du die Entfernung vom Spieler zum Areal-Spawner messen oder so. Wozu ist es denn zwingend nötig, die Tierpositionen zu speichern? Du kannst ja auch einfach sowas wie "Menge an getöteten Tieren" pro Spawner speichern. Ist es für das Gameplay nötig, jedes Tier im Detail persistent zu speichern? Genau. Und da gibt es viele Ansätze. Aber um eine Art level of detail für die Messung wirst du wahrscheinlich nicht herumkommen. Du kannst aber die Abfragen der Messung in eine Queue packen und diese werden dann jeden Frame abwechselnd abgefragt. Also Update Frame 1 = Tier 1 - Tier 10 misst, Update Frame 2 = Tier 11 - 20 misst. Oder so in der Art.
  12. Nur ein paar Anregungen: Tiere kannst du mMn problemlos despawnen, wenn der Spieler z.B. weiter als x Meter entfernt ist und das vielleicht noch über eine Dauer von x Minuten Für das spawnen von Tieren und prüfen, ob diese schon oder noch da sind bzw. leben, brauchst du keinen Collider. Du packst dir einfach Referenzen in eine Liste oder so und kannst jederzeit abfragen, ob dein Tier schon oder noch lebt. Hierfür bekommt jedes Tier eine Eigenschaft Health. Wenn diese 0 ist, ist das Tier tot. Prozentualen Kram kannst du mit https://docs.unity3d.com/ScriptReference/Random.html machen Das mit der Entfernung messen kann komplexer werden. Aber grundsätzlich kannst du das Distanz messen für Spawner auf verschiedenen Frames ausführen und/oder erst pro Areal (1km² z.B.) prüfen, ob der Spieler darin ist und dann nur darin alle Prüfungen pro Spawner machen oder oder oder, nicht ganz trivial.
  13. Gerne! Und das ist ganz normal beim Programmieren, dass man da manchmal Stunden oder sogar Tage oder Wochen keine Lösung für etwas bestimmtes findet. Die Kunst ist es glaube ich durchzuhalten, bis man bei den meisten Problemen die Lösung für selbstverständlich hält.
  14. Du hast lediglich dein Array mit einer Größe von 5 Feldern erstellt. In diesen 5 Feldern sind aber überall NULL-Verweise, weil hinter dem jeweiligen Feld kein Spieler-Objekt existiert. Du musst also für alle Felder einen Spieler instanzieren. Ist Spieler eine normale Klasse, oder erbt diese von MonoBehaviour? Davon hängt ab, wie du die Felder initialisierst. Wenn die Klasse nicht von MonoBehaviour erbt, geht das z.B. so for(int i=0; i<spielerListe.Length; i++) { spielerListe[i] = new Spieler(); }
  15. Ich bin verwirrt. Es ging doch eben noch nicht um Speichern/Laden von Enemies, sondern das Übergeben von Wetterdaten/sonstigen Einstellungen oder nicht? Damit sich dein Wetter-Manager oder was auch immer selbst initialisieren kann... Oder liege ich falsch?
  16. Die kannst Du je nach Datenfeldern einfach mit dem JsonUtility speichern und auch laden. https://docs.unity3d.com/ScriptReference/JsonUtility.html
  17. Du könntest die Daten in einer statischen Klasse oder einem ScriptableObject speichern. In der neuen Scene lädt sich das jeweilige Objekt selbst und referenziert die Klasse/ das ScriptableObject und nimmt dessen Daten in Awake oder wo auch immer. Finden tut er dein Objekt wahrscheinlich nicht, weil dieses zum Zeitpunkt des Aufrufs noch nicht "da" ist, sprich geladen wurde.
  18. Super, dass du den Fehler lösen konntest! Das war mehr subjektiv gemeint. Z.B. kann es gefährlich/verwirrend werden, wenn Du direkten Zugriff auf die CharacterList hast (meine Meinung). Dort könntest Du dann auch, wenn schon ein Manager existiert, auch sowas wie "CreateCharacter(alle Parameter)" als Methode machen, die einen fertigen Character zurückgibt und das ganze zur Liste hinzufügen macht der Manager intern. Aber das ist nur so eine Idee. Zudem übergibst du als Parameter "int gender" und schreibst im Konstruktor, wofür welcher Int-Wert steht. Da könntest du z.B. ein Enum public enum Gender { Male = 0, Female = 1 } nutzen, welches du übergibst. Dann werden auch falsche Int-Werte durch Schreibfehler vermieden. Und ich persönlich finde Eine_Tolle_Klasse nicht schön, sondern würde CamelCase EineTolleKlasse schreiben. Aber solange du alleine arbeitest ist das egal.
  19. Mal abgesehen davon, dass das echt schräg aussieht, kannst Du mit dem Visual Studio Debugger durch den Code steppen und sehen, wo der Haken ist. Ja, muss man. Doku s.u. https://docs.microsoft.com/de-de/dotnet/api/system.array.copy?view=netframework-4.8
  20. Ich verstehe das Problem nach schnellem Überfliegen immernoch nicht genau. Aber kannst Du die Karte, die du woanders anzeigen möchtest, nicht einfach dort als anderes GameObject aktivieren und anzeigen, statt das Original rumzuschieben?
  21. Genau, das Ding muss immer auf einem Image liegen und zumindest meiner Erfahrung nach geht es auch nicht auf alpha = 0 images. Super, dass es nun durch Diskutieren gelöst wurde.
  22. Du versuchst mit deiner Maus auf einer transparenten Stelle das Event auszulösen oder? Sofern es um diesen Tooltip geht.
  23. Ich kann mir vorstellen, dass das Problem bei FixedUpdate passierte. Je nachdem wie groß der Unterschied zwischen FPS und Physics ticks ist. Wenn Du im einen Update() Mouse Wheel != 0 hast, im nächsten Update() dann wieder == 0 und dann wird erst FixedUpdate() ausgeführt, kommt immer 0 raus. Eventuell auch ein verlorener Fokus zum Spiel?!
  24. Du hast aber schon UI Elemente, auf denen dieser Code liegt, oder?
×
×
  • Create New...