Jump to content
Unity Insider Forum

Kojote

Members
  • Content Count

    1,184
  • Joined

  • Last visited

  • Days Won

    5

Kojote last won the day on June 29 2018

Kojote had the most liked content!

Community Reputation

38 Excellent

About Kojote

  • Rank
    Advanced Member

Recent Profile Visitors

1,682 profile views
  1. OK, das verkleinern beim speichern und anzeigen haut nun hin, war nur nen kleiner Fehler. Das mit dem Resize schau ich mir dann mal an, danke!
  2. Naja, ein gespeichertes Bild ist knapp über 1 MB groß. Sollte keine Probleme machen. Was jedoch jetzt immer noch nicht geht, ist das Laden der Bilddateien: Problem war hier, dass wenn ich das Bild hiermit einlade: private void LoadPictures() { for (int i = 0; i < savegamePictureSpriteArray.Length; i++) { file = path + "/SavePicture_" + i + ".jpg"; if (File.Exists(file)) { byte[] bytes = File.ReadAllBytes(file); texture2D = new Texture2D(savegamePictureTargetWidth, savegamePictureTargetHeight, TextureFormat.RGB24, false); texture2D.filterMode = FilterMode.Trilinear; texture2D.LoadImage(bytes); savegamePictureSpriteArray[i] = Sprite.Create(texture2D, new Rect(0, 0, savegamePictureTargetWidth, savegamePictureTargetHeight), Vector2.zero); savegamePictureImage.sprite = savegamePictureSpriteArray[i]; } else { savegamePictureImage.sprite = savegamePictureEmpty; } } } Ich zwar sage, dass das Image nur in einer größe von 1000 x 563 angezeigt werden soll, er aber nicht skaliert, sondern das dabei heraus kommt: Er schneidet sich ein Stückchen aus dem Bild raus zur Anzeige. Deswegen die Skalierung.
  3. Hat in Unity 2017 sehr gut funktioniert. In Unity 2018 macht er dies nicht mehr. Das kommt nach dem Skalieren heraus, vor dem Skalieren ist das Bild normal: Was macht er denn hier plötzlich? 🤨 Irgendwie gibts ein paar Änderungen bei 2017 zu 2018. Mit JSON hatte ich plötzlich Probleme und mit dem Skalieren nun auch, obwohl ich an beiden Scripten nichts geändert habe. Weiteres Problem ist, ich habe die Coroutine etwas umgebaut, dass das UI nicht mit gerendert wird: IEnumerator RecordSavegamePicture() { yield return new WaitForEndOfFrame(); canvasGroupOverAll.alpha = 0; texture2D = ScreenCapture.CaptureScreenshotAsTexture(); Debug.Log("Screen wird erstellt. Alpha ist: " + canvasGroupOverAll.alpha); canvasGroupOverAll.alpha = 1; yield return new WaitForEndOfFrame(); EditPicture(); } Habe dem Canvas eine CanvasGroup verpasst und setze den Alpha vor dem Screen auf 0. Danach wieder auf 1. Aber er erstellt den Screen immer mit UI, obwohl laut Debug der Alpha 0 ist.
  4. Fehler wurde beseitigt. Anscheinend ist das ein Bug in der Unity 2017er Version. In 2018 werden die eingestellten werte aus dem Inspector auch bei Dropdowns angewendet, die über ein Script initialisiert bzw. erstellt wurden.
  5. OK, für die, die mal am selben Problem stehen, ist der Link interessant: https://stackoverflow.com/questions/42904122/unity-deserialize-into-scriptable-object Erste Antwort: https://docs.unity3d.com/Manual/JSONSerialization.html So for you that'd be JsonUtility.FromJsonOverwrite(text, list); Note that this is not an immutable method and will overwrite your object, but it seems like that was your intention anyway. Also kurz un knapp, statt die Methode: JsonUtility.FromJson Diese Methode nutzen: JsonUtility.FromJsonOverwrite
  6. Ist die Frage noch aktuell? Also ich hab mal so was ähnliches gemacht. Bei mir hatte ich es so gelöst, das unten UI Elemente sind. Klickt man das Objekt an, verschwindet das UI und man bekommt das 3D Modell "angehangen" an den Mauscursor und wird dann da hin gesetzt wo man mit der Maus klickt. Dafür hatte ich RayCasting genutzt.
  7. So, nach dem es jetzt eine ganze weile funktionierte, funktionierts jetzt wieder net und bekomm nen Error: Genau betrifft das Diese Zeile: D_SP_Save_Data_Object_Manager.BasicDataInstance = JsonUtility.FromJson<LD_SP_Save_Data_Object_Manager>(json); Die Zeile kommt aus der Methode `SaveGameReadBasicData`, habe ich weiter unten eingefügt. Habt ihr ne Idee was er hat? EDIT: Schon hier hat er seine Probleme: Debug.Log(JsonUtility.FromJson<LD_SP_Save_Data_Object_Manager>(json).characterList.Count); Hier mal die JSON, sieht alles normal aus: {"characterList":[{"playerName":"8678","playTime":"24.10.2019 10:47:01","playerVitaility":99.3298568725586,"playerGender":1,"playerBodyShape":[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0],"playerBodyColor":[0.0,0.0,1.0],"playerEyeColor":[0.0,0.0,0.0],"playerNoseColor":[0.0,0.0,0.0],"playerBodyMaterial":0,"playerPos":{"x":0.0,"y":0.0,"z":0.0},"playerRotation":{"x":0.0,"y":0.0,"z":0.0,"w":0.0},"sceneID":2}],"childList":[],"buddyList":[]} ------------------------------------- Hier mal zur Erklärung: Ich speichere jeden Spielstand in einer seperaten JSON Datei, dies mache ich damit: public void SaveSavegame() { string time = System.DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss"); file = path + "/Savegame_" + selectedSavegame + ".json"; // Aktualisierung aller Daten der Chraktere und Enemys LD_SP_Save_Data_Object_Manager.Instance.CharacterListUpdate(); LD_SP_Save_Data_Object_Manager.Instance.ChildListUpdate(); LD_SP_Save_Data_Object_Manager.Instance.BuddyListUpdate(); LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playTime = time; LD_SP_Save_Data_Object_Manager.Instance.characterList[0].sceneID = SceneManager.GetActiveScene().buildIndex; // Savegame Structure aktualisieren savegameStructur[selectedSavegame -1].savegamePlayerName = LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerName; savegameStructur[selectedSavegame -1].savegamePlayTime = time; savegameStructur[selectedSavegame -1].savegameExists = true; savegameStructur[selectedSavegame -1].savegameSceneNr = SceneManager.GetActiveScene().buildIndex; // Display aktualisieren charcternameDisplay.text = LD_SP_Save_Data_Object_Manager.Instance.characterList[0].playerName; characterSavedOnDisplay.text = time; deleteButton.GetComponent<Button>().interactable = true; deleteButton.GetComponent<Image>().raycastTarget = true; StartCoroutine("RecordSavegamePicture"); savegamePictureImage.sprite = savegamePictureSpriteArray[selectedSavegame]; //Savegame schreiben string json = JsonUtility.ToJson(LD_SP_Save_Data_Object_Manager.Instance); if (!File.Exists(file)) { File.Create(file).Dispose(); } File.WriteAllText(file, json); } Klappt soweit und er speichert auch keinen Müll. Damit ich nicht ständig die Daten aus einer Datei lesen muss, habe ich auch noch eine Struktur, wo alle Werte der 10 Spielstände hinterlegt sind: [System.Serializable] public class SavegameStructur { public string savegamePlayerName = ""; public string savegamePlayTime = ""; public bool savegameExists = false; public int savegameSceneNr = 0; } Das Speichern klappt, sowohl in der Struktur, als auch in der Datei. Starte ich nun das Spiel, lade ich mir schon einmal aus allen Speicherständen, sämtliche Werte in die Struktur und den Objektmanager des Spiels. In ihm befinden sich alle relevanten Daten, die im derzeitigen Spiel gebraucht werden. private void SaveGameReadBasicData() { for (int i = 0; i < savegameStructur.Length; i++) { string file = path + "/Savegame_" + (i + 1) + ".json"; if (File.Exists(file)) { string json = File.ReadAllText(file); LD_SP_Save_Data_Object_Manager.BasicDataInstance.characterList = new List<LD_SP_Save_Data_Player>(JsonUtility.FromJson<LD_SP_Save_Data_Object_Manager>(json).characterList.Count); LD_SP_Save_Data_Object_Manager.BasicDataInstance.childList = new List<LD_SP_Save_Data_Child>(JsonUtility.FromJson<LD_SP_Save_Data_Object_Manager>(json).childList.Count); LD_SP_Save_Data_Object_Manager.BasicDataInstance.buddyList = new List<LD_SP_Save_Data_Buddy>(JsonUtility.FromJson<LD_SP_Save_Data_Object_Manager>(json).buddyList.Count); LD_SP_Save_Data_Object_Manager.BasicDataInstance = JsonUtility.FromJson<LD_SP_Save_Data_Object_Manager>(json); savegameStructur[i].savegamePlayerName = LD_SP_Save_Data_Object_Manager.BasicDataInstance.characterList[0].playerName; savegameStructur[i].savegamePlayTime = LD_SP_Save_Data_Object_Manager.BasicDataInstance.characterList[0].playTime; savegameStructur[i].savegameExists = true; savegameStructur[i].savegameSceneNr = LD_SP_Save_Data_Object_Manager.BasicDataInstance.characterList[0].sceneID; } else { savegameStructur[i].savegamePlayerName = ""; savegameStructur[i].savegamePlayTime = ""; savegameStructur[i].savegameExists = false; savegameStructur[i].savegameSceneNr = 0; } } } Das wäre der Manager des aktuekken Spiels: using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using System; namespace Lions_Dream_SP { [System.Serializable] public class LD_SP_Save_Data_Object_Manager : MonoBehaviour { public List<LD_SP_Save_Data_Player> characterList; public List<LD_SP_Save_Data_Child> childList; public List<LD_SP_Save_Data_Buddy> buddyList; public static LD_SP_Save_Data_Object_Manager instance; public static LD_SP_Save_Data_Object_Manager basicDataInstance; public static LD_SP_Save_Data_Object_Manager Instance { set { instance = Instance; } get { return instance; } } public static LD_SP_Save_Data_Object_Manager BasicDataInstance { set { basicDataInstance = BasicDataInstance; } get { return basicDataInstance; } } private void Awake() { if (instance != null) { return; } instance = this; basicDataInstance = this; DontDestroyOnLoad(this.gameObject); } /******************************** Aufruf zur Aktualisierung aller Chraktere und Enemys ********************************/ public void CharacterListUpdate() { // Aktuelle Characterlist leeren characterList.Clear(); // Objekte finden GameObject[] searchObjects = GameObject.FindGameObjectsWithTag("Player"); // Objekte in Liste aufnehmen for (int i = 0; i < searchObjects.Length; i++) { LD_SP_Player_Controler playerController = searchObjects[i].GetComponent<LD_SP_Player_Controler>(); characterList.Add(new LD_SP_Save_Data_Player( playerController.playerName, playerController.playTime, playerController.animal.life, playerController.gender, playerController.bodyShape, playerController.bodyColor, playerController.eyeColor, playerController.noseColor, playerController.bodyMaterial, playerController.pos, playerController.rotation, playerController.sceneID )); } } public void ChildListUpdate() { // Aktuelle Childlist leeren childList.Clear(); // Objekte finden GameObject[] searchObjects = GameObject.FindGameObjectsWithTag("Child"); // Objekte in Liste aufnehmen for (int i = 0; i < searchObjects.Length; i++) { LD_SP_Child_Controler childController = searchObjects[i].GetComponent<LD_SP_Child_Controler>(); childList.Add(new LD_SP_Save_Data_Child( childController.childID, childController.childName, childController.animal.life, childController.gender, childController.bodyShape, childController.bodyColor, childController.eyeColor, childController.noseColor, childController.bodyMaterial, childController.pos, childController.rotation )); } } public void BuddyListUpdate() { // Aktualle Buddylist leeren buddyList.Clear(); // Objekte finden GameObject[] searchObjects = GameObject.FindGameObjectsWithTag("Buddy"); // Objekte in Liste aufnehmen for (int i = 0; i < searchObjects.Length; i++) { LD_SP_Buddy_Controler buddyController = searchObjects[i].GetComponent<LD_SP_Buddy_Controler>(); buddyList.Add(new LD_SP_Save_Data_Buddy( buddyController.animalTyp, buddyController.buddyID, buddyController.buddyName, buddyController.animal.life, buddyController.pos, buddyController.rotation )); } } } [System.Serializable] public class LD_SP_Save_Data_Player { // Keinesfalls von Monobehavior erben lassen, dies zerstoert die JSON-Datei! public string playerName; public string playTime; public float playerVitaility; public int playerGender; public float[] playerBodyShape; public float[] playerBodyColor; public float[] playerEyeColor; public float[] playerNoseColor; public int playerBodyMaterial; public Vector3 playerPos; public Quaternion playerRotation; public int sceneID; public LD_SP_Save_Data_Player(string name, string time, float vit, int gender, float[] bodyShape, float[] bodyColor, float[] eyeColor, float[] noseColor, int bodyMaterial, Vector3 pos, Quaternion rot, int sceneID) { playerName = name; playTime = time; playerVitaility = vit; playerGender = gender; // 0 = Female | 1 = Male playerBodyShape = new float[bodyShape.Length]; playerBodyColor = new float[bodyColor.Length]; playerEyeColor = new float[eyeColor.Length]; playerNoseColor = new float[noseColor.Length]; Array.Copy(bodyShape, playerBodyShape, bodyShape.Length); Array.Copy(bodyColor, playerBodyColor, bodyColor.Length); Array.Copy(eyeColor, playerEyeColor, eyeColor.Length); Array.Copy(noseColor, playerNoseColor, noseColor.Length); playerBodyMaterial = bodyMaterial; playerPos = pos; playerRotation = rot; this.sceneID = sceneID; } } [System.Serializable] public class LD_SP_Save_Data_Child { // Keinesfalls von Monobehavior erben lassen, dies zerstoert die JSON-Datei! public int childID; public string childName; public float childVitaility; public int childGender; // 0 = Female | 1 = Male public float[] childBodyShape; public float[] childBodyColor; public float[] childEyeColor; public float[] childNoseColor; public int childBodyMaterial; public Vector3 childPos; public Quaternion childRotation; public LD_SP_Save_Data_Child(int id, string name, float vit, int gender, float[] bodyShape, float[] bodyColor, float[] eyeColor, float[] noseColor, int bodyMaterial, Vector3 pos, Quaternion rot) { childID = id; childName = name; childVitaility = vit; childGender = gender; childBodyShape = new float[bodyShape.Length]; childBodyColor = new float[bodyColor.Length]; childEyeColor = new float[eyeColor.Length]; childNoseColor = new float[noseColor.Length]; Array.Copy(bodyShape, childBodyShape, bodyShape.Length); Array.Copy(bodyColor, childBodyColor, bodyColor.Length); Array.Copy(eyeColor, childEyeColor, eyeColor.Length); Array.Copy(noseColor, childNoseColor, noseColor.Length); childBodyMaterial = bodyMaterial; childPos = pos; childRotation = rot; } } [System.Serializable] public class LD_SP_Save_Data_Buddy { // Keinesfalls von Monobehavior erben lassen, dies zerstoert die JSON-Datei! public animalTyp animalTyp; public int buddyID; public string buddyName; public float buddyVitaility; public Vector3 buddyPos; public Quaternion buddyRotation; public LD_SP_Save_Data_Buddy(animalTyp type, int id, string name, float vit, Vector3 pos, Quaternion rot) { animalTyp = type; buddyID = id; buddyName = name; buddyVitaility = vit; buddyPos = pos; buddyRotation = rot; } } public enum animalTyp : short { Lion = 1, Tiger = 2, Deer = 3, Pig = 4 } }
  8. Du wirst es mir nicht glauben, habs aber getestet. Hab den Fehler auch gefunden. Im Textfeld ist nichts, aber aus irgend einem Grund, wird hier ein Leerzeichen reingemogelt, auf das reagiert das Script dann. Also schon ganz richtig die if-Abfrage. IsNullOrEmpty, wenn ein Leerzeichen drin ist, was irgendwo her kommt, ist die if nun mal false, also startet er schon richtig. Woher das Leerzeichen kommt, versteh ich allerdings nicht. Im Textfeld ist zumindest kein Leerzeichen.
  9. Weil man ma was neues probieren muss, um sich weiter zu entwickeln und ansonsten nur auf der Stelle herum trampelt? Die Definition hab ich schon gelesen und so kompliziert nun nicht zu verstehen: Löst aber nicht die Frage, warum das if-Statement nicht funktioniert.
  10. Grüße! Mal ne Verständnissfrage zu IsNullOrEmpty. Ich habe eine Methode zum starten des Spiels, wenn der Spieler das Spiel starten will, soll abgefragt werden, ob ein Spielername eingetragen wurde. Wenn nicht, soll der Spielstart verhindert werden: public void EnterWorld() { if (string.IsNullOrEmpty(TMPPlayerNameText.text)) { LD_SP_Menue_Notification_Main_Menue.Instance.CallNotification(); return; } // Lade das Spiel } So, nutze ich es so, wie ich es denke, ist es ihm egal, ob ein Name drin steht oder nicht, er starte das Spiel. Füge ich vor IsNullOrEmpty den Negativoperatpr hinzu, bricht er den Start ab, aber ich kann auch einen Namen eintragen, dann startet das Spiel auch nicht und meint immer noch, dass kein Name drin wäre. Habt ihr ne Idee, woran es liegt? Grüße von Kojote
  11. Kojote

    Fight!

    Jop, mach ich jetzt auch, ich hab das ganze abfragen nun mit der linken Maustaste verbunden. Wenn die linke Maustaste gedrückt wird, wird die Colliderabfrage erst aktiv. Damit funktionierts ganz gut. Einzig die Collider muss ich noch in der Größe anpassen, nicht jeder Treffer ist auch ein Treffer, obwohl es so aussieht.
  12. Ich habs jetzt ganz anders gemacht, im Endeffekt war ich mal wieder einen Gedanken zu weit. Ich hab die Direktion nicht berechnet gehabt, sondern gleich den Vector3 als Ziel eingegeben. Im Endeffekt war es aber auch nicht genau das was ich wollte. Ziel sollte es sein, dass man eine Taste drückt und das Objekt auf das man schaut, dass nächste Angriffsziel wird und dann im UI mit Lebenspunkten und Co angezeigt wird. Ist aber leider auf die Entfernung zu ungenau. Ich habs nun so gemacht, dass das Ziel als UI dann selektiert wird, wenn man den ersten Angriff auf das Objekt startet.
  13. Grüße! Ich bin gerade dabei das Target-System zu machen. Mein erste Idee war ein Box-Raycast vom Spieler zu machen, was ich aber recht schnell verworfen habe, da dieser ja immer in Blockrichtung des Charakters geht. Da die Kamera aber über dem Charakter schwebt, ist das relativ ungünstig. So bin ich auf die Idee gekommen, ein Ziel über die Kamera zu finden, über deren MIttelpunkt. Problem ist, wie schieß ich einen Strahl in entspechender Größe ab? Der Mittelpunkt der Kamera und der schmale Ray machen es recht schwer in der Entfernung genau ein Ziel zu treffen. Gibts da auch eine Art Box-Raycasting für die Camera? Achja das ganze müsste ohne Maus-Input erfolgen, ich will da nur eine Taste drücken, um das Ziel zu selektieren. EDIT: Hab nun Box-RayCasting auf die Kamera angewendet: hitDetect = Physics.BoxCast(Camera.main.transform.gameObject.transform.position, transform.localScale, transform.forward, out hit, Camera.main.transform.gameObject.transform.rotation, maxHitDistanze, layerMask); Problem ist nun, transform.forward, der Stahl geht immer nach vorn, nie in Blickrichtung, wie kann man das denn festlegen? Zum anderen er schießt zwei strähle nah bei einander ab aber keine Box. Grüße Kojote
  14. Kojote

    Fight!

    Also ich habs nun mit der Trigger-Methode probiert, funktioniert. Problem ist, wenn OnTriggerEnter einmal eingetreten ist, kann ich auf den Gegener einprügeln so lange ich will, logischerweise passiert nichts mehr bis ich das nächte mal den Collider Trigger.
×
×
  • Create New...