2016-09-09 27 views
0

私がGameObjectを飛ばしたときに問題が発生しました。私はプレイヤーとグラウンドを作った。プレイヤーは地上で走り、私はショートタッチ、プレイヤーは通常のジャンプとロングタッチ、プレイヤーは高いジャンプします。しかし、PlayerがGroundに触れたときにPlayerがジャンプしないことがあります。私はこの問題が重力またはプレーヤーの質量に関係していると思った。 Unity 2d Platformで行われたこのゲーム。 このコードを参照してください(プレーヤーコード):Unity 2Dでジャンプする

using UnityEngine; 
using System.Collections; 
using UnityEngine.Events; 
using UnityEngine.EventSystems; 
using UnityEngine.UI; 

public class HeroRun : MonoBehaviour{ 


    public static HeroRun instance; 

    //public float force; 
    //private bool isRacePressed = false; 
    public bool isTouchEnemy = false; 
    public Rigidbody2D myBody; 
    public bool touchGround = false; 
    //private float mouseTime = 0; 

    private float timeLongTouch = 0.2f; 
    private float timeTouchBegan; 
    public float jumpForce; 
    public float highJumpForce; 


    int coin = 0; 

    void Awake(){ 
     myBody = GetComponent<Rigidbody2D>(); 



    } 
    // Use this for initialization 
    void Start() { 
     MakeSingleInstance(); 
    } 

    // Update is called once per frame 
    void FixedUpdate() { 
     #if UNITY_EDITOR 
     Editor(); 
     #elif UNITY_IPHONE 
     Iphone(); 
     #endif 
    } 
    void Editor(){ 
     if(Input.GetMouseButtonDown(0) && touchGround){ 
      myBody.velocity = 
       new Vector2 (myBody.velocity.x, highJumpForce*Time.deltaTime); 
      touchGround = false; 
     } 
    } 
    void Iphone(){ 
     if (touchGround && !isTouchEnemy) { 
      //Debug.Log (Time.time); 
      if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Began) { 
       timeTouchBegan = Time.time; 
      } 
      if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Stationary) { 
       if (Time.time - timeTouchBegan >= timeLongTouch) { 
        myBody.velocity = 
         new Vector2 (myBody.velocity.x, highJumpForce*Time.deltaTime); 
        touchGround = false; 
       } 
      } 
      if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Ended) { 
       if (Time.time - timeTouchBegan < timeLongTouch) { 
        myBody.velocity = 
         new Vector2 (myBody.velocity.x, jumpForce * Time.deltaTime); 
        touchGround = false; 
       } 
      } 
     } 
    } 
    void MakeSingleInstance(){ 
     if (instance == null) { 
      instance = this; 
     } 
    } 
    void OnCollisionEnter2D (Collision2D target){ 
     if (target.gameObject.tag == "Ground") { 
      touchGround = true; 
     } 
    } 
    void OnCollisionExit2D(Collision2D target){ 
     if (target.gameObject.tag == "Ground") { 
      touchGround = false; 
     } 
    } 
    void OnCollisionStay2D(Collision2D target){ 
     if (target.gameObject.tag == "Ground") { 
      touchGround = true; 
     } 
    } 
// void OnTriggerExit2D(Collider2D target){ 
//  if (target.tag == "Ground") { 
//   touchGround = false; 
//  } 
// } 
    void OnTriggerEnter2D(Collider2D target){ 
//  if (target.tag == "Ground") { 
//   touchGround = true; 
//  } 
     if (target.tag == "Coins") { 
      coin++; 
      GameController.instance.coinText.text = "" + coin; 
      Destroy (target.gameObject); 
     } 
     if (target.tag == "SlowEnemy") { 

      isTouchEnemy = true; 
      StartCoroutine ("SlowSpeedForSlowEnemy"); 
     } 
     if (target.tag == "JumpEnemy") { 
      Debug.Log ("Em chỉ vào đây 1 lần"); 
      //myBody.AddForce (new Vector2(0, 900f)); 
      myBody.velocity = new Vector2(myBody.velocity.x, 900f * Time.deltaTime); 
      isTouchEnemy = true; 
      //StartCoroutine (NormalRun (.25f)); 
     } 
     if (target.tag == "FallEnemy") { 
      GroundController.instance.speed = 5f; 
      BGController.instance.speeds = 2f; 
      isTouchEnemy = true; 
      StartCoroutine (NormalRun (.2f)); 
     } 
    } 
    IEnumerator SlowSpeedForSlowEnemy(){ 
     yield return new WaitForSeconds (0.1f); 
     BGController.instance.speeds = 2/5f; 
     GroundController.instance.speed = 1f; 
     StartCoroutine ("DisableIsTouchEnemy"); 
     StartCoroutine ("GrowSpeedForSlowEnemy"); 
    } 
    IEnumerator DisableIsTouchEnemy(){ 
     yield return new WaitForSeconds (.09f); 
     isTouchEnemy = false; 
    } 
    IEnumerator GrowSpeedForSlowEnemy(){ 
     yield return new WaitForSeconds (0.05f); 
     if (BGController.instance.speeds < 3f) { 
      BGController.instance.speeds += 0.1f; 
     } 
     if (GroundController.instance.speed < 7f) { 
      GroundController.instance.speed += 0.5f; 
     } 
     if (BGController.instance.speeds >= 3f && GroundController.instance.speed >= 7f) { 
      yield break; 
     } 
     StartCoroutine ("GrowSpeedForSlowEnemy"); 
    } 
    IEnumerator NormalRun(float seconds){ 
     yield return new WaitForSeconds (seconds); 
     GroundController.instance.speed = 7f; 
     BGController.instance.speeds = 3f; 
     isTouchEnemy = false; 
    } 
} 

答えて

0

1)それがジャンプするために、オブジェクトに速度を追加するには、悪い習慣です。代わりにAddForce関数を使用してください。

2)地上タッチを検出するためにラインカードを使用してください。ラインキャストは、Colliderコールバック関数を使用するより効率的です。この記事をチェックしてくださいhttp://answers.unity3d.com/questions/610960/2d-check-if-player-is-on-the-ground.html

関連する問題