Jump to content
Unity Insider Forum

All Activity

This stream auto-updates     

  1. Past hour
  2. Ich hab vor 2-3 Wochen mal wieder Laune auf Unity bekommen und mir von der offiziellen Seite den Editor geladen und installiert. Aber die Versionsnummer lautet: 2018.4.19f1 Personal. Erstmal verstehe ich nicht, warum Unity auf der Homepage solch eine alte Version zum Download anbietet, außerdem habe ich Unity Hub installiert und probiert manuell ein Update zu machen: Aber ich bekomme nach wie vor den Hinweis, dass ich auf dem aktuellen Stand bin und keine neuen Updates verfügbar sind. Wie erhält man die aktuelle Version von Unity ?
  3. Today
  4. Hallo zusammen und zwar hab ich ein Problem, ich hoffe ich bin hier richtig 🙄 Und zwar geht's darum, dass in meiner Scene alles schwarz ist und ich keine Kamera, Licht oder sonstige Gameobjektesehe der Sky Hintergrund ist auch weg... Weiß ned ob ich irgendwas falsch gemacht habe oder woran es liegt. Ich hoffe, jemand kann mir helfen. Gruß Steven
  5. Wo übst du denn Force auf die Kugeln aus? Alles was ich aus dem Code oben entnehmen kann ist, dass du Kugeln an der Position deines Spielers erzeugst. Danach passiert aber nichts mehr. Wie würde, bzw. wie hat dein Code denn ausgesehen als du versucht hast, Force auf die Kugeln auszuüben? @elson
  6. Guten Morgen @Kevin28 - direkt zu Beginn: ICH BIN KEIN EXPERTE! Aber ich kann dich in die richtige Bahn lenken. Du musst dann jedoch selbst recherchieren Ich denke, dass man hier mit dem System.IO Namespace an die Lösung kommen kann. System.IO gibt dir Zugriff auf verschiedene Klassen wie z.B File, DirectoryInfo, usw. die in C# Dateien, Ordner und Pfade auf dem Computer repräsentieren. Mein Lösungsansatz würde wie folgt aussehen: Wenn du dein Spiel schließt (oder von mir aus auch direkt nach der Erstellung der besagten Objekte) erstellst du im persistentDataPath (das ist der Ordner des Programms im Verzeichnis %AppData%) z.B einen Ordner der "Objekte" heißt. Das wäre der erste Schritt, um zu garantieren, dass auch alle Objekte von einem Typen ihr eigenes Verzeichnis besitzen. Dann könntest du über die Childs von deinem "Panel1" drüber loopen und für jedes Objekt eine individuelle Datei mit einer von dir gewählten Endung (z.B .Objekt1.txt oder Objekt1.dat) in diesem Verzeichnis erstellen. All das ist Teil vom System.IO Namespace. // Um ein Verzeichnis zu erstellen, benutz einfach die CreateDirectory-Funktion, die Teil der abstrakten Klasse "Directory" ist. Directory.CreateDirectory(Application.persistentDataPath + "/deinOrdnerName"); // Und schon hast du einen Ordner erstellt. // Angenommen, wir haben deine gewünschten Speicherobjekte als Childs vom Panel in einem GameObject[] (Array) liegen. GameObject[] alleObjekte = new GameObject[]{10}; // 10 Objekte for(int i = 0; i < alleObjekte.Length ; i++) // erstelle 10 Dateien { string dateiPfad = Application.persistentDataPath + "/deinOrdnerName/"; // in diesem Ordner FileStream neueDatei = File.Create(dateiPfad + alleObjekte[i].GetComponent<ObjektInfo>().objektName); // mit diesem Namen // setzt aber voraus, dass das Objekt irgendwo ein public Field / eine Property namens "objektName" hat, das/die wir uns holen können, um die Datei im Order zu benennen. } Jetzt haben wir das Verzeichnis erstellt und für jedes Objekt eine eigene externe Datei angelegt. Problem ist nur, dass wir jetzt noch die Werte des Objektes in diese Datei schreiben müssen, da es ansonsten ja nur leere Dateien wären. Sprich wir springen nochmal zurück in den Loop. Genauer gesagt springen wir an die Stelle, an der wir die Datei erstellt haben. Da du offensichtlich nur mit Strings / Ints / Floats arbeitest, sollten wir in der Lage sein die Werte über einen sogenannten StreamWriter in die Datei zu schreiben, ohne einen BinaryFormatter oder ähnliches zu benutzen. Ein StreamWriter ist gewissermaßen ein Modul, dass wie eine (Achtung: Abstraktion) "Schreibmaschine" funktioniert. Alles, was der StreamWriter von dir verlangt ist ein FileStream. Und ein FileStream ist im Grunde nicht mehr, als eine Repräsentation der Datei, in die der Writer etwas hinein schreiben soll. Bedeutet, dass wir dem StreamWriter den soeben erstellen FileStream als Parameter geben. Jede Instanz vom StreamWriter hat Methoden, auf die du zugreifen kannst. Mit writer.WriteLine(string deinText) kannst du jetzt den von dir gewünschten Inhalt in die externe Datei schreiben, die wir davor noch erstellt haben. Das machst du dann für alle Werte, die du später wieder laden möchtest. Müsste dann irgendwie so aussehen: // wir sind wieder im Loop von eben! for(int i = 0; i < alleObjekte.Length ; i++) // erstelle 10 Dateien { string dateiPfad = Application.persistentDataPath + "/deinOrdnerName/"; // in diesem Ordner FileStream neueDatei = File.Create(dateiPfad + alleObjekte[i].objektName); // mit diesem Namen // das ist der Stream, in den wir nun was schreiben wollen... lass uns also einen StreamWriter erstellen StreamWriter writer = new StreamWriter(neueDatei); // neueDatei geben wir als Stream an den Writer writer.WriteLine("Dies ist ein Testtext, den ich in meine Datei schreibe."); // Jetzt haben wir in die Datei geschrieben. writer.Close(); // Und am Ende schließen wir den Writer noch. Gehört zur Prozedur dazu! } Nachdem wir all das gemacht haben, existieren nun mehrere Dateien im Verzeichnis - losgelöst von deiner Anwendung. Wir haben jetzt 10 Dateien erstellt und in jede Datei etwas hinein geschrieben. Wenn du nun dein Spiel beendest und das Spiel neu lädst, werden die Daten jedoch nach wie vor verschwinden. Das ist dann der Punkt, an dem du vom StreamWriter zum StreamReader überspringen musst. Der StreamReader ermöglicht dir nämlich wie der Name schon sagt, Text aus Dateien auszulesen. Wichtig ist also, dass du nun in irgendeiner Start-Funktion in deinem Programm eine Funktion hast, die zunächst einmal prüft, ob das Verzeichnis für die Objekte existiert und ob innerhalb dieses Verzeichnisses auch Dateien (Objekte) liegen. Ich glaube in C# kannst du die Dateien in einem Ordner in einem FileInfo[] (Array) speichern. Folgendes Beispiel: private void ErstelleGameobjekte() { // Referenz zum Pfad DirectoryInfo meinOrdner = new DirectoryInfo(Application.persistentDataPath + "/deinOrdnerName"); // Prüfen, ob ein Ordner überhaupt existiert machst du so: if(Directory.Exists(meinOrder) { // hier nun ein Array mit allen Files in diesem Ordner... beachte, dass wir eine Funktion vom DirectoryObject benutzen, die einen FileInfo Array returned. FileInfo[] alleDateien = meinOrdner.GetFiles(); } } Nachdem du das gemacht hast, hast du nun alle Dateien in diesem Ordner in deinem Array liegen. Sprich, wir loopen nun über diesen Array und erstellen für jede Datei in diesem Array eine Instanz deines Prefabs und synchronisieren die Daten von diesem Prefab (die wir uns mit GetComponent greifen) dann mit den Daten aus der externen Datei. Das machst du mit dem eben von mir erwähnten StreamReader, der dich nun die Zeilen aus der Datei lesen lässt. Ich glaube, dass wie beim Writer die Funktion dafür einfach Reader.ReadLine(); / Reader.ReadToEnd(); oder so ähnlich sein sollte. Das ist die Richtung in die du gehen kannst. // Gleicher Code wie eben, nur weiter ausgeführt. public GameObject deinPrefab; public Transform irgendeinParent; private void ErstelleGameobjekte() { // Referenz zum Pfad DirectoryInfo meinOrdner = new DirectoryInfo(Application.persistentDataPath + "/deinOrdnerName"); // Prüfen, ob ein Ordner überhaupt existiert machst du so: if(Directory.Exists(meinOrder) { // hier nun ein Array mit allen Files in diesem Ordner... beachte, dass wir eine Funktion vom DirectoryObject benutzen, die einen FileInfo Array returned. FileInfo[] alleDateien = meinOrdner.GetFiles(); foreach(FileInfo info in alleDateien) { GameObject obj = Instantiate(deinPrefab, irgendeinParent); ObjektInfo info = obj.GetComponent<ObjektInfo>(); // wir erstellen einen Reader und geben Ihm als Parameter ein Objekt vom Typ FileInfo... alleDateien ist ja lediglich eine Ansammlung von FileInfos. StreamReader reader = new StreamReader(alleDateien[i]); // hier bin ich mir unsicher, aber ich glaube das sollte funktionieren. info.nameZumBeispiel = reader.ReadToEnd(); // wir speichern das Ergebnis der Datei, die wir auslesen (reader.ReadToEnd() returned einen String) in einer Variable des Scripts der auf deinem Objekt liegt. reader.Close(); // Auch hier wieder den Reader schließen! } } Und im Grunde solltest du an dieser Stelle Informationen vom Computer in dein Spiel geladen haben. Solltest du mit Datentypen arbeiten, die nicht primitiv sind, wird es komplizierter, da du dann BinaryFormatter benutzen musst, um Daten zu serializen, usw. Ein wichtiger Punkt, den ich nicht angemerkt habe ist: JSONUtility. Schau dir auf jeden Fall auch mal Beiträge zu JSON an, da du höchstwahrscheinlich früher oder später Sachen zu JSON konvertieren musst um von dort aus dann weiter zu arbeiten. Ich selbst arbeite z.B größtenteils nur mit Scriptable Objects, demnach weiß ich nicht wie du speziellen Zugriff auf Zeile 3 oder so in einer externen Datei kriegst, um irgendeiner Variable genau diesen Wert zuzuweisen. Aber auch das kannst du durch Recherche easy lösen! Beim Scriptable Object kann ich mir die Werte dann nämlich immer direkt aus den jeweiligen Feldern holen. Nochmals: ich bin kein Experte und wollte dir lediglich die Richtung vorgeben! Sorry, dass ich am Ende etwas schlampig geworden bin. Ich hoffe, ich konnte dir dennoch etwas helfen! LG, Maurice 🙂
  7. Hey @Hans Ulrich - es gibt verschiedene Möglichkeiten, dies zu erreichen. Eine Variante hat Sascha bereits genannt: Raycasting. Du schickst per Mausklick einen "unsichtbaren Strahl" von der aktiven Kamera aus in die Szene. Dieser Strahl kann dann z.B basierend auf den Objekten die er trifft, verschiedene logische Abläufe ausführen. Sollte es sich bei dem Objekt was du angeklickt hast z.B um eine Kiste handeln, möchtest du die Informationen in einem seperaten UI-Panel angezeigt bekommen. Wie mein Vorgänger bereits erwähnt hat, könntest du in diesem Falle einfach ein Panel einblenden, was dann die Informationen aus dem "Kisteninhalt-Script" für dich ausliest und visualisiert. Neben dem Raycasting könntest du ua. auch mit Distanz oder Triggern arbeiten, wenn dein Spiel eher auf Tastaturnavigation aufbaut. Die Funktion Vector3.Distance(float a, float b) returned einen Float, dessen Wert die exakte Distanz zwischen Punkt A und B ist. Du könntest also permanent prüfen, ob die Distanz zwischen der Kiste und dem Player einer gewissen Reichweite (Range) entspricht. Sollte dies gegeben sein, könntest du ebenfalls ein Panel einblenden und auch hier die Daten ans Panel transferieren. Ob du dafür eine extra Taste drücken müsst, oder ob es sich direkt öffnet wenn du in Reichweite bist, liegt dabei ganz bei dir. Für die Trigger-Variante würdest du dem Objekt einfach einen Collider geben und ihn als Trigger kennzeichnen. Dann schreibst du deine Logik in der OnTriggerEnter oder OnTriggerStay Function, die auf der Kiste in einem Script liegt. Die Funktion prüft dann permanent, ob du dich noch im Radius des Triggers befindest. Anmerkung für diese Lösung: OnTriggerStay könnte Mucken machen und nur dann feuern, wenn du dich bewegst. Um dies zu vermeiden, ändere den sleeping Mode vom RigidBody. Nur als letzten Tipp. Das wären drei simple Lösungen, die dich an dein Ziel bringen könnten. Solltest du nicht wissen, wie du allgemein eine Verbindung zwischen GUI und Script herstellen kannst, würde ich dir raten, zunächst einmal das Grundkonzept von Referenzen zu verinnerlichen um zu verstehen, wie du die Werte von Feldern, bzw. von Objekten quer durch dein Projekt schicken kannst. Hoffe, ich habe dich nicht zu sehr verwirrt :D
  8. Yesterday
  9. Also ich bin mir komplett sicher, das alles Nahtlos zusammen ist und kein Spalt offen ist. Die Wand ist auch Doppelwandig und die Normalen sind in der richtigen Richtung. Bei den Einstellungen habe ich einiges versucht, da ich mich überhaupt da nicht auskenne, werde ich sicher was übersehen. Wer kann helfen. Danke in Voraus. Lg Ricky-W
  10. Last week
  11. Hallo, ich habe eine App erstellet, die als Funktion Umsätze zusammenfassen soll. Ich habe ein Script erstellt welches GameObjects erstellt welche einen gewissen wert enthalten und diese bennent. Meine Frage lautet wie ich diese GameObjects speichern kann, so dass sie beim nächsten Öffnen des Programms immer noch vohanden sind. Gibt es eine einfache Möglichkeit dies in meinem Script hinzuzufügen oder etwas im Asset Store was dies ermöglicht? Hier mein Script: public void NeuesElement() { Element = Instantiate(Inhalt); Element.transform.SetParent(GameObject.Find("Panel1").transform); Element.GetComponentInChildren<Text>().text = Preis.text; Element.name = "Umsatz" + NächsteNummer; NächsteNummer++; Vielen Dank Mit freundlichen Grüßen
  12. Ist etwas schwer, zu erraten, wodran es hapert. Dass du die Kiste anschaust, machst du mit einem Raycast von der Kamera weg. Dass das Objekt, das vom Raycast getroffen wurde, von Interesse ist (also zu den Objekten gehört, wegen denen das Info-Panel aufgeht), definierst du am besten mit einer entsprechenden Komponente auf dem Objekt. Was in dem Panel steht, sollte als Datensatz auf der Komponente stehen, sodass du einfach die Daten vom getroffenen Objekt auslesen und an das UI weitergeben kannst. Beim Weitergeben der Daten an das UI gibt es mehrere Wege. Es wäre hier vermutlich in Ordnung, ein Pseudo-Singleton zu nutzen, um die Daten über einen statischen Weg weiterzugeben. Sollte irgendetwas davon (zu) unklar sein (mein Geld liegt auf Punkt 4. ), dann sag Bescheid und ich erzähle ein bisschen was
  13. Ganz ehrlich, da bin ich mir nichtmal so sicher. Wenn du deine Daten aufteilst in Klassen mit unveränderlichem Inhalt (die man nicht kopieren braucht, weil es aufgrund der Unveränderlichkeit okay ist, wenn einfach alle dasselbe Objekt referenzieren) und Structs für die temporären Daten einer Bestellung (wo man keine Deep Copy braucht, weil bei Listen von Structs die Struct-Objekte, also die Daten, direkt in der Liste stehen anstatt referenziert zu werden), dann solltest du ohne Deep Copy klar kommen. Verwirf mal den aktuellen Ansatz und versuche, dir deine Datenstrukturen entsprechend aufzubauen.
  14. Sowie es aussieht hab ich mich mit nem Prefab vertan, also es funktioniert wohl, momentan mit eingestellten "alwayd included Shaders". Demnächst probier ich es noch ohne diese Einstellung aus.
  15. Danke für die Antwort. Hab ich gemacht Material und Shader mit reingepackt, werden im manifest auch aufgelistet. Im Material sind die Parameterzahlen für glossy etc. auch identisch, aber der Shader ist nicht eingestellt. Ich hab jetzt die Shader in den Projektsettings unter always included Shaders eingetragen, aber das hilft auch nicht. Was könnte ich noch machen?
  16. Pack halt das Material und ggf. den Shader mit in das AssetBundle?
  17. Hi, ich benutze Unity3D 2018.und habe ein Script eingesetzt um ein Assetbundle selbst zu erstellen, dass Laden mache ich per Script. Jetzt funktioniert das Laden wenn das Mesh ein oder mehrere Standardmaterialen bzw. Standard-Shader benutzt. Wie mache ich das nun, wenn sie nicht Standard sind vorallem eben der Shader?
  18. Ich hoffe das erklärt es besser.Wenn jemand noch eine Idee hat wäre ich für Hilfe sehr dankbar.
  19. Ich habe mir eine Welt erstellt und wollte dort hinein einen Third Person Charakter einfügen, ganz normal mit den Standartscript von Unity. Jetzt hab ich aber das Problem, dass wen man alleine nur sehr flachen Berg hoch geht immer IsGrounded auf false geht und man sich so nur sehr verglitch fortbewegen kann. Hat jemand eine Idee wie man diesen Bug beheben kann? Hier ist das Script: using UnityEngine; namespace UnityStandardAssets.Characters.ThirdPerson { [RequireComponent(typeof(Rigidbody))] [RequireComponent(typeof(CapsuleCollider))] [RequireComponent(typeof(Animator))] public class ThirdPersonCharacter : MonoBehaviour { [SerializeField] float m_MovingTurnSpeed = 360; [SerializeField] float m_StationaryTurnSpeed = 180; [SerializeField] float m_JumpPower = 12f; [Range(1f, 4f)][SerializeField] float m_GravityMultiplier = 2f; [SerializeField] float m_RunCycleLegOffset = 0.2f; //specific to the character in sample assets, will need to be modified to work with others [SerializeField] float m_MoveSpeedMultiplier = 1f; [SerializeField] float m_AnimSpeedMultiplier = 1f; [SerializeField] float m_GroundCheckDistance = 0.1f; Rigidbody m_Rigidbody; Animator m_Animator; bool m_IsGrounded; float m_OrigGroundCheckDistance; const float k_Half = 0.5f; float m_TurnAmount; float m_ForwardAmount; Vector3 m_GroundNormal; float m_CapsuleHeight; Vector3 m_CapsuleCenter; CapsuleCollider m_Capsule; bool m_Crouching; void Start() { m_Animator = GetComponent<Animator>(); m_Rigidbody = GetComponent<Rigidbody>(); m_Capsule = GetComponent<CapsuleCollider>(); m_CapsuleHeight = m_Capsule.height; m_CapsuleCenter = m_Capsule.center; m_Rigidbody.constraints = RigidbodyConstraints.FreezeRotationX | RigidbodyConstraints.FreezeRotationY | RigidbodyConstraints.FreezeRotationZ; m_OrigGroundCheckDistance = m_GroundCheckDistance; } public void Move(Vector3 move, bool crouch, bool jump) { // convert the world relative moveInput vector into a local-relative // turn amount and forward amount required to head in the desired // direction. if (move.magnitude > 1f) move.Normalize(); move = transform.InverseTransformDirection(move); CheckGroundStatus(); move = Vector3.ProjectOnPlane(move, m_GroundNormal); m_TurnAmount = Mathf.Atan2(move.x, move.z); m_ForwardAmount = move.z; ApplyExtraTurnRotation(); // control and velocity handling is different when grounded and airborne: if (m_IsGrounded) { HandleGroundedMovement(crouch, jump); } else { HandleAirborneMovement(); } ScaleCapsuleForCrouching(crouch); PreventStandingInLowHeadroom(); // send input and other state parameters to the animator UpdateAnimator(move); } void ScaleCapsuleForCrouching(bool crouch) { if (m_IsGrounded && crouch) { if (m_Crouching) return; m_Capsule.height = m_Capsule.height / 2f; m_Capsule.center = m_Capsule.center / 2f; m_Crouching = true; } else { Ray crouchRay = new Ray(m_Rigidbody.position + Vector3.up * m_Capsule.radius * k_Half, Vector3.up); float crouchRayLength = m_CapsuleHeight - m_Capsule.radius * k_Half; if (Physics.SphereCast(crouchRay, m_Capsule.radius * k_Half, crouchRayLength)) { m_Crouching = true; return; } m_Capsule.height = m_CapsuleHeight; m_Capsule.center = m_CapsuleCenter; m_Crouching = false; } } void PreventStandingInLowHeadroom() { // prevent standing up in crouch-only zones if (!m_Crouching) { Ray crouchRay = new Ray(m_Rigidbody.position + Vector3.up * m_Capsule.radius * k_Half, Vector3.up); float crouchRayLength = m_CapsuleHeight - m_Capsule.radius * k_Half; if (Physics.SphereCast(crouchRay, m_Capsule.radius * k_Half, crouchRayLength)) { m_Crouching = true; } } } void UpdateAnimator(Vector3 move) { // update the animator parameters m_Animator.SetFloat("Forward", m_ForwardAmount, 0.1f, Time.deltaTime); m_Animator.SetFloat("Turn", m_TurnAmount, 0.1f, Time.deltaTime); m_Animator.SetBool("Crouch", m_Crouching); m_Animator.SetBool("OnGround", m_IsGrounded); if (!m_IsGrounded) { m_Animator.SetFloat("Jump", m_Rigidbody.velocity.y); } // calculate which leg is behind, so as to leave that leg trailing in the jump animation // (This code is reliant on the specific run cycle offset in our animations, // and assumes one leg passes the other at the normalized clip times of 0.0 and 0.5) float runCycle = Mathf.Repeat( m_Animator.GetCurrentAnimatorStateInfo(0).normalizedTime + m_RunCycleLegOffset, 1); float jumpLeg = (runCycle < k_Half ? 1 : -1) * m_ForwardAmount; if (m_IsGrounded) { m_Animator.SetFloat("JumpLeg", jumpLeg); } // the anim speed multiplier allows the overall speed of walking/running to be tweaked in the inspector, // which affects the movement speed because of the root motion. if (m_IsGrounded && move.magnitude > 0) { m_Animator.speed = m_AnimSpeedMultiplier; } else { // don't use that while airborne m_Animator.speed = 1; } } void HandleAirborneMovement() { // apply extra gravity from multiplier: Vector3 extraGravityForce = (Physics.gravity * m_GravityMultiplier) - Physics.gravity; m_Rigidbody.AddForce(extraGravityForce); m_GroundCheckDistance = m_Rigidbody.velocity.y < 0 ? m_OrigGroundCheckDistance : 0.01f; } void HandleGroundedMovement(bool crouch, bool jump) { // check whether conditions are right to allow a jump: if (jump && !crouch && m_Animator.GetCurrentAnimatorStateInfo(0).IsName("Grounded")) { // jump! m_Rigidbody.velocity = new Vector3(m_Rigidbody.velocity.x, m_JumpPower, m_Rigidbody.velocity.z); m_IsGrounded = false; m_Animator.applyRootMotion = false; m_GroundCheckDistance = 0.1f; } } void ApplyExtraTurnRotation() { // help the character turn faster (this is in addition to root rotation in the animation) float turnSpeed = Mathf.Lerp(m_StationaryTurnSpeed, m_MovingTurnSpeed, m_ForwardAmount); transform.Rotate(0, m_TurnAmount * turnSpeed * Time.deltaTime, 0); } public void OnAnimatorMove() { // we implement this function to override the default root motion. // this allows us to modify the positional speed before it's applied. if (m_IsGrounded && Time.deltaTime > 0) { Vector3 v = (m_Animator.deltaPosition * m_MoveSpeedMultiplier) / Time.deltaTime; // we preserve the existing y part of the current velocity. v.y = m_Rigidbody.velocity.y; m_Rigidbody.velocity = v; } } void CheckGroundStatus() { RaycastHit hitInfo; #if UNITY_EDITOR // helper to visualise the ground check ray in the scene view Debug.DrawLine(transform.position + (Vector3.up * 0.1f), transform.position + (Vector3.up * 0.1f) + (Vector3.down * m_GroundCheckDistance)); #endif // 0.1f is a small offset to start the ray from inside the character // it is also good to note that the transform position in the sample assets is at the base of the character if (Physics.Raycast(transform.position + (Vector3.up * 0.1f), Vector3.down, out hitInfo, m_GroundCheckDistance)) { m_GroundNormal = hitInfo.normal; m_IsGrounded = true; m_Animator.applyRootMotion = true; } else { m_IsGrounded = false; m_GroundNormal = Vector3.up; m_Animator.applyRootMotion = false; } } } }
  20. Hey vielen dank für die ausführliche Antwort. Du hast recht das ich eine Deep copy brauche.Das beispiel mit dem restaurant ist nicht genau das was ich machen möchte.Es sollte nur darstellen was ich ungefähr vor habe. Du hast auch recht das es Sinn machen würde, den größten Teil read only zu machen ,denn nur amount ist ein wert der sich verändert. Ich habe aber immer noch nicht so ganz verstanden wie ich FoodList in DeliveryList erstelle.Das mit dem Copy erstellen oder per Hand die Liste füllen erzeugt immer Fehler das das Object nicht da ist zum Beispiel. Um nochmal genauer zu erklären was ich machen möchte.Ich habe einmal diese FoodList wo ich die Mengen der Gerichte verändere. Diese Liste möchte ich dann in DeliveryList schreiben und zusätzlich angeben an welchem Tag die Delivery kommt. Wenn dieser Tag dann erreicht ist wird die DeliveryList in eine neue Liste "FridgeList" addiert. Im Prinzip so wie wenn man etwas Online bestellt ,wartet bis es da ist und es dann in den Kühlschrank legt. Ih habe das jetzt mal probiert, an der Stelle wo ich vorher die clonedList erstellt habe: for (int i = 0; i < FoodDrinkList.FoodList.Count; i++) { newDelivery.FoodList.FoodList.Add(FoodDrinkList.FoodList); } Ich bekomme dann aber diesen Fehler: NullReferenceException: Object reference not set to an instance of an object BuyFoodScript.BuyButton () (at Assets/Scripts/BuyFoodScript.cs:151) Es bezieht sich auf die Zeile in dem for loop Ich habe jetzt auch das hier nochmal ausprobiert aber das klappt auch nicht. Delivery newDelivery = new Delivery(); FoodDrinkList.Fooddetails newFood = new FoodDrinkList.Fooddetails(); for (int i = 0; i < FoodDrinkLists.FoodList.Count; i++) { newFood.foodname = FoodDrinkLists.FoodList.foodname; newFood.price = FoodDrinkLists.FoodList.price; newFood.id = FoodDrinkLists.FoodList.id; newFood.happiness = FoodDrinkLists.FoodList.happiness; newFood.hungry = FoodDrinkLists.FoodList.hungry; newFood.picture = FoodDrinkLists.FoodList.picture; newFood.slots = FoodDrinkLists.FoodList.slots; newFood.unlocked = FoodDrinkLists.FoodList.unlocked; newFood.energy = FoodDrinkLists.FoodList.energy; newFood.amount = FoodDrinkLists.FoodList.amount; newDelivery.FoodList.FoodList.Add(newFood); } Es kommt der gleiche Fehler.Ich denke das Problem ist das ich verschiedene Variablen gleichzeitig adden möchte. Weiß jemand wie man eine Klasse mit unterschiedlichen Werten zu einer Liste hinzufügt??
  21. Ich würde gerne ein Spiel entwickeln, angelehnt an das Original Handyspiel "Tank Hero". Mit Hilfe des Internets habe ich bereits den Spieler dazu gebracht sich immer zur Maus zu drehen, zudem "kugeln" beim objekt selbst mit der drehung des Parents zu erstellen. Seit 2 Stunden jedoch, schaffe ich es nicht den Kugeln eine vorwärts Bewegung zu geben. Egal ob mit AddForce, transform.position, etc. Kann mir vllt. jemand helfen? Anbei sende ich den Code und ein kurzes Video (sry für die schlechte Qualität).2020-03-26 17-54-52.mkv
  22. Es gibt keine Möglichkeit, das zu machen, aber du brauchst auch keine. Dein Spiel wird immer wieder neu gezeichnet, und jedes Mal dazwischen findet ein "Update" statt. Wenn du innerhalb eines Updates ein Objekt spawnst und dann noch ein Objekt spawnst, dann sind beide Objekte im Frame davor noch nicht da und im Frame danach da. Der Spieler sieht nicht, was zwischen zwei Frames an Schritten passiert, der Spieler sieht nur das Endergebnis.
  23. List<FoodDrinkList> clonedList = new List<FoodDrinkList>(foodDrinkList); Das ist schon, wie man eine neue Liste erstellt, die dieselben Elemente beinhaltet. Ist aber eine "Flat Copy", das heißt: Wenn deine Elemente Referenzen sind, dann werden halt die Referenzne kopiert, nicht aber die Objekte, die da referenziert werden. Es klingt, als wolltest du eine "Deep Copy", bei der die referenzierten Objekte auch kopiert werden? Du könntest sonst überlegen, ein Struct statt einer Klasse zu verwenden, die haben keine Referenzsemantik. Wenn du eine Liste von Structs hast, dann sind die Elemente entsprechend keine Referenzen, sondern Objekte selbst. Um Verwirrung und Problemen vorzubeugen, solltest du außerdem überlegen, deine Datenhalter in feste Informationen über Gerichte und Bestellungen aufzuteilen. Wenn ich mich nicht irre, ist die Eigenschaft "amount" in "Fooddetails" dazu da, um die Menge eines Gerichts in einer Liste darzustellen. Damit steht diese Eigenschaft im Kontrast zu den anderen Feldern, die fixe Informationen über das Gericht beinhalten. Mal als Beispiel, wie das anders aussehen könnte: [System.Serializable] public class FoodDetails { public string name; public Sprite picture; piblic int happiness; } Wenn du Propertys benutzt, kannst du diese Informationen auch readonly machen, sodass da kein™ Code geschrieben werden kann, der da in den Werten rumfummelt. Falls du das probieren willst, sag bescheid, aber ich lasse das der Einfachheit halber gerade Mal weg. Dann baust du noch ein Struct für einen Bestellpunkt: [System.Serializable] public struct OrderItem { public FoodDetails food; public int amount; } Und dann machst du davon eine Liste. Da du dann eine Liste von Struct-Objekten hast, kannst du OrderItems beliebig umherschieben und kopieren. Das "FoodDetails"-Objekt, das da referenziert wird, wird nicht mitkopiert, da "FoodDetails" eine Klasse ist. Ist ja aber in Ordnung, weil in diesen Objekten nichts mehr drinsteht, das wir ändern würden. Die Daten in diesen Objekten sind also statisch, ändern sich nicht und gelten für alle gleich. Diese Daten also mehrfach zu haben wäre Platzverschwendung.
  24. Hallo Leute, ich habe kleines Problem woran ich gerade verzweifel und hatte gehofft Ihr könnt mir vielleicht helfen. Stellt euch vor ihr geht in ein Restaurant und bekommt die Karte . Auf dieser Karte kreuzt ihr dann an was ihr haben möchtet und gebt die Karte dann zurück an den Kellner als Bestellung.Sowas würde ich gerne umsetzen Dafür habe ich eine Liste mit attributen für jedes gericht : public class FoodDrinkList : MonoBehaviour { [System.Serializable] public class Fooddetails { public string foodname; public Sprite picture; public int id; public int price; public int happiness; public int energy; public int hungry; public int amount; public int slots; public int unlocked; } public List<Fooddetails> FoodList; } Diese liste "FoodList" verändere ich dann in dem ich sage wie viel ich von jedem Gericht haben möchte und dann möchte ich per Button klick diese FoodList in eine andere Foodlist schreiben public FoodDrinkList foodDrinkList; [System.Serializable] public class Delivery { public FoodDrinkList FoodList; public int deliveryday; public int deliveryhour; public int readytopickup; } public void BuyButton() { Delivery newDelivery = new Delivery(); List<FoodDrinkList> clonedList = new List<FoodDrinkList>(foodDrinkList); //Hier habe ich versucht die Liste zu klonen.Ich habe aber garkeine Idee wie ich die liste kopieren kann newDelivery.FoodList.FoodList.Add(clonedList); newDelivery.deliveryhour = DataTimescript.hourtimer + 3; DeliveryList.Add(newDelivery); } Es funktioniert alles bis auf den Teil mit dem kopieren der Foodlist in die neue Delivery.Foodlist.Foodlist Hat da jemandeine Idee?
  25. Ich möchte mehere Objekte gleichzeitig Spawnen. Ich habe es schon mit Instantiate probiert aber da ist es immer nach einander. Es soll aber gleichzeitig geschehen. Hat jemand eine Idee wie das geht? Danke im voraus.
  26. Hab's gerade mal ausprobiert... mir war nicht bewusst, dass der Lautstärke-Parameter von PlayOneShot relativ zur Lautstärke der AusioSource gemeint ist... alles klar!
  27. @YungCaedo Hey! Ich habe nun mal eben schnell ein ähnliches Szenario nachgebaut... der Spieler trifft auf einen Gegner und der Gegner fügt dem Spieler bei jeder Collision 10 Schaden zu... dann wird geprüft ob das Leben des Spielers 0 oder weniger beträgt. Falls dies der Fall sein sollte, spawnt der Spieler an einer bestimmen Position und ich resette das Leben. Wie du unten im Video sehen kannst funktioniert das einwandfrei. Ich weiß nicht, was in deiner Coroutine passiert.... aber irgendwo musst du einen Fehler gemacht haben. Wenn du mir den Rest vom Code zeigst, kann ich dir helfen. 2020-03-25 18-02-25.mp4
  28. Ja, aber .Play() und .PlayOneShot() zusammen machen Probleme. Außerdem kannst du die Sounds nicht unterschiedlich modifizieren (z.B. in der Lautstärke) weil es eben nur eine Quelle ist. Deswegen einfach 2 Komponenten rein und gut ist's. Übrigens: Das gute alte PlayClipAtPoint gibt es ja auch noch. Da wird zwar jedes Mal ein SoundObjekt instanziert, aber das ginge super in seinem Spiel. Aber auch das habe ich ihm auch nicht angepriesen.
  1. Load more activity

Announcements

Hy, wir programmieren für dich Apps(Android & iOS):

Weiterleitung zum Entwickler "daubit"



×
×
  • Create New...