Jump to content
Unity Insider Forum

Seyshiro

Members
  • Gesamte Inhalte

    52
  • Benutzer seit

  • Letzter Besuch

Alle erstellten Inhalte von Seyshiro

  1. OK, hab die Lösung selber gefunden. Dazu habe ich in der Physics Body Component des Players (der Kapsel) den Motion Type auf dynamic gesetzt und in meinem Script in der OnStartRunning Methode ganz einfach die Trägheit auf 0 gesetzt. Das sieht ganz einfach so aus: protected override void OnStartRunning() { base.OnStartRunning(); Entities .WithAll<PlayerTag>() .ForEach((ref PhysicsMass mass) => { mass.InverseInertia = float3.zero; }).Schedule(); }
  2. Evtl. könntest du ein UI Panel erstellen, welches den gesamten Bildbereich abdeckt und dann mit der "Mask" Component arbeiten, wie in diesem Video erklärt.
  3. Gib dem Button die Component "Layout Element" und spiele ein bisschen mit der Flexible Width herum damit solltest du eigentlich den gewünschten Effekt erzielen.
  4. Aus Neugier befasse ich mich z.Z. ein bisschen mit dem Thema ECS. Als kleine Übung habe ich mir jetzt mal eine einfache Scene erstellt (wie auf dem Bild zu sehen). Alle 3 Objekte (Boden, Wand, Kapsel) besitzen eine "Physics Shape" Component, die Kapsel und die Wand besitzen zusätzlich noch eine "Physics Body" Component und die Kapsel besitzt außerdem noch ein "PlayerTag" und eine "Move Speed Data" Component, welche folgendermaßen aussieht. using Unity.Entities; [GenerateAuthoringComponent] public struct MoveSpeedData : IComponentData { public float moveSpeed; } Zusätzlich habe ich jetzt noch eine Klasse erstellt, welche dafür sorgt, dass sich die Kapsel auf Tastendruck bewegt, diese Klasse sieht so aus: using Unity.Entities; using Unity.Mathematics; using Unity.Physics; public class MovePhysics : SystemBase { private PlayerInput input = new PlayerInput(); private float2 direction; protected override void OnUpdate() { float2 moveDirection = direction; Entities .WithAll<PlayerTag>() .ForEach((ref PhysicsVelocity velocity, in MoveSpeedData moveSpeed) => { velocity.Linear = new float3(moveDirection.x * moveSpeed.moveSpeed, 0, moveDirection.y * moveSpeed.moveSpeed); }).Schedule(); } protected override void OnCreate() { base.OnCreate(); input.Controls.VerticalMove.performed += ctx => direction.y = ctx.ReadValue<float>(); input.Controls.HorizontalMove.performed += ctx => direction.x = ctx.ReadValue<float>(); input.Enable(); } protected override void OnDestroy() { base.OnDestroy(); input.Disable(); } } So nach dieser langatmigen Beschreibung nun zum eigentlichen Punkt. Ich möchte, dass die Kapsel bei Kollision mit der Wand stehen bleibt, wie es bei Playern üblich ist. Jetzt habe ich ein bisschen mit dem Motion Type im Physics Body herumgespielt, erhalte aber nie das gewünschte Ergebnis. Wenn ich den MotionType der Kapsel auf "Dynamic" setze, dann fällt sie bei der Bewegung um, wenn ich ihn auf "Kinematic" setze, kann sie nicht mehr mit der Wand kollidieren und wenn ich ihn auf "Static" setze, Bewegt sie sich nicht mehr. Ich hab auch schon überlegt, die Rotation einfach einzufrieren, damit die Kapsel beim Dynamic Motion Type nicht mehr umkippen kann, weiß aber leider nicht, wie das beim Physics Body geht. Hat zufällig jemand eine Ahnung, was die übliche Vorgehensweise ist, um dieses standardmäßige Player-rennt-Gegen-eine-Wand-und-kommt-nicht-mehr-weiter-Verhalten zu erzielen?
  5. Vielen dank für dein Feedback. Hab deine Anmerkungen gleich mal umgesetzt aber als Character war mir die kleine Unity-Chan lieber. 😊 Hier auch gleich mal das neue Video dazu. Die Bewegungen und Animationen sind leider noch nicht so ganz synchron, da ich testweise alles nur schnell Quick and Dirty zusammengebastelt habe. Weitere Kritik, Feedbacks und Ideen sind natürlich immer gerne gesehen. 😀
  6. Hi@all, hab mich die letzten paar Tage mal an ein kleines Projekt herangewagt, bei dem ein Objekt (z.B. ein Character) sich an der Oberfläche eines anderen Objekts entlang bewegen kann, unabhängig dessen Form. Hier mal ein kleines Demovideo dazu. An den Scripts muss zwar noch einiges getan werden, was usability, readability und performance angeht aber das Grundprinzip funktioniert schon ganz gut. Ich würde mich freuen, wenn ihr einen Kommentar da lasst und eure Meinung dazu schreibt. Kritik ist gerne gesehen. Dankeschön.
  7. Hi@all, ich habe mir grade eine kleine "Zeichen"-Funktion erstellt. Im Prinzip erstelle ich einfach nur einen LineRenderer und erstelle neue Punkte an der aktuellen Mausposition, wenn sie sich vom letzten gezeichneten Punkt eine gewisse Distanz entfernt hat. Dem LineRenderer habe ich eine "Corner Verticies"-Anzahl von 8 gegeben, um die Ecken etwas abzurunden. Das Problem ist nur, dass die gezeichneten Linien an den Ecken diese merkwürdigen hervorstehenden Kanten haben. Hat irgendjemand eine Idee woran das liegen könnte und wie ich das Problem beheben kann?
  8. Hi@all, hatte neulich eine kleine Idee für ein Online-RPG für Mibile-Geräte. Das Grundkonzept steht alles auch schon soweit. Dadurch dass dieses Spiel Online seien soll und Spieler in gewissem Maße auch miteinander interagieren können sollen habe ich mir nun auch einige Gedanken darüber gemacht, wie ich dieses Spiel möglichst gegen Cheater / Hacker absichern kann und bin zu folgender Lösung gekommen: Da das Spiel Online ist müssen selbstverständlich die Spieler Identifiziert werden. Daher müssen sie sich bei der Erstnutzung logischerweise registrieren und danach einloggen. Der Server sendet dann dem Game eine Session-ID mit der die Identifikation stattfindet. Nun ist es wichtig, dass alle Berechnungen, welche die Serverdaten beeinflussen (direkt oder indirekt) nicht im Game sondern auf dem Server selbst ablaufen. D.h. wenn ich z.B. in dem Spiel einen "Add Exp"-Button hätte, der dem Spieler jedes mal beim draufklicken 50 Erfahrungspunkte gibt, dann sende ich dem Server nicht die Anzahl der Erfahrungspunkte, sondern nur die Info, dass der Spieler den Button geklickt hat. Alles weitere (das hinzufügen der Exp und evtl. der Level-Up) passiert dann auf dem Server und der sendet dann die neuen Daten (Exp, Level, etc.) wieder zurück an das Game. Für den Datenaustausch wollte ich auf dem Server eine REST-API mit PHP ( +Framework) und MySQL erstellen. Die Daten würden selbstverständlich verschlüsselt übertragen werden. So... nach dieser etwas langatmigen Erklärung ist meine Frage eigentlich nur, ob das so gemacht werden kann oder ob Unity (oder vielleicht auch ein 3.-Anbieter) für so einen Fall schon selbst eine gute Lösung parat hält?
  9. OK, sowas habe ich schon befürchtet. Dann muss ich mir mal Gedanken machen, wie ich da am besten den Überblick behalte. Danke für eure antworten.
  10. Hi@all, ich bin z.Z. dabei mir für ein kleines Projekt in Unity einen Game Charcter mit mehreren Animationen in Blender zu erstellen. Nun bin ich allerdings auf ein kleines Problem gestoßen, das mich ein wenig Wurmt. Wenn ich z.B. eine Animation habe, bei der nur die Joints für die Wirbelsäule manipuliert werden müssen und bei einer weiteren Animation, nur die Joints für die Arme und Beine, dann besteht das Problem, dass nach dem Abspielen, der Arm-und-Bein-Animation die Wirbelsäulen-Animation nicht mehr in ihrer üblichen Ausgangspose ist, da die Joints für Arme und Beine ja von der anderen Animation manipuliert wurden. Jetzt wäre der simpelste Gedanke einfach der, dass ich am Anfang der Wirbelsäulen-Animation auch Keyframes für die Joints der Arme und Beine und bei der Arm-und-Bein-Animation am Anfang Keyframes für die Joints der Wirbelsäule setze damit die jeweiligen Ausgangspositionen der Joints in den einzelnen Animationen auch beibehalten werden aber ist das auch die richtige Vorgehensweise? Oder gibt es da möglicherweise eine einfachere Methode? Denn das stelle ich mir ziemlich umständlich vor, wenn man mehrere Animationen für ein Objekt hat, man dann später eine weitere Animation hinzufügen will, z.B. einen Follow-Path-Modifier für bestimmte Joints, und dann in allen anderen Animationen diese Modifier deaktivieren muss. Phu... ich hoffe ihr versteht was ich meine.
  11. Bin mir nicht ganz sicher ob das dein Problem löst aber die ersten beiden Codezeilen un deiner Start-Methode sehen so aus: string lastSavedTime = PlayerPrefs.GetString("LastRewarded"); lastRewarded = ulong.Parse(lastSavedTime.ToString()); in der 2. Zeile versuchst du lastSavedTime in einen string zu convertieren, obwohl diese Variable bereits ein string ist.
  12. Hi@all, ich bin mir leider nicht ganz sicher, ob ich hier im Bereich "Animation" richtig bin, oder ob mein Problem mehr in den Bereich "Scripting" gehört. Wie dem auch sei, ich leg einfach mal los. Im Prinzip ist mein Problem eigentlich recht schnell erklärt. Ich möchte, dass sich 2 Kreise verformen, wenn sie sich berühren, ähnlich wie wenn man 2 Gummibälle aneinander drücken würde. (Im Anhang ein Bild, welches zeigt, wie ich mir das Vorstelle.) Die Größe der Kreise und der Punkt der Kollision sind Variabel. Daher denke ich mall, dass dieser Effekt irgendwie dynamisch erzeugt werden müsste aber leider hab ich nicht mal im Ansatz einen Plan, wie ich das am besten anstelle. Hat irgendjemand eine Idee wie man das am besten umsetzen könnte?
  13. Hi@all, ich bin mir nicht sicher ob ich hier im richtigen Bereich bin, da ich nicht weiß, ob das ein Problem meines Scripts ist oder ob der Fehler irgendwo anders liegt. Am besten ich erkläre gleich mein Problem. Ich habe meiner Scene ein Sprite hinzugefügt, welches sich bei Tastendruck um eine bestimmte Achse drehen soll, dazu habe ich diesem Object eine HingeJoint2D-Component hinzugefügt (und natürlich auch nen RigidBody2D). Bei dieser Component habe ich "Use Motor" aktiviert (Motor Speed wird später per Script gesteuert) und da ich möchte, dass sich dieses Sprite nur in einem bestimmten bereich dreht habe ich auch noch "Use Limits" aktiviert und die Limits so eingestellt, wie ich sie benötige. Desweiteren habe ich dem Object noch einen PolygonCollider2D hinzugefügt. Mein Script, welches den Motor vom HingeJoit2D steuern soll sieht folgendermaßen aus: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Hinging : MonoBehaviour { public KeyCode key; public float motorSpeed; private JointMotor2D jointMotor; // Use this for initialization void Start () { jointMotor = GetComponent<HingeJoint2D>().motor; } // Update is called once per frame void Update () { if (Input.GetKey(key)) { jointMotor.motorSpeed = motorSpeed; } else { jointMotor.motorSpeed = motorSpeed * -1; } GetComponent<HingeJoint2D>().motor = jointMotor; } } Wenn ich das jetzt ausprobiere, dann muss ich die eingestellte Taste ca. 1 Sekunde lang gedrückt halten, bis das Object in der Scene auf den Tastendruck reagiert. Weiß jemand woran das liegen könnte, bzw. wie ich das Problem beheben kann? P.S.: Wenn ich den PlygonCollider2D entferne, dann reagiert das Object ohne verzögerung aber den Collider brauche ich.
  14. OK, hab jetzt die Lösung für das Problem gefunden. Wenn ich ans Ende der OnInspectorGUI-Methode noch diesen Code anhänge: if (GUI.changed) { EditorUtility.SetDirty(test); } dann funktioniert alles einwandfrei.
  15. Hi@all... ...und sorry für den verwirrenden Thementitel. Ich versuch mein Problem mal etwas genauer zu erläutern. Dazu habe ich hier erstmal ein Script vorbereitet (ja ich weiß, dass das nicht viel Sinn macht, aber das ist auch nur zur Erläuterung^^): using UnityEngine; using UnityEditor; using System.Collections; public class TestScript : MonoBehaviour { public int testVariable; } [CustomEditor(typeof(TestScript))] public class TestEditor : Editor { private TestScript test; void Awake () { test = (TestScript)target; } public override void OnInspectorGUI () { test.testVariable = EditorGUILayout.IntField("Test-Variable", test.testVariable); } } Wenn ich nun dieses Script einem Prefab aus dem Asset Bereich hinzufüge und dieses Prefab in die Hierarchy ziehe, dann kann ich zwar von beiden Objekten (sowhol aus Assets als auch aus Hierarchy) den Wert testVariable im Inspector ändern aber sobald ich das Spiel starte, ändert sich dieser Wert beim Objekt aus der Hierarchie automatisch in den Wert aus dem Assets-Object. Woran könnte das liegen und wie kann ich das unterbinden? Ich hoffe, dass mir jemand von euch helfen kann.
×
×
  • Neu erstellen...