Jump to content
Unity Insider Forum

Kojote

Members
  • Content Count

    1,168
  • Joined

  • Last visited

  • Days Won

    5

Everything posted by Kojote

  1. Deswegen ja hier das True, dass sagt, dass auch deaktivierte Komponente gefunden werden: actionTriggerCol = GetComponentInChildren<BoxCollider>(true); smr = GetComponentInChildren<SkinnedMeshRenderer>(true); Aber wie gesagt, schau mal auf Bild 2 wars glaub ich, da steht ja im Inspector drin, dass er den SMR gefunden hat. Das wundert mich halt. Er findet ihn, aber drauf zugreifen darf man nicht.
  2. Also der Fehler kommt genau bei der Zeile: material = smr.material; Da ich aber eine Zeile vorher ja den SkinnedMeshRenderer finde, frage ich mich, wo sein Problem ist: smr = GetComponentInChildren<SkinnedMeshRenderer>();
  3. Hi! Sagt mal, könnt ihr mal auf die Grafiken einen Blick werfen: Ich versuche in der OnEnable-Methode einige Komponenten zu finden: private void OnEnable() { actionTriggerCol = GetComponentInChildren<BoxCollider>(true); smr = GetComponentInChildren<SkinnedMeshRenderer>(true); material = smr.material; col = material.GetColor("_Color"); } Laut Inspector wurde alles gefunden, trotzdem bekomme ich ne Fehlermeldung, dass er den SkinnedMeshRenderer nicht findet. Seht ihr da irgendwo nen Fehler? Grüße von Kojote
  4. Hi! Sehr eigenartige Frage, ich weis, aber wo ist im Build mein Mauscursor. In Unity ist mein Mauscursor da und im Start steht, dass der Cursor sichtbar geschalten werden soll. Im Build ist der Cursor weg. Habt ihr ne Idee? EDIT: Korrektur, ich teste gerade im Fenstermodus. Wenn ich ihn außerhalb vom Spiel verschiebe, also im normalen Desktopbereich ist der Cursor zu sehen, hole ich ihn ins Spiel ist er am Rand kurz sichtbar und verschwindet dann. 🤨 EDIT 2: Ich hab jetzt mal in den Player-Settings einen Default-Cursor angegeben. Im Unity-Editor-Play-Mode wird mir der Cursor angezeigt, im Build nicht. EDIT 3: OK, "Fehler" gefunden. Hatte ein Image zum Einblenden deaktiviert. Das hat er im Editor ignoriert, jedoch im Build hat er die Coroutine gestoppt und erst danach war Cursor.Visible = true. Nebenfrage, war nicht mal in der 2017 Version die Debug-Console automatisch ab der ersten Karte an. Ich hab nun nen Dev-Build mit Console erstellt und bekomm die Console erst im Hauptspiel, nicht aber im Main-Menue. Grüße von Kojote
  5. Kojote

    Fight!

    Er kann die gesamte Zeit angreifen mit der linken Maustaste. Mhhh schwer zu fragen was ich da mache. Wie macht man das in Egospielen mit Schwertern.
  6. Kojote

    Fight!

    Um Realismus gehts mir gar nicht, es reicht das ich den Unterschied hab zwischen anrempeln und wirklichan angriff. Meine Idee war ja, weis nicht ob man das so macht, dass der Spieler angreift und der Enemy dies registriert und ich im Angriffsmoment rübergebe, Enemy erhällt 30 Punkte Schaden. Den Rest macht der Enemy selbst. Wichtig ist also der Informationsfluss, wann greift der Spieler an und wie viel Schaden gibt er ab. Ob die Kralle nun 2 mm weiter links oder rechts ist, ist mir egal, so viel Realismus muss nicht sein.^^
  7. Kojote

    Fight!

    Ja aber woher weis ich wann es nur ein rannrennen und wann ein Angriff ist? Wie sollte das sonst gehen? Da ich noch net mal weis wie so ein Kampfsystem sich Triggert bin ich da offen, bisher steht noch keine Codezeile.^^
  8. Kojote

    Fight!

    Grüße! Bei meinem Spielchen gehts weiter, nach Spawn und Tod gehts nun an den Kampf. Wie gesagt ist es ein Tier-Spiel und die kämpfen wie Tiere, anspringen, Pfote hauen und der gleichen. Nun, wenn ich jagen will und das Tier anspringe bzw. mit der Pfote haue, muss etwas ja bei dem anderen Tier passieren, eine Reaktion und der Abzug von Lebenspunkten. Bisher hatte ich zwei Ideen: Collider-Version Version hier wäre denk ich am besten, wenn der Collider des Spielers in einen Trigger Collider des Tieres eindringt, kann ich über OnTriggerEnter ja alles starten und kann auch die Schadenspunkte übermitteln. Frage hier wäre aber zum einen, wie unterscheide ich Angriff von nur mal Anrempeln, nicht das er von einen Schubs gleich Lebenspunkte verliert. Zum anderen, müsste der Spieler immer den Collider verlassen, um das nächste mal über den Trigger Schaden zu verursachen. Ist er zu nahe dran, passiert nichts oder ich muss OnTriggerStay nutzen und hier war im hintergrund irgendwie noch ein Performance-Gespenst. Ray-Version Die Ray-Version würde so ähnlich funktionieren, nur das ich beim Angriff nach vorn noch einen Ray nach vorn schiesse und da das selbe mache mit dem Trigger. Bietet aber den Nachteil, wenn er knapp daneben geht, sieht der Spieler zwar nen Angriff, wird aber nicht gewertet. Was meint ihr dazu? Grüße von Kojote
  9. Problem ist, dass der Schaden doch mit der Zeit immer größer wird. Selbst wenn ich mal die Vitalität wieder auf 100% setze, bleibt doch der demagePerSecound gleich hoch und wird immer größer, es addiert sich doch immer mehr.
  10. Stimmt, dass ist natürlich noch besser!
  11. private float damagePerTick = 0f; private float damageIncreasePerTick = 0.1f; private void FixedUpdate() { damagePerTick += damageIncreasePerTick * Time.deltaTime; ApplyDamage(damagePerTick); } Komm jetzt endlich mal dazu hier weiter zu machen. Problem ist hier gerade der feste Wert von demagePerTick. Der wird im Laufe der Zeit immer größer. Wenn der Spieler etwas ist, wird die Vitalität wieder hoch gesetzt. demagePerTick bleibt aber und wird immer schneller und größer. Möglichkeit wäre ja, jede Sekunde eine feste Größe von der Vitalität abzuziehen, dies wäre dann aber wieder linear und nicht exponentiell. Kann man da was machen? Ich komm leider net drauf.
  12. OK klappt, probieren wirs mal aus. EDIT: Hehe, dass klappt super! Mit den anderen Tutorials bin ich bisher nicht zurecht gekommen, aber glaube jetzt machts klick. Müsste nur meatValue auf public ändern, dass ich den Wert auslesen kann, so klappt das Prima, vielen Dank! Spart mir echt nen rießen Berg Code mit if-else.
  13. Ich ahne schon, ich muss mich die nächste Zeit mal intensiver mit ScriptableObject beschäftigen. Irgendwie komme ich nicht drum herum. 😀 Danke dir!
  14. Ja so hab ichs jetzt auch gelöst, wäre nur schön, wenn man es im Inspector nachbearbeiten könnte. Mit ScriptableObject komm ich noch nicht ganz zurecht. Die Werte sollen nur einmal festgelegt werden. Gut wäre zental im Inspector festlegen und alle anderen Scripts bekommen ein Update mit den neuen werten.
  15. Grüße! Ich bin immer noch an meinem Jagdspiel. Nun bin ich bei der Nahrung angekommen. Um es etwas einfacher zu machen, wollte ich jeder Nahrungsquelle ein kleines Script mit einem Enum verpassen. Zum Beispiel Enum-Value Zebra. Zebrafleisch, soll nun, wenn der Charakter es isst einen Wert von 30 haben. Gnu z.B. einen Wert von 20. Habt ihr eine Idee wie ich global die Lebensmitteldaten in das Enum bekomme, dass Enum 1 weiss, dass es den Wert 30 hat, Enum 2 den Wert 20 und so weiter? Grüße von Kojote
  16. Ah, dass ist interessant, die kleine Spitze kommt nur davon, dass das GameObject aktiviert wurde.
  17. Grüße! Mal ne Frage, ist zwar jetzt Kindergarten, aber da ich heute gerade was drüber gelesen habe und immer was anderes da stand, mal die Frage zu. & bzw. | ist ja eine Bitweise Verknüpfung. && bzw || wäre eine Logische Verknüpfung. Ich hab folgendes gelernt: if((a > b) & (b = c) & (d = a)){ // Do } Hier würde jede einzelne Klammer kontrolliert und ausgewertet werden, anders hier: if((a > b) && (b = c) && (d = a)){ // Do } Durch das doppelte && würde schon nach der ersten Klammer aufgehört zu arbeiten, wenn hier ein false kommen würde. Man würde sich damit den Rest sparen. Ist das so korrekt? Grüße von Kojote
  18. Ich greif mal das alte Thema noch mal auf, um den Profiler besser zu verstehen. Bin nun so weit mit meinem Spawner-Script fertig und schaue mir das ganze mal im Profiler an: Was mich interessiert ist diese kleine "Lastspitze", meisst nur 0.01 bis 0.05 ms stark und auch nur für einen Moment. Versteh ich dies nun richtig, dass dies durch das starten der Coroutine kommt, die Unity erstellen muss oder hab ich da unsauber programmiert?
  19. Ja wäre ne Idee, wäre aber scripttechnisch wieder sehr aufwendig, da ich ja schon Wahrscheinlichkeiten eingestellt habe, was wie oft spawnen soll. Sie werden einmal geladen und landen im Pool, dort müsste ich nun wieder wühlen, um Kleinzeug zu finden, würde alles recht aufwendig machen. Ich grübel da schon das gesamte WE drüber, wollte heute Scripten und bin kein Schritt weiter. Im Gebiet habe ich ja nicht nur ein Spwangebiet, sondern mehrere Verteilt. Ist also ein Gebiet "leer", kann der Spieler ja wo anders hingehen. Trotzdem bleibt die Frage, wann trigger ich, dass wieder neu gespawnt wird. Nach einer gewissen Zeit oder mit TrigerEnter bzw. TriggerExit. Tiere spawnen zu lassen, während der Spieler gerade in der Nähe ist, ist auch wieder unpraktisch, aller: "Wo kommen die auf einmal her, gerade waren sie doch noch nicht da?!" EDIT: Mir ging jetzt folgendes durch den Kopf. Trigger hin, Update her! Im Grunde ist es Jacke wie Hose, ob ich nun die Update-Version nehme oder die Trigger Version, mir gehts einzig um die Performance. Aber wahrscheinlich mach ich mir damit wieder mal mehr Kopfschmerzen als nötig. Ich hatte nun folgende Ideen: 1. Version: Ein Trigger-Exit ruft nun eine Coroutine auf, diese macht nun das selbe, was die Update-Methode gemacht hat: if (!isSpawning && pool.Count > 0) { isSpawning = true; if (!useSpawnArea) { StartCoroutine("SpawnObjectAtSpawnpointCoroutine"); } else { StartCoroutine("SpawnObjectAtSpawnAreaCoroutine"); } } Das ganze müsste man in eine Schleife packen. Die Spawn-Coroutinen werden aufgerufen und hier könnte man auch noch mal einen Timer setzen, aller wie viel Sekunden was neu gespawnt wird. Bin aber kein Schleifenfreund, kommt was unvorhergesehenes, was Spieler gern machen, friert das Spiel ein. 2. Version: Meiner Meinung nach die bessere Version. Timer mit in die Update-Methode, dazu noch bei den Spawnern ein Abstandssensor zum Spieler. Wenn er weit genug weg ist, wird gespawnt. Dann könnte ich mir das Trigger-Exit sparen. private void Update() { if (!spawnTimeSet) { spawningTimer = Time.time + Random.Range(spawnTimeBeginMin, spawnTimeBeginMax); spawnTimeSet = true; } if (!isSpawning && pool.Count > 0 && (Time.time >= spawningTimer)) { Debug.Log(Time.time + " " + spawningTimer); isSpawning = true; if (!useSpawnArea) { StartCoroutine("SpawnObjectAtSpawnpointCoroutine"); } else { StartCoroutine("SpawnObjectAtSpawnAreaCoroutine"); } } }
  20. Einer noch ne Meinung / Idee?
  21. Warum willst du das eigentlich mit Unity machen? Wordpress hat eine Datenbank und die Plugins zu, da wird alles drin gespeichert. Es gibt auch kleine Programme, mit denen kann man aus einer HTML Seite eine aufrufbare APP machen. Warum gehst du den Weg über Unity?
  22. Bei mir sind die Tiere für die Nahrungsversorgung zuständig. Du bist ein Raubtier in meinem Spiel. Du bekommst Aufgaben die die lösen musst - klar irgendwie.^^ Bei vielen Spielen ist das ja genau so, hier findet man dann eben in der Gegend Munition und Lebenspunkte Kits. Wenn du bei mir überleben willst, musst du mit deinem Tier auf die Jagd gehen, um dein Überleben zu sichern. Also ist nachspawnen der Tiere eine Grundvorraussetzung, also alles ausrotten wäre bei mir im Spiel das Game Over, geht also nicht. Nun überlege ich halt wie ich spawne, der Spieler soll schon merken, wenn ich mal richig gewildert habe, ist halt auch erst mal das Gebiet "gesäubert". Frage ist halt nun, soll das Gebiet nun erst einmal eine weile frei sein oder soll immer mal wieder was erscheinen.
  23. Ich denke auch, du verstehst da was falsch bei Unity und so weit ich das verstehe, nutzt du das falsche Programm für dein Vorhaben, du möchtest etwas auf deiner Wordpresseite verkaufen, dafür gibt es Shop Plugins, so genannte "Ecommerce Plugins". Ich bau selber Wordpress Seiten auf, wenn du mal in Ruhe quatschen willst, meld dich mal per PN.
  24. Meinst du eher so hier: private IEnumerator SpawnObjectAtSpawnpointCoroutine() { if (spawnSettings == Spawn_Settings.Random) { Vector3 spawnPoint = new Vector3(); bool checker = false; while (!checker) { spawnPoint = CalculateSpawnVectorAtSpawnPointWithRandom(); bool checkCollision = false; bool checkHidden = false; // Wenn ein Collision-Check überprüft werden soll, wird dies in dieser if-Abfrage ausgeführt. if (useCollisionCheck) { if (PositioningCollisionCheck(spawnPoint) == false) { checkCollision = false; yield return new WaitForSeconds(2f); // Wichtig! Die Wartezeit sorgt dafür, dass die Schleife nicht einfriert. } else { checkCollision = true; } } else { checkCollision = true; } // Wenn ein Hidden-Spawn-Check durchgeführt werden soll, wird dies in dieser if-Abfrage ausgeführt. if (useHiddenSpawnCheck) { if (PositioningCollisionCheck(spawnPoint) == false) { checkHidden = false; yield return new WaitForSeconds(2f); // Wichtig! Die Wartezeit sorgt dafür, dass die Schleife nicht einfriert. } else { checkHidden = true; } } else { checkHidden = true; } // Sind sowohl Collision-Check als auch Hidden-Spawn-Check positiv ausgefallen, wird die Schleife verlassen, es kann gespawnt werden. if (checkCollision == true && checkHidden == true) { checker = true; } } GameObject objectToSpawn = pool.Dequeue(); objectToSpawn.SetActive(true); objectToSpawn.transform.position = CalculateYPosition(spawnPoint); objectToSpawn.transform.rotation = RandomQuaternion(); isSpawning = false; }
  25. Also so 100%ig funktionier das net. Ich hab das Script zum spawnen: private IEnumerator SpawnObjectAtSpawnpointCoroutine() { if (spawnSettings == Spawn_Settings.Random) { Vector3 spawnPoint = CalculateSpawnVectorAtSpawnPointWithRandom(); if (useCollisionCheck) { if (PositioningCollisionCheck(spawnPoint) == false) { yield return new WaitForSeconds(3f); yield return null; } } if (useHiddenSpawnCheck) { if (HiddenSpawnCheck(spawnPoint) == false) { yield return new WaitForSeconds(3f); yield return null; } } GameObject objectToSpawn = pool.Dequeue(); objectToSpawn.SetActive(true); objectToSpawn.transform.position = CalculateYPosition(spawnPoint); objectToSpawn.transform.rotation = RandomQuaternion(); isSpawning = false; } Und hier der Collision-Check: private bool PositioningCollisionCheck(Vector3 spawnPoint) { Collider[] hitColliders = Physics.OverlapSphere(spawnPoint, collisionSizeCheck, notAllowedColliosionsLayerMask, QueryTriggerInteraction.Ignore); if (hitColliders.Length == 0) { return true; } else { return false; } } Problem nun, alle Spawnable Objects besitzen den Layer Animal, mit einem Spawn-Point würde das bedeuten, dass ein Object spawnen kann, die anderen, aber in die Sicherung rennen, 3 Sekunden warten und wieder in die Sicherung rennen, bis das erste Object den Einflussbereich verlassen hat. Der Herr meint aber, alle Objects können spawnen und gibt immer true zurück. 😕 EDIT: Ne Moment! Falsch er gibt false zurück, was richtig wäre, aber das Return funktioniert net in der Coroutine. Sinn der Sache war, nach und nach alle Checks durchzugehen und wenns einmal false gibt, zurück an den Anfang und nen neuen Spawn-Point berechnen. EDIT 2: Irgendwas sagt mir gerade das "yield return null;" in der Coroutine nicht die selbe Funktion wie "return;" in normalen Methoden hat oder lieg ich da falsch? 🧐
×
×
  • Create New...