ZerricK Geschrieben 14. September 2016 Melden Share Geschrieben 14. September 2016 Abend, ich hab ein Problem in Unity 2D mit der Rotation, also wenn ich mit der Maus nach Links und Rechts gucke soll der Spieler mit der Waffe nach der Richtung schauen. Ich hab alles gemacht doch ich hab ein Problem wenn die Maus in der Mitte vom Spieler ist dreht der Spieler durch, also er guckt sofort Links rechts usw. (Das Video in 720P anschauen da man es nur in 60FPS sehen kann) Ich hab schon alles Probiert damit es geht aber es funktioniert nicht darum wollte ich euch mal fragen. using UnityEngine; using System.Collections; public class WeaponRotation : MonoBehaviour { public int rotationOffset = 90; public LayerMask whatToHit; public Transform firePoint; public GameObject bullet; public float rotZ; private AudioSource audio; private CameraFollow camFollow; public AudioClip shot; public float speed; private Player player; void Start() { player = GameObject.FindGameObjectWithTag("Player").GetComponent<Player>(); audio = GameObject.FindGameObjectWithTag("Player").GetComponent<AudioSource>(); camFollow = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<CameraFollow>(); } void Update () { Vector3 difference = Camera.main.ScreenToWorldPoint (Input.mousePosition) - transform.position; difference.Normalize (); //Debug.Log(difference.x); rotZ = Mathf.Atan2 (difference.y, difference.x) * Mathf.Rad2Deg; if (difference.x > 0) { player.transform.localScale = new Vector2(1, 1); } if (difference.x < -0) { player.transform.localScale = new Vector2(-1, 1); } if (player.transform.localScale.x < 0) { rotZ = -rotZ + 180; } else { rotZ = rotZ; } transform.rotation = Quaternion.Euler (0f, 0f, rotZ + rotationOffset); if (Input.GetMouseButtonDown(0)) { Shoot(); camFollow.ShakeCamera(0.09f, 0.7f); } } void Shoot() { Vector2 mousePosition = new Vector2 (Camera.main.ScreenToWorldPoint (Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y); Vector2 firePointPosition = new Vector2 (firePoint.position.x, firePoint.position.y); Vector2 direction = (mousePosition - firePointPosition).normalized; RaycastHit2D hit = Physics2D.Raycast (firePointPosition, mousePosition-firePointPosition, 100, whatToHit); Vector2 raycastDir = hit.point; Debug.DrawLine (firePointPosition, (mousePosition-firePointPosition)*100, Color.cyan); GameObject clone = (GameObject)Instantiate(bullet, firePoint.position, firePoint.rotation);//clone.GetComponent<Rigidbody2D>().velocity = mousePosition * 4; clone.GetComponent<Rigidbody2D>().AddForce(direction * speed); audio.PlayOneShot(shot); } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 15. September 2016 Melden Share Geschrieben 15. September 2016 Ich habe den Code jetzt nicht völlständig nachvollzogen aber ich vermute das Problem liegt an dem zu "harten" Übergang: Ist-Zustand: Du hast ja 2 Zonen definiert: | Left Zone | | Right Zone | Player und die Maus befindet sich bei dir entweder in der linken oder in der rechten Zone. Eine Lösung könnte daher so aussehen: | Left Zone | | Dead Zone| | Right Zone | Player Wenn die Maus sich nun innerhalb der Deadzone (toten Zone) befindet,dann ändert sich an dem Zustand des Spielers nichts. Damit sollte sich das Flackern verhindern lassen. Probier es mal aus. Für die Deadzone definierst du dabei ein bestimmte Breite, die noch einen schnellen Richtungswechsel zulässt, es aber (noch) nicht zu einem Flackern kommt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
ZerricK Geschrieben 15. September 2016 Autor Melden Share Geschrieben 15. September 2016 Ich habe den Code jetzt nicht völlständig nachvollzogen aber ich vermute das Problem liegt an dem zu "harten" Übergang: Ist-Zustand: Du hast ja 2 Zonen definiert: | Left Zone | | Right Zone | Player und die Maus befindet sich bei dir entweder in der linken oder in der rechten Zone. Eine Lösung könnte daher so aussehen: | Left Zone | | Dead Zone| | Right Zone | Player Wenn die Maus sich nun innerhalb der Deadzone (toten Zone) befindet,dann ändert sich an dem Zustand des Spielers nichts. Damit sollte sich das Flackern verhindern lassen. Probier es mal aus. Für die Deadzone definierst du dabei ein bestimmte Breite, die noch einen schnellen Richtungswechsel zulässt, es aber (noch) nicht zu einem Flackern kommt. Hab ich schon versucht, aber das wird am ende einfach ignoriert, ich weiß nicht warum. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
ZerricK Geschrieben 15. September 2016 Autor Melden Share Geschrieben 15. September 2016 Ich glaube ich hab es gelöst. if (difference.x > 0.03) player.transform.localScale = new Vector2(1, 1); } if (difference.x < -0.03) { player.transform.localScale = new Vector2(-1, 1); } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 16. September 2016 Melden Share Geschrieben 16. September 2016 Ja das meinte ich ja mit der "Deadzone", die ist bei dir nun 0.06 groß. Ich weiß aber immer noch nicht, warum du vor der Rotation die lokale Postion des Spielers verschiebst, ich vermute, daß ist unnötig. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
ZerricK Geschrieben 16. September 2016 Autor Melden Share Geschrieben 16. September 2016 Ja das meinte ich ja mit der "Deadzone", die ist bei dir nun 0.06 groß. Ich weiß aber immer noch nicht, warum du vor der Rotation die lokale Postion des Spielers verschiebst, ich vermute, daß ist unnötig. Damit der Spieler nach links und rechts guckt^^ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.