Jump to content
Unity Insider Forum

malzbie

Moderators
  • Content Count

    5,125
  • Joined

  • Last visited

  • Days Won

    359

malzbie last won the day on July 3

malzbie had the most liked content!

Community Reputation

1,570 Excellent

2 Followers

About malzbie

  • Rank
    Moderator
  • Birthday 10/30/1968

Profile Information

  • Gender
    Male
  • Location
    Kassel, Hessen, Deutschland

Recent Profile Visitors

22,378 profile views
  1. Zu 1: Mit der Orthografischen Kamera Größe legst du fest, wie groß deine Sprites in der Kamera zu sehen sind. Also wieviel du vom Spielfeld sehen wirst. Spiel einfach mal mit rum. du wirst es erkennen. Zu 2: Weiß ich nicht was du willst. Zu 3: Die Einstellung besagt, wieviele Pixel in eine Einheit rein passen. Hast du also eine Spritefläche, die 1x1 groß ist, und du hast 64px per unit eingestellt, dann passen da 64 px in der Breite wie auch in der Höhe rein. Stellst du 128px per Unit ein, dann passen da 128 Pixel in eine Einheit rein. Du kannst für jedes Sprite einen anderen Wert einstellen, wenn du es willst. Aber dann hast du natürlich nicht alle Objekte mit der gleichen Auflösung. Du hättest Sprites mit groben Auflösungen und welche mit feineren Auflösungen. Die Grafik des Sprites, muss ja nicht wirklich 64 px breit sein und wird sie auch nicht, es sei denn es ist ne Box, die genau 64x64 groß ist. Genauso, kann ein Sprite auch größer als 64px sein. Aber trotzdem weiß Unity wieviele px pro Einheit rein passen, und somit wird ein schmaleres Sprite auch weiterhin schlamer dargestellt und ein Breiteres auch wirklich breiter. Immer im Bezug auf die wirkliche Anzahl der Sprites zu dem Wert Pixel pro Einheit. Soll dein Spiel konsistent sein, dann nutz für alle Sprites die gleichen Werte.
  2. Wenn du mit Sprites arbeitest solltest du immer Order In Layer vom Spriterenderer mit Zahlen bestücken. Je größer die Zahl, umso weiter vorne ist das Sprite. Egal, ob es näher an der Kamera ist oder nicht. (Oder in deinem Fall genau gleich weit weg) https://docs.unity3d.com/Manual/class-SpriteRenderer.html
  3. Also es ist so: Der Code ansich wird Zeile für Zeile abgearbeitet. Eingabesignale und Ausgaben, z.B. auf den Bildschirm, passieren Frameweise. Welcher Code wann abgearbeitet wird, hängt davon ab, welche Funktion du nutzt. In der Update Funktion wird einmal pro Frame alles von oben nach unten abgearbeitet. In der FixedUpdate wird einmal pro FixerdTime Intervall der gesammte Code abgearbeitet. Genauso ist das in OnTrigger oder OnCollision Funktionen. In jedem Script in deiner Szene können unterschiedliche Funktionen drin stehen. Die Funktionen werden alle nach gewissen Intervallen abgearbeitet. Wenn also der Update Zyklus dran ist, werden alle Update Funktionen in allen aktiven Scripts abgearbeitet. Das passiert aber nicht gleichzeitig sondern ein Script nach dem anderen. Welches Script damit anfängt, wird beim Spielstart zufällig festgelegt. Da kann man aber eingreifen und eine Abarbeitungsreihenfolge einstellen. Wärend eines Frames werden die Scripte also von oben nach unten abgearbeitet. EIn Inputsignal, steht wärend des kompletten Frames an, denn es wird auch nur einmal pro Frame ausgewertet. Somit sollten dein 3 Debugzeilen alle geschrieben werden. Aber der Output wird erst am Ende des Frames gemacht. Also quasi gleichzeitig. Solltest du beim Drücken der Taste H z.B. etwas berechnen wollen, und du hättest da auch 3 Zeilen, die untereinander stehen, dann würden alle 3 Zeilen genauso von oben nach unten abgearbeitet werden. Es geht also immer von oben nach unten. Willst du da dynamisch mal so mal so abarbeiten lassen, musst du dir Bedingungen schaffen. Dann würdest du gewisse Sachen nur dann ausführen, wenn eine bestimmte Bedingung erfüllt ist.
  4. Wenn ein GameObject in der Szene nicht aktiv ist, kann es auch nicht gefunden werden. Mach doch einfach deine panel Variable public und zieh dann das Panel im Inspector auf die nun sichtbare Variable. GameObject.Find brauchst du dann natürlich nicht mehr.
  5. Welchen Wert siehst du denn bei spawnRate im Inspector? Ich gehe davon aus, dass da keine 900 zu sehen ist. Dass es eine Rechteck- Form ist, ist ja klar. Du ermittelst ja die x und y Werte wie bei einem Rechteck. Du holst dir zufällige Werte aus einer definierten Breite und einer definierten Höhe.
  6. Das ist normal! Denk daran, dass dies Public Variablen sind. Also du das erste Mal gespeichert hattest wurde der Wert 1 beim adaptSpeed übergeben. Dies ist jetzt der Public (also der Öffentliche) Wert. Ab jetzt kannst du im Code Werte eintragen wie du willst, sie werden den public Wert nicht mehr überschreiben. Willst du den Wert ändern, dann ändere ihn im Inspector. Bei Private Variablen ist das anders, da ist wirklich nur der Wert im Code entscheidend, denn da gibt es ja nichts was von Außen geändert werden kann.
  7. Hast du in dieser Datei weiter unten auch _content=bytes drin stehen und die alten _content Einträge auskommentiert, so wie ich das oben im Bild gezeigt habe?
  8. Tja, dann musst du mal auf Fehlersuche gehen, denn bei mir funktioniert das tadellos. Als erstes musst du mal deine Bildposition überprüfen. Die Position gibt nämlich die untere linke Ecke des Bildes an. Vielleicht ist dein Bild nicht zu sehen, weil es oben aus dem Blatt herausragt. Dann setz mal ein Debug.Log in das ImageElement script. Und zwar hier: internal imageElement(Texture2D myImage, int newCoordX, int newCoordY) { MemoryStream outStream = null; try { byte[] bytes = myImage.EncodeToPNG(); // das hier ist neu um die Bytes zu bekommen. //Hier drunter Debug.Log("length: "+bytes.Length); //hier drüber outStream = new MemoryStream(); Das Debug.Log im simplePDF wo erstellt drin steht haste noch? Wenn ja, dann solltest du das ja auch sehen. Wenn du als die Szene startest, solltest du diese Dinge in der Console sehen: Wenn die length größer als 0 ist, hat er das Bild schonmal geladen und den bytes übergeben. Ja und "erstellt" sollte auch kommen, denn dann ist er fertig. Du darfst auch keine Fehlermeldung sehen.
  9. Oh ja, hab ich vergessen zu erwähnen. Du musst in dem pdfPersistentPage ganz oben noch using UnityEngine; einfügen. Die Fehlermeldung sagt das ja quasi aus. Die Coroutine newAddImage kommentierst du komplett aus. Die brauchst du nicht.
  10. So. Ich habe jetzt den vorhandenen Code soweit geändert, dass auch eine Texture2D geladen UND in die PDF eingefügt werden kann. Ich erkläre dir, was ich gemacht habe und welche Scripte alle betroffen sind. 4 Scripte müssen bearbeitet werden. 1. pdfPersistentPage.cs Hier ist, genauso wie bei pdfPages.cs, die Methode addImage zu verändern. Die Version mit Bytes muss weg ( ab Zeile 53) und die Methode mit Texture2D muss frei werden (ab Zeile 72). Ich weiß jetzt gar nicht mehr, ob da auch das Textures2D fehlte, deswegen poste ich den Abschnitt mal, wie er sein muss. public void addImage( Texture2D newImgObject, int X, int Y) { try { imageElement objImage = new imageElement(newImgObject, X, Y); _persistentElements.Add(objImage); objImage = null; } catch (pdfImageNotFoundException ex) { throw new pdfImageNotFoundException(ex.Message,ex); } catch (pdfImageIOException ex) { throw new pdfImageIOException(ex.Message,ex); } } Vergleiche einfach ob es im Code bei dir genauso steht. 2. pdfPages.cs Das war der Bereich, bei dem ich dich animieren wollte, soelbst den Fehler zu finden: public void addImage( Texture2D newImgObject, int X, int Y) { try { imageElement objImage = new imageElement(newImgObject, X, Y); _elements.Add(objImage); objImage = null; } catch (pdfImageNotFoundException ex) { throw new pdfImageNotFoundException(ex.Message,ex); } catch (pdfImageIOException ex) { throw new pdfImageIOException(ex.Message,ex); } } Da fehlte einfach nur das Texture2D in der void. 3. ImageElements.cs Hier habe ich einiges abändern müssen, da der Codeersteller versucht hatte, die Bytes des Bildes per System.Drawing zu ermitteln, was aber ga nicht geht, weil in System, gibt es kein Drawing. Ich zeige dir erstmal den Codeabschnitt und erkläre ed dir danach: internal imageElement(Texture2D myImage, int newCoordX, int newCoordY) { MemoryStream outStream = null; try { byte[] bytes = myImage.EncodeToPNG(); // das hier ist neu um die Bytes zu bekommen. outStream = new MemoryStream(); //myImage.Save(outStream,System.Drawing.Imaging.ImageFormat.Jpeg); //_content = new byte[outStream.Length]; //_content = outStream.ToArray(); _content = bytes; // das hier ist neu _height = myImage.height; // hier war ein Height mit großem H _width = myImage.width; // hier war ein Width mit großem W _coordX = newCoordX; _coordY = newCoordY; } catch (System.IO.FileNotFoundException ex) { throw new pdfImageNotFoundException("Oggetto Immagine non corretto!", ex); } catch (System.IO.IOException ex) { throw new pdfImageIOException("Errore generale di IO sull' oggetto immagine!", ex); } finally { if (outStream != null) { outStream.Close(); outStream = null; } } } Um an die Bytes zu kommen, habe ich einen Workarround genutzt. Und zwar nutze ich Texture2D.EncodeToPNG( ) dafür, wie es auch im Beispiel für WWWForm angegeben war. diese Info wird dann der _content Variable übergeben. die Variablen _height und _width wollten die werte vom myImage haben, dort wurde Width und Height jedoch groß geschrieben, was es so bei Texture2D aber nicht gibt. Da werden die Parameter klein geschrieben. Das ahbe ich also auch geändert. Ja und dann habe ich alles, was nicht funktioniert auskommentiert. Siehste ja. 4. SimplePDF.cs Hier sind die letzten Zeilen des Codes wichtig (ab Zeile70). Ursprünglich wurde ja die Coroutine myFirstPage.newAddImage() gestartet. Das hatten wir ja gestern schon auf den direkten Start von myFirstPage.addImage() geändert. Jetzt habe aber heute erst gesehen, dass dieser ganze Code in einer Coroutine drin steht und eine Coroutine wartet immer auf etwas und will gerne was zurückgeben. Das tut sie mit dem yield return. Damit das jetzt hier ohne weiteren Umbau des Codes funktioniert, habe ich einfach auf die testgrafik an sich warten lassen. Hier der veränderte Code : var testgrafik = Resources.Load<Texture2D>("Picture1"); myFirstPage.addImage(testgrafik, 100, 500); // hier wird nur die Grafik und die Position im PDF übergeben yield return testgrafik; // da das ne Coroutine ist, muss auch auf was gewartet werden //yield return StartCoroutine ( myFirstPage.newAddImage ( "FILE://picture1.jpg",2,100 ) ); myDoc.createPDF(attacName); myTable = null; Debug.Log("erstellt"); Ein Hinderniss gibt es jetzt noch: Die Grafiken, die im Resources Ordner drin liegen, müssen in den Importeinstellungen auf Read/Writ Eabled gestellt werden und sie dürfen nicht Komprimiert sein. Nur so, kann er die Bytes auslesen. Siehe Bild: Jetzt solltest du es auch hinkriegen. Ich habs jedenfalls im Editor und im Build getestet und bei mir geht's.
  11. Och nö! Du musst versuchen zu verstehen, was da passiert. Es ist zwar toll, wenn es vorgefertigte Dinge gibt, die man nutzen kann, aber sobald man etwas verändern will/muss, muss man den Code auch verstehen. Worauf ich hinaus wollte, ist der fehlende Typ von newImageObject. Und zwar muss der ja auch Texture2D sein. Wenn du eine Methode aufrufst und ihr auch irgendetwas übergeben willst, dann muss die Methode so angelegt sein, dass klar ist was für Typen da kommen und in welche Variable sie gespeichert werden. Also: public void addImage( Texture2D newImgObject, int X, int Y) Trotzdem hast du Recht. Der auskommentierte Code ist fehlerhaft. PDF Elemente werden scheinbar nur als Stream abgespeichert, also Byteweise. Tja, und da wäre für dich noch Einiges zu tun. Ich habe aber scheinbar ne Lösung für das Problem gefunden. Ich melde mich gleich nochmal.
  12. Wenn du dir die Zeile public void addImage( newImgObject, int X, int Y) mal anschaust und zwar ganz genau auf die drei Dinge, die da übergeben werden sollen, was fällt dir da auf? Die Fehlermeldung sagt dir übrigens, dass da ein unerwartetes Symbol auftaucht, nämlich das Komma. Warum ist das unerwartet? Weil da etwas wichtiges fehlt! Das Komma sollte nämlich noch gar nicht kommen. Hast du's erkannt? was ist denn newImageObject? Ich meine bei X und Y ist klar was sie sind. Nämlich int Typen. newImageObject ist aber irgendwie garnix, oder? Da liegt der Fehler!
×
×
  • Create New...