Jump to content
Unity Insider Forum

Unity 2D Arm Rotation Probleme (C#)


ZerricK

Recommended Posts

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

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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...