2017-09-12 2 views
0

Wenn der Spieler schießt, fliegt die Kugel in die Mitte des Bildschirms. Aber wenn der Spieler zu nahe an einem Objekt bleibt, trifft die Kugel nicht in der Mitte, weil sie von der Waffe auf der rechten Seite des Bildschirms fliegt. Wie kann ich das beheben?Kugel trifft das Objekt nicht in der Mitte des Bildschirms

public Rigidbody projectile; 
public int speed = 50; 
public Transform startBulletPosition; 

void Update() 
{ 
    if (Input.GetButtonDown("Fire1")) 
    { 
     Rigidbody clone; 
     clone = Instantiate(projectile, startBulletPosition.position, transform.rotation) as Rigidbody; 
     var centre = new Vector3(0.5f, 0.5f, 0f); 
     var ray = Camera.main.ViewportPointToRay(centre); 
     clone.velocity = ray.direction * speed; 
    } 
} 

enter image description here

+0

Da Sie Ihre Kugel nicht in der Mitte spawnen, können Sie ** Raycast ** versuchen, um zu sehen, ob ein Objekt vor Ihnen liegt. Wenn ja, entferne den ** BulletSpawn ** Punkt und das ** Objekt davor **. Berechnen Sie den Winkel für das Geschoss, um das Zentrum zu treffen. Benutze es in deiner ** Verwandlung ** – Thalthanas

+1

Warst du schon einmal in einer Schießstätte? Ich würde dieses Verhalten völlig erwarten, wenn ich gezwungen wäre, meine Waffe so zu halten (oder wenn sie exzentrisch auf etwas montiert ist). – Fildor

Antwort

2
public Rigidbody projectile; 
public Transform startBulletPosition; 
public float speed; 
public float rotationSpeed; 
public Camera camera; 

Vector3 startingDirection; 

void Start() { 

    startingDirection = startBulletPosition.transform.forward; 

} 

void Update() { 

    if (Input.GetButtonDown("Fire1")) { 

     RaycastHit hit; 
     Vector3 targetDirection; 

     if (Physics.Raycast(Camera.main.transform.position, camera.transform.forward, out hit)){ 

      targetDirection = hit.transform.position - startBulletPosition.position; 

     } else { 

      targetDirection = startingDirection; 
     } 

     Vector3 newDirection = Vector3.RotateTowards(startBulletPosition.transform.forward, targetDirection, rotationSpeed * Time.deltaTime, 0.0f); 
     startBulletPosition.transform.forward = newDirection; 

     Rigidbody clone; 
     clone = Instantiate(projectile, startBulletPosition.position, startBulletPosition.rotation) as Rigidbody; 
     clone.velocity = targetDirection * speed; 

    } 

} 

ich eine Raycast von der Kameraposition tun würde, um zu sehen, was Sie und dann die Waffe zu dieser Richtung drehen treffen können. Wie in meinem Beispielcode. Die Waffe zeigt genau auf den Mittelpunkt der Kamera, auf den Raycast deiner Kamera trifft.

Auch Sie können die maximale Umdrehungsgeschwindigkeit von diesem öffentlichen Schwimmer steuern. Dies wird für eine schöne Waffenbewegung sorgen und nicht nur für spontane Sprünge.

Hier sind die Doku Links von dem, was ich in diesem Code-Schnipsel verwendet: https://docs.unity3d.com/ScriptReference/RaycastHit.html https://docs.unity3d.com/ScriptReference/Vector3.RotateTowards.html

Wenn die Raycast Misses, die gespeicherte ursprüngliche Richtung der Waffe verwendet werden. (Angenommen, startBulletPosition ist die Transformation der Waffe ...)

Wenn Sie möchten, können Sie den Physics.Raycast-Aufruf den maxDistance-Parameter hinzufügen, um die Entfernung zu begrenzen, auf der dieses Verhalten aktiv ist.

Verwandte Themen