2017-09-08 5 views
2

私はUnity3dで無限のランナーゲームを開発しています。私はジャンプするキャラクターを作りました。そうすることで、ユニティのカーブフィーチャーを使用して、ジャンプ中にキャラクターの高さと中心を変更しました。Unityでキャラクターがジャンプする際の重力を無効にする方法は?

私はこの問題を遭遇しました。ジャンプボタンを押すと、上向きの推力や物理がないようにアニメーションクリップを実行します。単に、コライダーの高さと中心点を減らしています。しかし、そうすることで、最終的に私の性格が落ちるので、私は重力を実装しているので、私の性格は下がる傾向があります。

私が重力をかかえたくないのは、私がジャンプしているとき(ジャンプアニメーションが実行中のとき)だけです。どうすればいいの?または、このエラーを解決する方法に関するアドバイス?

以下は私がジャンプのために実装したコードです。

private float verticalVelocity; 
public float gravity = 150.0f; 
private bool grounded = true; 
private bool jump = false; 
private float currentY; 

private Animator anim; 
private AnimatorStateInfo currentBaseState; 

private static int fallState = Animator.StringToHash("Base Layer.Fall"); 
private static int rollState = Animator.StringToHash("Base Layer.Roll"); 
private static int locoState = Animator.StringToHash("Base Layer.Run"); 
private static int jumpState = Animator.StringToHash("Base Layer.Jump"); 

void Update() 
    { 
     currentY = verticalVelocity * Time.fixedDeltaTime; 

     currentBaseState = anim.GetCurrentAnimatorStateInfo(0); 


     grounded = true; 

     if (isGround() && currentY < 0f) 
     { 
      verticalVelocity = 0f; 
      currentY = 0f; 
      grounded = true; 
      jump = false; 
      fall = false; 

      if (currentBaseState.fullPathHash == locoState) 
      { 

       if (Input.GetButtonDown("Jump") && grounded && currentY == 0f) 
       { 

        grounded = false; 
        jump = true; 
        verticalVelocity = 0f; //I have tried here to stop gravity but don't work 
        follower.motion.offset = new Vector2(follower.motion.offset.x, verticalVelocity); 
       } 
      } 
      else if (currentBaseState.fullPathHash == jumpState) 
      { 
       Debug.Log("Jumping state"); 
       collider.height = anim.GetFloat("ColliderHeight"); 
       collider.center = new Vector3(0f, anim.GetFloat("ColliderY"), 0f); 
      } 
     } 
     else if (jump) 
     { 
      follower.motion.offset = new Vector2(follower.motion.offset.x, 0.0f); //I have tried here to stop gravity but don't work 
     } 
     else 
     { 
      grounded = false; 
      jump = false; 
      fall = true; 


     } 


     anim.SetBool("Grounded", grounded); 
     anim.SetBool("Jump", jump); 
     anim.SetBool("Fall", fall); 


     if (fall) 
     { 
      if (currentBaseState.fullPathHash == fallState) 
      { 
       Debug.Log("falling"); 
       collider.height = anim.GetFloat("ColliderHeight"); 
       collider.center = new Vector3(0f, anim.GetFloat("ColliderY"), 0f); 
      } 

     } 
     else 
     { 
      if (currentBaseState.fullPathHash == rollState) 
      { 
       Debug.Log("Roll"); 
       collider.height = anim.GetFloat("ColliderHeight"); 
       collider.center = new Vector3(0f, anim.GetFloat("ColliderY"), 0f); 
      } 
     } 

     MoveLeftRight(); 

     verticalVelocity -= gravity * Time.fixedDeltaTime; 

     follower.motion.offset = new Vector2(follower.motion.offset.x, currentY); 

     Z - Forward and Backward 

     follower.followSpeed = speed; 
    } 

答えて

1

下では、プログラム的にシーンの重力を無効にするには、使用することができますシーンで

if(isGrounded) 
{ 
    Physics.gravity = new Vector3(0, -9.8f, 0); 
}else{ 
    //Here the value you prefer 
    Physics.gravity = new Vector3(0, -0.1f, 0); 
} 

しかし、このアプローチには他の要素でしょう重力にも影響されず、あなたがこれを望むかどうかはわかりません。

rb = GetComponent<Rigidbody>(); 
rb.useGravity = false; 

そして、別のオプション(私はmyelfを試したことがない)、この次のとおりです:重力の力を補うためにゲームオブジェクトの上に力を加えるので、あなたが書くことができ、特定のゲームオブジェクトの比重を無効にする

(y軸に-9.8fすべき)一定の力で

void Start() 
{ 
    rb = GetComponent<Rigidbody>(); 
} 

void FixedUpdate() 
{ 
    rb.AddForce(transform.down * 9.8f); 
} 

または多分:

GetComponent<ConstantForce>().force = new Vector3(0, 9.8f, 0); 

https://docs.unity3d.com/Manual/class-ConstantForce.html

+0

ありがとうこれはたくさん説明します。私は何ができるかを見ていきます。ありがとう@イグナシオ・アローレ!. –

0

文字オプションの中で、オブジェクトを選択するときに物理オプションを無効にする必要があります。

編集:rigidbody.useGravity

https://docs.unity3d.com/ScriptReference/Rigidbody-useGravity.html

+0

こんにちは、私は剛体を使用していません。なぜなら、私はコードとプラグインを持っていないからです。私は重力を自分でここに実装しました。 –

+0

飛び越し状態に入ったときに重力変数を0.0fに設定できますか、接地しているか落ちているときに150.0fに戻すことができますか? –

+0

私はそれを正確に実行すべきですか、それをどのように実装するべきですか?途中でも動作します。ジャンプアニメーションがクリップの最後に貼り付けられます。 –

関連する問題