2017-09-12 6 views
0

プレーヤーが撮影すると、弾丸が画面の中央に飛びます。しかし、プレイヤーが何らかのオブジェクトに近づき過ぎると、画面の右側にあるガンから飛んでくるため、弾丸が中央には当たらない。これをどうすれば解決できますか?弾丸が画面中央にないオブジェクトに当たる

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

センターに弾丸を発射していないため、** Raycast **を試して、オブジェクトがあなたの前にいるかどうかを確認することができます。もしそうなら、** BulletSpawn **ポイントと**オブジェクトの間の距離を取得します**。弾丸が中心に当たる角度を計算します。あなたの**変形でそれを使用してください** – Thalthanas

+1

これまでに実際の撮影範囲に行ったことがありますか?私はそのような(または何かにexcentricにマウントされている場合)私の銃を保持することを余儀なくされた場合、私は完全にその動作を期待したい。 – Fildor

答えて

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; 

    } 

} 

私はあなたがヒットし、その方向に武器を回転させることができるものを見るためにカメラ位置からレイキャストを行うだろう。私の例コードのように。武器はあなたのカメラRaycastが狙うものを正確にCenter Viewに指します。

また、最大のターン数をそのフロートで制御することもできます。これは瞬時のジャンプだけでなく、素晴らしい武器の動きにも役立ちます。ここで

が、私はこのスニペットで使用されるもののドキュメンタリーリンクは以下のとおりです。 https://docs.unity3d.com/ScriptReference/RaycastHit.html ​​

レイキャストミスした場合、武器の保存された元の方向が使用されます。

maxBistanceパラメータをPhysics.Raycast呼び出しに追加して、この動作が有効な距離を制限することができます。

関連する問題