2017-07-02 9 views
0

のは、私がオブジェクトがあるとしましょう:AddForce

  • オブジェクトA:プレーヤー(ファーストパーソン)
  • オブジェクトB:ボール(たとえばサッカーボール)

ヒットボール私が見ている方向で、それが現実的に行動するような現実的な物理学を与えたいと思います。それが唯一の「Z」の方向に行く何らかの理由

using UnityEngine; 
using System.Collections; 

public class KickScript : MonoBehaviour 
{ 

    public float bounceFactor = 0.9f; // Determines how the ball will be bouncing after landing. The value is [0..1] 
    public float forceFactor = 10f; 
    public float tMax = 5f; // Pressing time upper limit 


    private float kickForce; // Keeps time interval between button press and release 
    private Vector3 prevVelocity; // Keeps rigidbody velocity, calculated in FixedUpdate() 

    void Update() 
    { 


     if (Input.GetMouseButtonDown(0)) 
     { 
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
      RaycastHit hit; 
      if (Physics.Raycast(ray, out hit)) 
      { 
       if (hit.collider.name == "Ball") // Rename ball object to "Ball" in Inspector, or change name here 
        kickForce = Time.time; 
      } 
     } 
    } 

    void FixedUpdate() 
    { 

     if (kickForce != 0) 
     { 
      float angle = Random.Range(0, 20) * Mathf.Deg2Rad; 
      GetComponent<Rigidbody>().AddForce(new Vector3(0.0f, forceFactor * Mathf.Clamp(kickForce, 0.0f, tMax) * Mathf.Sin(angle), forceFactor * Mathf.Clamp(kickForce, 0.0f, tMax) * Mathf.Cos(angle)), ForceMode.VelocityChange); 
      kickForce = 0; 
     } 
     prevVelocity = GetComponent<Rigidbody>().velocity; 

    } 

    void OnCollisionEnter(Collision col) 
    { 
     if (col.gameObject.tag == "Ground") // Do not forget assign tag to the field 
     { 
      GetComponent<Rigidbody>().velocity = new Vector3(prevVelocity.x, -prevVelocity.y * Mathf.Clamp01(bounceFactor), prevVelocity.z); 
     } 
    } 
} 

:これは私が(これは、単にテストのために多かれ少なかれあるコードはとても混沌に見える理由です)、これまでに得たものである

答えて

0

希望の効果を得るには、x方向に力を加えなければなりません。これは、あなたの力が

Vector3 direction = new Vector3(Mathf.Cos(angle), 0f, Mathf.Sin(angle)); 
Vector3 force = direction * forceFactor * Mathf.Clamp(kickForce, 0.0f, tMax); 
GetComponent<Rigidbody>().AddForce(force, ForceMode.VelocityChange); 

あなたの角度は、あなたの力が適用されるには、y軸周りの回転になります。この道のようなものに適用するラインを変更することで行うことができます。また、y軸上のボールの上向きの力を決定する必要があります。上のコードスニペットでは、これを0に設定しました。

関連する問題