Jump to content
Unity Insider Forum

Zer0Cool

Members
  • Posts

    2,040
  • Joined

  • Last visited

  • Days Won

    145

Zer0Cool last won the day on September 14 2020

Zer0Cool had the most liked content!

1 Follower

About Zer0Cool

  • Birthday 01/04/1974

Profile Information

  • Gender
    Male
  • Location
    Germany

Contact Methods

  • Skype
    zer0f0rce

Recent Profile Visitors

10,651 profile views

Zer0Cool's Achievements

Advanced Member

Advanced Member (3/3)

416

Reputation

  1. Schaut mir nach einem Kameraproblem aus ... evtl. hat deine Kamera sein Target (Spieler) nicht gefunden oder irgend ein Skript (welches die Kamera verwendet) hat die Kamera nicht gefunden .. und daher (wie Sascha schon meinte) ggf. eine Null-Pointer-Exception geworfen. Schau dir am besten mal alle Codeteile an die etwas mit der Kamera machen und baue dort Log-Ausgaben ein, vor allem auch die Stellen in denen die Kamera auf das Ziel positioniert bzw. initialisiert wird. Um "Logausgaben" auch im Build sehen zu können kannst du beispielsweise anstelle von "Debug.Log" diese Klasse hier verwenden: http://wiki.unity3d.com/index.php?title=DebugConsole
  2. Ich spiele gerade ein MMORPG das mit TPC programmiert wurde und die Netzwerkperformance ist unterirdisch und ich führe das zu großen Teilen auf TCP zurück. Vor allem in Raids gibt es hier massive FPS-Probleme, also wenn X Spieler in einer Gruppe kämpfen. Meine Vermutung ist dadurch das TCP sich alle Pakete bestätigen lässt steigt die Netzwerklast (und die CPU-Last) mit der Anzahl der Spieler extrem an, vor allem wenn viele kleine Pakete pro Sekunde verschickt werden (was normalerweise bei solchen Spielen der Fall ist). Kurzum ich denke bei Spielen die eine gewisse Anzahl von Spielern in einem "Raum" nicht überschreiten bzw. eine gewissen Menge an Paketen pro Sekunde nicht überschritten wird ist TPC gut, da leicht zu implementieren.. geht es aber um eine komplexe Kommunikation zwischen mehreren Spielern (wie oft in ein einem MMORPG Raid) kann ich TCP nicht empfehlen.
  3. Schwer zu analysieren ohne alle Komponenten zu kennen. Meine Vermutung ist mal. dass die Animation des Sprites den RB in den Collider den Blocks drückt. Also mal prüfen wie der Code sich verhält wenn du alle Stellen wo die Animationen getriggert werden ausschaltest : // alle Stellen mit anim.xxx // anim.SetBool Sollte der Controller danach nicht mehr hängen und funktionieren, dann solltest du die Root-Motions der Animationen entfernen, weil der Controller sollte entweder über den RB (Physic-Based -Driven) oder über die Root-Animations (Animation-Driven) betrieben werden, beides zusammen könnte Probleme machen.
  4. Kommt auf die Implementierung des Controllers an, bei der Verwendung von Root-Animations rennt / bewegt sich der Spieler aufgrund der Animation.
  5. 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.
  6. 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".
  7. 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.
  8. 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
  9. Schönes Video, dieses Tool kannst ich noch nicht, warum deaktivierst du sRGB im Diffuse-Slot?
  10. Schönes Ding, dann setz ich da doch mal ein Kommentar drunter damit der Algorithmus es findet
  11. 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; } } } } }
  12. Ich hatte die Punkte und Linien so "gemalt" und den Quellcode unterschlagen, da es quick und dirty war, aber wenn es dir hilft. Diese Klasse an den 2D-Collider hängen der die Collision bekommt (die Gizmos siehst du nur im Sceneview). Wenn gerade keine Collision stattfindet zeichnet er trotzdem die letzte Collision. using System.Collections; using System.Collections.Generic; using UnityEngine; public class DrawCollider2D : MonoBehaviour { private List<Vector3> contactPoints; private List<Vector3> normalPoints; void OnCollisionEnter2D(Collision2D collision) { contactPoints = new List<Vector3>(); normalPoints = new List<Vector3>(); ContactPoint2D[] contactPoint2d = collision.contacts; foreach (ContactPoint2D cPoint in contactPoint2d) { contactPoints.Add(cPoint.point); normalPoints.Add(cPoint.normal); } } void OnDrawGizmosSelected() { if (contactPoints != null) { Gizmos.color = Color.blue; foreach (Vector3 cPoint in contactPoints) { Gizmos.DrawWireSphere(cPoint, 0.02f); } } if (normalPoints != null) { Gizmos.color = Color.red; int i = 0; foreach (Vector3 nPoint in normalPoints) { Gizmos.DrawLine(contactPoints[i], contactPoints[i] + nPoint); i++; } } } }
  13. Wenn du die Kontaktpunkte und die Normalen-Vektoren bei einer Kollision ausliest, dann sieht das in etwa so aus. An der Richtung der (beiden) Normalenvektoren kannst du also erkennen, auf welcher Seite des Box-Colliders die Kollision stattgefunden hat (wie Sascha schon geschrieben hatte). (rot = Normalenvektoren / blau = Kollisionspunkte / grün Boxcollider)
  14. Schau mal ob das Windows-Form oder Formular folgende Eigenschaft hat. Diese Eigenschaft sollte das Formular permanent im Vordergrund halten. this.TopMost = true;
×
×
  • Create New...