Jump to content
Unity Insider Forum

Zer0Cool

Members
  • Content Count

    2,036
  • Joined

  • Last visited

  • Days Won

    145

Everything posted by Zer0Cool

  1. Sicher das es der CrossPlatformInputManager ist und du nicht eher ein Problem mit den Zuständen deines Animationcontrollers hast (da das GO des Spielers beim Laden vermutlich nicht neu geladen wird)? Da würde es Helfen direkt nach dem Level laden den Controller z.b. in den Idle-State oder ähnliches zu versetzen.
  2. Man könnte das Objekt sobald es sich in einen anderen Collider hineinbewegt auch leicht zurücksetzen (in die Gegenrichtung der Bewegung der Hand oder des Players) und dann das Objekt dem Spieler aus der Hand fallen lassen. Sollte sich der Gegenstand nach dem Zurücksetzen immer noch im anderen Collider befinden würde ich es auf die Initialposition zurücksetzen. Allerdings kann dieses Zurücksetzen oder das aus der Hand fallen lassen den Spieler auch nerven. Dieses leidige Problem des Clippens eines Gegenstandes in ein anderes Objekt hatte ich auch schon ohne VR bei einem einfachen Schwertkampf mit Schild. Hier clippte das Schild immer in den Gegner (wenn der Spieler zu nah an den Gegner lief) und ich musste daraufhin die Position des Spieler korrigieren damit das Schild wieder "frei" wird.
  3. Da hast du grundsätzlich was falsch verstanden. Die OnTriggerStay-Methode liefert dir immer den Collider der gerade im Trigger steht. wie du diese Variable benennst, ob "other" oder "fremderCollider" oder "horst" ist völlig egal. Allerdings kannst du dir über den Collider das zugehörige GO geben lassen und hier prüfen ob es sich es im das GO handelt welches den Spieler definiert. Viele machen das über den Tag des GOs: //Check to see if the tag on the collider is equal to Player if (other.tag == "Player") { Debug.Log("Triggered by the Player"); } , du kannst aber auch eine Komponente des GOs abfragen und so ermitteln, welcher Collider dort in deinen Trigger geraten ist: //Check to see if the gameObject of the collider has a PlayerController component PlayerController playercontroller = other.gameObject.GetComponent<PlayerController>(); if (playercontroller != null) { Debug.Log("Triggered by the Player"); } In dem Beispiel hat der Spieler einen PlayerController und er wird darüber "erkannt".
  4. Eine andere Methode wäre noch immer zu prüfen, ob die Farbe des Würfels der Farbe der Plattform entspricht auf dem der Würfel landen möchte. Dies könnte man über einen Raycast in Flugrichtung des Würfels (der Velocity seines RB) oder der Steuerrichtung des Spielers herausbekommen. Wenn die Farbe des Würfels nicht passt, dann wird der Collider des Würfels einfach deaktiviert. Das klappt aber nur, wenn der Würfel nur auf einer Plattform landen kann, sobald 2 Plattformen aneinander grenzen können oder der Raycast nicht exakt entscheiden kann wo der Würfel landen wird, dann wird es denke ich mit dieser Methode schwierig. Du musst halt schauen was sich am besten eignet. Jede Methode hat seine Vor- und Nachteile.
  5. Das sich bewegende Objekt (Objekt 1) muss einen Rigidbody(2D) besitzen. Unity erkennt nur Kollisionen zwischen 2 Objekten mit Collidern wenn mindestens 1 Objekt davon einen RB besitzt.
  6. Besser wenn du hier die generische Typ-Parameterversion der Funktion verwendest: new AudioClip[]{Resources.Load<AudioClip>("Sounds/000"), Resources.Load<AudioClip>("Sounds/001") ...
  7. Aber aufpassen die Erde ist flach die gehen hier von falschen Tatsachen aus
  8. Hier ist ein Codeschnipsel der wohl sowas macht. Von Haus aus gib es da glaub nix: http://wirebeings.com/markerless-gps-ar.html
  9. Der Stamm des Baumes (3D-Modell) muss auf der Y-Achse liegen, vermutlich liegen deine Bäume auf X oder Z. Wenn der Baum aus Blender kommt liegt die Achse vermutlich auf Z und das muss beim Export korrigiert werden: Der Anchor des Baumes muss zudem am Boden des Stammes liegen.
  10. Ich würde mal eingie Voraussetzungen für den Algorithmus definieren (sofern ich es bisher verstanden habe): - alle Punkte müssen auf einer Ebene liegen - die Fläche sollte geschlossen sein - es sollen keine überlappenden Triangles (Dreiecke) erzeugt werden Das Problem ist jedenfalls equivalent dazu aus einer 2D-Punktwolke einen Mesh zu erstellen, dafür gibt es bestimmt schon einige existierende Algorithmen. Man kann sich natürlich auch selbst einen Algorithmus ausdenken, dass kann aber sehr aufwendig werden, da dieser auch für jeden Fall fehlerfrei funktionieren sollte. Ich würde bei einem eigenen Algorithmus etwas in der Art machen, zuerst den Rand der Punktwolke zu ermitteln (die Punkte die den Rand bilden sollen) und dann über den Rand beginnend Dreiecke zu erzeugen. Dabei werden die Punkte in der näheren Umgebung des Randes gesucht und miteinander entsprechend verbunden, dabei muss man immer darauf achten das die Dreiecke sich nicht überlappen dürfen. Die Fläche wächst dabei quasi von außen nach innen zu (wie bei einem Zellwachstum). Am Ende bleibt vermutlich ein Loch im Inneren ( = der innere Rand), dieses muss man dann am Ende nochmal mit Dreiecken füllen. Leider ist das hier nur eine sehr grobe Beschreibung des Algorithmus, es gibt bestimmt noch etliche Stolperfallen und Probleme dabei zu lösen,
  11. Ein Mesh besteht eben nicht aus Punkten, sondern aus verbundenen Vertices (Dreiecken) die im 3D-Raum liegen und zuvor definiert werden müssen. Je nachdem wie du die Vertices aus der 3D-Punktwolke definierst entstehen andere Meshes.
  12. Schau dich mal auf der Website hier um, hier sind auch Beispiele wie man einen Connect gegen deren MySQL-Servers machen kann via PHP. Der Rest ist dann eigentlich "nur noch" ein Web-Form mit Unity zu verschicken (POST Request) oder eine URL aufzurufen die gegen ein PHP-Skript geht (GET Request). Diese Seite bietet wohl auch "kostenlose" MySQL-Server an, aber ob diese zu empfehlen sind kann ich dir nicht sagen: https://remotemysql.com/tutor4.html Hier ist auch ein veraltetes Beispiel wie man die Anbindung MySQL <-> PHP <-> Unity gestalten kann. Veraltet daher, weil du vermutlich die WWW-Requests auf die neue Unity API umschreiben musst, aber man sieht generell wie das Zusammenspiel ist: http://wiki.unity3d.com/index.php?title=Server_Side_Highscores
  13. Ich denke das ist einfach nur eine UUID die Unity dem GO verpasst wenn es erzeugt wird, nicht mehr und nicht weniger.
  14. GOs haben eine Instanz-ID, bei einer eigenen Klasse musst du dich selbst darum kümmern denke ich. https://docs.unity3d.com/ScriptReference/Object.GetInstanceID.html
  15. Dann mal eine allgemeine Antwort Indem du die entsprechenden Datenbanktreiber (passend zum Datenbanktyp) in Unity einbindest (bzw. installierst) und in einer C#-Klasse die Verbindung zu der Datenbank herstellst. Über diese Verbindung können nun SQL-Statements (bei relationaler Datenbank) gegen die Datenbank ausgeführt werden, die Daten in die DB (-Tabellen) schreiben oder lesen. Die Datenbank (-Anwendung) kann dabei sowohl auf deinem PC (lokal) als auch auf einem anderen Server (remote) oder in einer Cloud (remote) laufen.
  16. Hört sich nach einem "versteckten" Projektsetting an, insofern du kein Skript in der Scene am laufen hast welches die Physik deaktiviert oder Physik-Einstellungen manipuliert. In solchen hartnäckigen Fällen würde ich das gesamte Projekt ohne Projekt-Settings und Cache neu von Unity laden lassen, du verlierst hier zwar alle Projektsettings, kannst aber die Settings vom alten Projekt per Hand nachtragen und weißt dann auch welche Settings wo geändert wurden. Vorgehensweise: 1) Mach ein Backup von deinem Projekt 2) Lösche in deinem Projekt alle Folder außer "Assets" und "Packages" 3) Lade das Projekt in Unity neu - Unity erzeugt dabei Default-Projekt-Settings und neue Cache-Dateien Sollte das Projekt danach wieder funktionieren, lag es vermutlich an einer Einstellung in den Projekt-Settings. Dabei könnte man jetzt nachträglich einen Inhaltsvergleich machen der Dateien im Folder "ProjectSettings" (Originaldateien vs. neue Dateien) um herauszufinden welches Setting es genau war. Tippen würde ich auf "DynamicsManager.asset" hier sind alle 3D-Physik-Settings hinterlegt (oder "Physics2DSettings.asset" für 2D).
  17. Hier ein kleines Beispiel, da ich mir auch nicht sicher bin was du genau machen willst: Das Code-Snippet sucht alle GOs in der Szene und packt die GOs in ein Dictionary dessen Name mit "Testname" beginnt. (man sollte das nur in der Start-Methode oder so machen) Dictionary<string, GameObject> allGameObjects = new Dictionary<string, GameObject>(); Object[] objects = FindObjectsOfType(typeof(GameObject)); foreach (GameObject go in objects) { if (go.name.StartsWith("Testname")) allGameObjects.Add(go.name, go); } Dieses Dictionary könntest du nun z.B. in einer Event-Methode wie folgt werden: private void OnTriggerEnter(Collider other) { if (allGameObjects.ContainsKey(other.gameObject.name)) { ... } }
  18. Zieh das Script hier auf dein Sprite und ergänze noch das Laden deiner Szene (siehe Kommentar). Es fügt automatisch noch einen 2D-Trigger-Collider dem Sprite hinzu da hierüber die Mauseingaben getriggert werden. using UnityEngine; // TriggerMouse requires the GameObject to have a BoxCollider2D component [RequireComponent(typeof(BoxCollider2D))] public class TriggerMouse : MonoBehaviour { private void Awake() { BoxCollider2D boxCollider = GetComponent<BoxCollider2D>(); boxCollider.isTrigger = true; } void OnMouseDown() { Debug.Log("Sprite " + gameObject.name + " was pressed."); // Lade deine Scene hier // SceneManager.LoadScene("deineScene"); } }
  19. Im Model Import-Fenster auf den Tab Animation: Bei der Animation dann Haken rein bei "Look Time" bzw. "Loop Pose" Die grünen Kreise (= ok) zeigen an, ob die Frames für den Loop korrekt gesetzt sind.
  20. Mal ein Videowunsch von mir. Könntest du mal ein Video machen (oder mehrere) für einen totalen Blender-Änfänger mit folgendem Inhalt: - Erklärung der verschiedenen Version - Installation - UI-Basics, also Menüpunkte oder Tastenkürzel die man immer wieder braucht (Einstellung aller UI-Fenster) - Erklärung wichtiger Operationen - Erstellung einiger simpler Geometrie: Treppen, Wände, kleines Haus, Fässer, Felsen (einfache Geometrie die man in einem Spiel so braucht, muss ja nicht gleich ein ganzes Schloss sein) - Texturing, UV-Mapping einzelner einfacher Objekte - Erstellung eines Texturatlas für X-Objekte
  21. Schönes Video, dieses Tool kannst ich noch nicht, warum deaktivierst du sRGB im Diffuse-Slot?
  22. Zer0Cool

    Trigger erkennen

    Wenn dein Gegner einen non-Trigger-Collider (+ Rigidbody) besitzt und das Schwert (mit Cinematic-Rigidbody-Trigger-Collider) trifft diesen Gegner dann wird beim Gegner: - OnTriggerXXX() aufgerufen - OnCollisionXXX() wird nicht aufgerufen Über den übergebenen Collider solltest du nun das GameObject (name oder tag oder script-component) ganz normal auslesen können und prüfen ob es das Schwert gewesen ist.
  23. Schönes Ding, dann setz ich da doch mal ein Kommentar drunter damit der Algorithmus es findet
  24. Falls es jemand gebrauchen kann, hier eine kleine Klasse die den Spieler mehrere zuvor zugewiesene Ziele betrachten lässt. Der Spieler dreht dabei seinen Körper und seinen Kopf in Richtung des Ziels welches am besten mit seiner Sichtlinie übereinstimmt. Die Distanz des Ziels wird dabei ebenfalls mit betrachtet, allerdings nur sehr rudimentär. Ich habe noch zusätzlich eingebaut, dass der Spieler seinen rechten Arm in Richtung des aktuellen Ziels bewegt (lässt sich deaktivieren über eine Property). using UnityEngine; using System; using System.Collections; [RequireComponent(typeof(Animator))] public class IKControl : MonoBehaviour { public Transform[] lookObj = null; public float weightDamping = 1.5f; public float maxDistance = 10f; public bool RightHandToTarget = true; private Animator animator; private Transform lastPrimaryTarget; private Quaternion savedRotation; private float lerpEndDistance = 0.1f; private float finalLookWeight = 0; private bool transitionToNextTarget = false; void Start() { animator = GetComponent<Animator>(); } // Callback for calculating IK void OnAnimatorIK() { if (lookObj != null) { Transform primaryTarget = null; float closestLookWeight = 0; // Here we find the target which is closest (by angle) to the players view line foreach (Transform target in lookObj) { Vector3 lookAt = target.position - transform.position; lookAt.y = 0f; // Filter out all objects that are too far away if (lookAt.magnitude > maxDistance) continue; // Find best matching object to the players view line float dotProduct = Vector3.Dot(new Vector3(transform.forward.x, 0f, transform.forward.z).normalized, lookAt.normalized); float lookWeight = Mathf.Clamp(dotProduct, 0f, 1f); if (lookWeight > closestLookWeight) { closestLookWeight = lookWeight; primaryTarget = target; } } if (primaryTarget != null) { if ((lastPrimaryTarget != null) && (lastPrimaryTarget != primaryTarget) && (finalLookWeight > 0f)) { // Here we start a new transition because the player looks already to a target but // we have found another target the player should look at transitionToNextTarget = true; } } // The player is in a neutral look position but has found a new target if ((primaryTarget != null) && !transitionToNextTarget) { lastPrimaryTarget = primaryTarget; finalLookWeight = Mathf.Lerp(finalLookWeight, closestLookWeight, Time.deltaTime * weightDamping); float bodyWeight = finalLookWeight * .75f; animator.SetLookAtWeight(finalLookWeight, bodyWeight, 1f); animator.SetLookAtPosition(primaryTarget.position); if (RightHandToTarget) { Vector3 relativePos = primaryTarget.position - transform.position; Quaternion rotationtoTarget = Quaternion.LookRotation(relativePos, Vector3.up); animator.SetIKRotationWeight(AvatarIKGoal.RightHand, finalLookWeight); animator.SetIKRotation(AvatarIKGoal.RightHand, rotationtoTarget); animator.SetIKPositionWeight(AvatarIKGoal.RightHand, finalLookWeight* 0.5f * closestLookWeight); animator.SetIKPosition(AvatarIKGoal.RightHand, primaryTarget.position); } } // Let the player smoothly look away from the last target to the neutral look position if ((primaryTarget == null && lastPrimaryTarget != null) || transitionToNextTarget) { finalLookWeight = Mathf.Lerp(finalLookWeight, 0f, Time.deltaTime * weightDamping); float bodyWeight = finalLookWeight * .75f; animator.SetLookAtWeight(finalLookWeight, bodyWeight, 1f); animator.SetLookAtPosition(lastPrimaryTarget.position); if (RightHandToTarget) { Vector3 relativePos = lastPrimaryTarget.position - transform.position; Quaternion rotationtoTarget = Quaternion.LookRotation(relativePos, Vector3.up); animator.SetIKRotationWeight(AvatarIKGoal.RightHand, finalLookWeight); animator.SetIKRotation(AvatarIKGoal.RightHand, rotationtoTarget); animator.SetIKPositionWeight(AvatarIKGoal.RightHand, finalLookWeight*0.5f * closestLookWeight); animator.SetIKPosition(AvatarIKGoal.RightHand, lastPrimaryTarget.position); } if (finalLookWeight < lerpEndDistance) { transitionToNextTarget = false; finalLookWeight = 0f; lastPrimaryTarget = null; } } } } }
×
×
  • Create New...