Jump to content
Unity Insider Forum

Leaderboard


Popular Content

Showing content with the highest reputation since 04/23/2019 in Posts

  1. 2 points
    Ist jetzt nicht nötig, aber vielleicht trotzdem interessant. Das kannst Du auch (gut leserlich) kürzen: bool direction = true; if (Input.GetKeyDown(KeyCode.Space)) { direction = !direction; //direction wird einfach negiert }
  2. 2 points
    Ich hatte nicht viel Zeit für dein Mesh, aber ich konnte erkennen, dass deine Wichtungen nicht gut sind. Die Meshpunkte haben alle Wichtungen von allen 5 Joints des Armes. Die Punkte , die von jedem Joint die gleiche Wichtung haben, sehen gut aus, die die unterschiedlich gewichtet sind, verzerren schon beim Einfügen in der Szene. Sobald du einen Unterjoint drehst, verstärkt sich die Verzerrung, was klar ist, denn der Überjoint bleibt ja stehen. Warum von vornherein, schon Verzerrungen da sind, weiß ich jetzt erstmal nicht. Kann aber an der Animationsspur liegen. Evtl. ist dort im ersten Frame schon eine Änderung der Drehung der Joints drin. Egal. Seh zu, dass deine Punkte maximal von 2 Joints Wichtungen bekommen (an den Gelenken). Und versuch's erstmal nur ohne Animationsspuren um den Fehler einzugrenzen.
  3. 1 point
    Naja, so wirklich viel ist das auch wieder nicht. Das teuerste an der Sache ist das Wurzelziehen, und das kann man bei Vergleichen sogar weglassen. Schauen wir doch mal ganz genau: public static bool CheckIfCloserThan(Vector3 a, Vector3 b, float maxDistance) { var maxDistanceSquared = maxDistance * maxDistance; var distanceSquared = (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z); return distanceSquared <= maxDistanceSquared; } Diese Funktion checkt, ob der Abstand zwischen a und b kleiner-gleich der gegebenen Maximaldistanz ist. Wir benutzen in der Mitte nicht einfach (a - b).sqrMagnitude, weil das etwa 4-Mal so langsam ist. Es bleibt damit bei vier Multiplikationen, sechs Subtraktionen und einem Kleiner-gleich-Vergleich. Das sind elf FLOPS. Dagegen kann ein Physik-Check mit Collidern gar nicht ankommen. Da ist ja erstmal der AABB Check. Der alleine ist im Zweifelsfall ja auch schon gerne mit neun FLOPS und drei Bool-Abgleichen am Start. Und danch kommt erstmal der richtige Kollisionscheck. Wenn es also wirklich nur um den Abstand zwischen zwei Punkten geht, nicht immer gleich verrückt machen lassen. So viel ist da gar nicht los, und mit einer simplen Funktion wie der da oben bist du in jedem Fall schneller unterwegs als mit der Physik-Engine. Einer Kernaussage von @malzbie muss ich außerdem grundsätzlich zustimmen: Und ich würde da hinzufügen: Alles unter fünfstellig zählt für mich hier als "wenige". Mal so als Vergleich: Meine Funktion oben läuft bei mir auf dem PC in unter 10ns. Eine Nanosekunde entspricht 0,000001ms. Das heißt, dass du die Funktion schon 100.000-Mal aufrufen musst, damit ihre Benutzung 1ms kostet. Und das sequenziell, denn solche Berechnungen kannst du wunderbar parallelisieren oder batchen. Performance ist erst dann ein Problem, wenn es ein Problem wird. Zu versuchen, irgendwelche Performance-Optimierungen zu machen, bevor der Profiler überhaupt Probleme aufzeigt, ist schlichtweg keine gute Idee. Kümmer dich darum, dass dein Spiel funktioniert, achte darauf, dass du gute Code-Qualität hast (Robustheit, Modularität, geringe Redundanz...). Und wenn du dann irgendwann Performance-Probleme feststellst, dann kannst du mit dem Profiler die Problemstelle finden und verbessern.
  4. 1 point
    Stimmt schon. Eine Distance-Abfrage braucht einiges an Performance. Es ist aber, wie immer, eine Frage der Dosis. Wenn nur wenige Abfragen gemacht werden, ist das alles kein Problem. Wenn du aber viele Objekte im Spiel hast, die jedes Frame über abfragen wo der Spieler ist, dann wirst du das im Profiler sehen. Da werden einige Prozent deiner Leistung drauf gehen. Du könntest aber die Objekte einfach über eine Coroutine nur alle 0.5 Sekunden eine Messung machen lassen. Ich persönlich würde die Trigger nutzen. Die feuern ein Event, wenn es soweit ist und brauchen sonst eigentlich nur wenig Leistung. OnTriggerStay brauchst du in diesen Fällen gar nicht. Du setzt einfach eine Hilfsvariable auf true, sobald das OnTriggerEnter Event ausgeführt wird, und wieder auf false wenn das OnTriggerExit Event ausgeführt wird. Über diese Variable kannst du dann z.B. ein Leuchten des Objektes steuern. Außerdem triggert das Event in beide Richtungen, wie du ja selber geschrieben hast. Der Player kann über ein Trigger Event genauso etwas von dem Objekt erfahren. Eine ganz wichtige Sache ist auch, dass eine Distance Messung nichts darüber aus sagt, ob evtl. eine Wand zwischen dem Player und dem Objekt liegt. Einen Trigger kannst du einfach so positionieren, dass er nicht durch die Wand reichen würde.
  5. 1 point
    Brauchst die Zahl nicht wieder aus dem String rauszuholen, hast sie doch sowieso schon rumliegen. Hier mal ein Beispiel, wie sowas aussehen kann: private int level = 1; public Text levelDisplay; private void Start() { level = PlayerPrefs.GetInt("Level"); } public void IncreaseLevel() { level++; SaveAndDisplayLevel(); } public void ResetLevel() { level = 1; SaveAndDisplayLevel(); } private void SaveAndDisplayLevel() { PlayerPrefs.SetInt("Level", level); PlayerPrefs.Save(); levelDisplay.text = level + ""; }
  6. 1 point
    Dann kannst du auch einfach LvLStatus = 1; schreiben
  7. 1 point
    Hi, wenn ich es richtig sehe, muss der Code am Ende wie folgt aussehen: public void UpdateLvL() { TxtShowLvL.text = LvlStatus.ToString(); } So habe ich es bei mir in meinem Script. Du holst dir ja ansonsten gar nicht die vorher ermittelte Variable. Anmerkung: Anstatt LvLStatus = LvLStatus + 1; kannst du auch einfach LvLStatus += 1; schreiben. Ebenso "-= 100". Ist es richtig, dass der Wert "0" auch gilt? Derzeit wird nur bei Werten unter "0" die Variable "LvlStatus" auf "1" gesetzt, nicht beim Wert "0". Das kannst du umgehen, wenn du nicht "<", sondern "<=" einträgst.
  8. 1 point
    Ist bei mir so ähnlich. Gerade die jüngere Generation, die Flipper in der Kneipe nicht mehr kennt, spielen oft nur kurz an und erkennen die Komplexität meist nicht. Seit ich aber Leaderboards eingebaut habe, die die Punkte der Spieler auf der ganzen Welt anzeigen, erkennen sie wenigstens schon einmal, dass da viele Punkte geholt werden können. Dann lesen sie sich auch mal die Tischregeln durch und dann packt es sie meistens. Jedenfalls die, die nicht nur den freien Tisch runterladen um einfach ihre Spieleliste zu erweitern.
  9. 1 point
    Hallo Zusammen Mir ist aufgefallen, dass ich die Anzahl der Materialen bei einem Objekt nicht mehr einstellen kann. Google meinte ich es sei ein bug in der 2018er Version, also habe ich jetzt die 2019.1 geladen, Spiel importiert, aber ich kann die Anzahl immer noch nicht auswählen. Ist das jetzt neu wo anders oder ist das ein Fehler? Edit: Super peinlich, grad gefunden, hat sich nur minimiert...
  10. 1 point
    Immer wenn ein neues Touch-Ereignis stattfindet. Beispiel: if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) { // mach etwas } Link zu "Input.touchCount": https://docs.unity3d.com/ScriptReference/Input-touchCount.html Link zu "Input.GetTouch": https://docs.unity3d.com/ScriptReference/Input.GetTouch.html ABER: Wie ich mich nun mit deinem Script weiter auseinander gesetzt habe ist mir aufgefallen, dass die Variable "cameraOffset" doch nur im Start abgefragt werden darf. Bei einem Test mit der Maus ist ansonsten der Player immer weiter an die Camera herangekommen. Ich musste es mit der Maus prüfen, weil ich für Touch keinen Simulator bei mir auf dem Rechner habe. Ich muss zum Testen ansonsten immer mein Tablet anstecken und das Spiel / den Code ersteinmal installieren. Zuerst hatte ich noch eine Variable "lookAtPlayer" im Script, welche bei einer Mausbewegung immer auf "true" stand, ansonsten auf "false". Dabei ergab sich aber das Problem, dass der Player aufgrund der sich noch nachbewegenden Camera aus dem Bildzentrum wanderte und bei einer erneuten Mausbewegung wieder in die Bildmitte gesprungen ist. Hier mein Code, welcher für die Maus funktioniert hat, in der aber die Touch-Abfrage noch eigenständig enthalten ist: public class TestCamRotation : MonoBehaviour { public GameObject player; private Vector3 cameraOffset; [Range(0.01f, 1.0f)] public float smoothFactor = 0.5f; // public bool lookAtPlayer = false; // public bool rotateAroundPlayer = true; public float rotationsSpeed = 5.0f; Vector3 cameraNewPosition; private void Start() { cameraOffset = transform.position - player.transform.position; } void Update() { /* if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) { cameraOffset = transform.position - player.transform.position; } */ if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved) { Quaternion cameraTurnAngle = Quaternion.AngleAxis(Input.GetTouch(0).deltaPosition.x * rotationsSpeed, Vector3.up); cameraOffset = cameraTurnAngle * cameraOffset; } if (Input.GetAxis("Mouse X") != 0) { // cameraOffset = transform.position - player.transform.position; Quaternion cameraTurnAngle = Quaternion.AngleAxis(Input.GetAxis("Mouse X") * rotationsSpeed, Vector3.up); cameraOffset = cameraTurnAngle * cameraOffset; } } private void FixedUpdate() { if (player != null) { cameraNewPosition = player.transform.position + cameraOffset; transform.position = Vector3.Slerp(transform.position, cameraNewPosition, smoothFactor); transform.LookAt(player.transform); } } }
  11. 1 point
    I'd guess that the child object gets scaled to 0 on one or both axes. Try fiddling with the checkboxes of the layout group, they represent the settings relevant to list element scaling.
  12. 1 point
    Im 'Game' Fenster ist oben ein 'Scale' Slider. Wenn du den auf 1 stellst müsste alles wieder normal sein..
  13. 1 point
    Nur so zur Info. Unity hat ein neues Imput System, mit dem kann man auch Kombos machen und ev. solche dinge leicht lösen. Habs aber selber noch nicht ausprobiert.
  14. 1 point
    Hi, ich glaube er meinte das etwas anders. Wenn ich dich richtig verstanden habe, willst du, dass sich der Ball die ganze Zeit bewegt und jedes mal, wenn die Leertaste gedrückt wird, sich die Richtung ändert. Das kannst du so umsetzen, dass du immer die aktuelle Richtung speicherst und beim Tastendruck den Wert umkehrst. Also etwa so: int direction = 1; void Update(){ if(Input.GetKeyDown(KeyCode.Space)){ direction *= -1; } if(direction > 0){ //move right } else{ //move left } }
  15. 1 point
    Hi, also am einfachsten würde es sein, dass du in der Update Funktion eine Input Abfrage machst mit GetKeyDown und dann in der Abfrage zwei Funktionen hintereinander aufrufst. Wenn das zweite Dribbeln verzögert nach dem ersten Dribbeln auftauchen soll (weil ja erstmal nach Links gedribbelt wird), dann eventuell die zweite Funktion mit einem Invoke aufrufen. using System.Collections; using System.Collections.Generic; using UnityEngine; public class dribbeln : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { if(Input.GetKeyDown(KeyCode.Space)) //Einmalige Tastaturabfrage für die Taste Space (Leertaste) { Dribbeln1(); //Erstmal wird die Funktion Dribbeln1 direkt aufgerufen Invoke("Dribbeln2", 2f); //Erst mit zwei Sekunden verzögerung, nachdem der Ball nach Links gedribbelt ist, wird die zweite Funktion aufgerufen und der Ball dribbelt nach Rechts } } void Dribbeln1() { //Funktion zum Dribbeln nach Links } void Dribbeln2() { //Funktion zum Dribbeln nach Rechts } }
  16. 1 point
    Ich hab mir das jetzt mal angeguckt, aber warum das obere Codebeispiel nicht genauso funktionieren sollte, verstehe ich nicht. Kann eigentlich nicht an der Reihenfolge liegen. Nunja... wenns geht, geht's!
  17. 1 point
    Hi, ich bin noch nicht so ein Ass im Programieren wie andere Leute hier, versuche aber trotzdem einmal zu helfen. Folgende Fragen / Anmerkungen vorab: 1: wo werden deine beiden bool Variablen "LookAtPlayer" und "RotateAroundPlayer" geschaltet? Ausserhalb dieses Script? Ansonsten machen sie hier keinen Sinn und verschlechtern die Übersichtlichkeit / Lesbarkeit des Script. 2: Variablen sollten zum Verständnis des Script immer klein geschrieben werden. 3: du solltest vor der Interaktion mit dem Game Object Player immer eine Abfrage erstellen, ob der Player noch da ist. Ansonsten gibt es eine Fehlermeldung, wenn der Player gestorben ist. Hierbei darfst du auch nur das GameObjekt Player abfragen und nicht gleich seine Transform Komponente. Beispiel: if (ply != null) { transform.LookAt(ply.transform); } 4: ich denke mir, dass es Sinn macht in der Update Methode die Bewegung der Mouse abzufragen und in eine Variable zu setzen, und in der FixedUpdate Methode diesen Wert zum Ändern des Game Objektes anzuwenden. 5: Grundsätzlich macht es Sinn für eine Touch Steuerung ein eigenes Script zu schreiben (auch wenn in verschiedenen Tutorials auf die Mouse Bewegung verwiesen wird), da bei einer Touch Steuerung die Touch Phase mit abgefragt werden sollte. Zu deinem eigendlichen Problem: Ich denke mir es liegt daran, dass dur nur ein einziges Mal in der Start Function "_cameraOffset" abfragst und nicht neu vor der Nutzung dieser Variable.
  18. 1 point
    Dann hast du da leider keinen guten Kurs. Versuche, so viel davon mitzunehmen wie du kannst, und dann such dir ggf. noch einmal einen richtigen
  19. 1 point
    @Jomnitech Wir reden hier von UnityScript, das ist ein JavaScript-Fork, und beides hat mit Java nix am Hut. @Dami1302 UnityScript benutzt man heute einfach nicht mehr. Einfach... gar nicht. Aber wenn du vor dem Unmstieg auf C# noch dieses Script brauchst... function SetMunition(newMunition : float) { munition = Mathf.RoundToInt(newMunition); } Wenn's damit noch Probleme gibt... benutze C#. Solltest du, wie gesagt, sowieso.
  20. 1 point
    So, ich habe etwas experememtiert: - wenn ich "float plyRotAngelEnd = 179.0f;" eingebe ist das Ergebnis nach der Drehung für "Rotation" X, Y, Z: 1, -180,-1 - wenn ich nur über die X Achse drehe und nicht noch über Z Achse ist das Ergebnis nach der Drehung: -180, 0, 0 - wenn ich die X Achse und die Y Achse drehe ist das Ergebnis nach der Drehung: 0, 0, -180 Es scheint also so, dass Unity versucht die Werte für "Rotation" nach der Drehung zu optimieren - das mache ich mir doch zu Nutze für mein Problem Nummer 2. Dadurch, dass mein Schiff aufgrund des Wert "Rotation" Y = -180 gedreht ist, und die anderen Achsen nun wieder auf "0" stehen, nehme ich die Y Achse mit in meinem Script auf: Ich ergänze public float plyShipMainRotY; und in der Update Function plyShipMainRotY = plyShipMain.eulerAngles.y; und ändere in der FixedUpdate Function plyShipMain.eulerAngles = new Vector3(plyShipMainRotX, plyShipMainRotY, plyShipMainRotZ); Nun sieht die Drehung wie folgt aus - zur Verdeutlichung habe ich die Drehtzeit "plyRotUridiumDuration" etwas erhöht. Im Spiel drehe ich natürlich schneller. Edit: da ich weiter unten das fertige Video zeige, habe ich an dieser Stelle den Zwischenschritt gelöscht. Da ich nun wirklich alle Achse nutze könnte ich eventuell anstatt 3 float Variablen mit einer Vector3 Variable arbeiten. Ich setzte mich aber ersteinmal an meine weiteren Probleme und hoffe, dass nicht in einem Update die Optimierung der Werte für "Rotation" wieder aufgehoben wird.
  21. 1 point
    Wenn "cube" ein Ordner ist, kannst du den schlecht laden. Mal davon abgesehen, müssen Ressourcen in einem Ordner namens "Resources" sein. Mit "Objects/cube" lädst du also z.B. das Asset mit dem Pfad "Assets/Resources/Objects/cube.prefab" oder "Assets/Banana/Resources/Objects/cube.prefab". Das ist auch schon so der erste Punkt, an dem die Warnleuchten angehen dürfen - Resources sollte man einfach generell nicht außerhalb von Editorscripts benutzen.
  22. 1 point
    Ich konnte es nicht lassen und habe die nötigen Werte ermittelt. Schau hier:
  23. 1 point
    Stimmt schon. Meine Kamera ist recht tief, aber das kann man leicht mit hoheren Wänden ausgleichen. Wie ich oben schon geschrieben habe, sind meine Säulen viel mächtiger als die in Grimrock. Dadurch hatte ich FOV von 60 eingestellt. Wenn die Säulen schmaler sind, kann man ohne weiteres ein FOV von 50 einstellen. Dadurch kommt alles etwas näher ran, auch die Monster, die ein Feld weiter stehen. Es war nur ein Quick and Dirty Test um dir zu zeigen, dass FOV eben nicht hoch ist und somit einen Weitwinkel erzeugt, sondern eher kleiner als normal und somit zoomt. Und damit die Wände passen, ist alles viel enger gebaut, als es wirklich sein würde.
  24. 1 point
    Hallo Ich habe vor kurzem Substance Painter abonniert und zum Test ein kleines Schwert modelliert und danach in Painter bemalt. Ist jetzt nicht perfekt, aber ich dachte ich könnte es ja trotzdem mal hier reinstellen, falls es jemand gebrauchen kann. Wenn gewünscht, könnte ich den Rost entfernen oder im unteren Teil auch noch etwas Rost hinzufügen. Sword.unitypackage
  25. 1 point
    Hi, ich hatte es oben falsch verstanden. Ich dachte dass man nur mit dem eingefärbten Würfel interagieren kann, und der Fehler ist, dass es auch mit dem weißen geht. Auf jeden Fall glaube ich jetzt die Antwort zu kennen: Der Ray geht zwar in die Richtung der Kamera, der origin liegt aber auf einem anderen Objekt (das auf dem das Skript liegt) . Ich nehme an, dass dieses Objekt der FirstPersonController ist, dessen Mittelpunkt ja auf der halben höhe liegt. Versuche es mal mit ray.origin = Kamera.transform.position;

Announcements

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

Weiterleitung zum Entwickler "daubit"



×