2014-09-25 2 views
0

Я хочу создать игру, в которой я могу перемещать коробку влево и вправо, чтобы избежать падения ящиков, и это работает, но проблема в том, что когда я держу палец в одном месте, ящик игрока трясет Лево и право. Вы можете видеть это на этом gif http://gfycat.com/FragrantBrokenEyas. А вот код C# сценарийUnity android 2d motion issue

using UnityEngine; 
using System.Collections; 

public class PlayerMovement : MonoBehaviour { 
private Camera m_cam; 
private float m_offsetRight = 1.0F; 
private float m_offsetLeft = 0.0F; 


void Awake() { 
    m_cam = Camera.main; 
} 


void Update() { 
    rigidbody2D.velocity = new Vector2(0 * 10, 0); 
    Move(); 
} 


void Move() { 
    if (Application.platform == RuntimePlatform.Android) { 
     Vector3 player_pos = m_cam.WorldToViewportPoint(rigidbody2D.position); 
     Vector3 touch_pos = new Vector3(Input.GetTouch(0).position.x, 0, 0); 

     touch_pos = Camera.main.ScreenToViewportPoint(touch_pos); 

     if(touch_pos.x > player_pos.x) 
      rigidbody2D.velocity = new Vector2(1 * 10, 0); 
     else if (touch_pos.x < player_pos.x) 
      rigidbody2D.velocity = new Vector2(-1 * 10, 0); 
    } 
    else{  
     Vector3 player_pos = m_cam.WorldToViewportPoint(rigidbody2D.position); 
     float h = Input.GetAxis ("Horizontal"); 

     if (h > 0 && player_pos.x < m_offsetRight) 
      rigidbody2D.velocity = new Vector2(h * 10, 0); 
     else if (h < 0 && player_pos.x > m_offsetLeft) 
      rigidbody2D.velocity = new Vector2(h * 10, 0); 
     else 
      rigidbody2D.velocity = new Vector2(0, rigidbody2D.velocity.y); 
    } 
} 


void OnTriggerEnter2D(Collider2D other) { 
    if (other.gameObject.name == "Enemy(Clone)") { 
     Destroy(other.gameObject); 
     GameSetUp.score -= 2; 
    } else if (other.gameObject.name == "Coin(Clone)") { 
     GameSetUp.score += 2; 
     Destroy(other.gameObject); 
    } 
} 

}

Я думаю, что проблема находится где-то здесь:

touch_pos = Camera.main.ScreenToViewportPoint(touch_pos); 

     if(touch_pos.x > player_pos.x) 
      rigidbody2D.velocity = new Vector2(1 * 10, 0); 
     else if (touch_pos.x < player_pos.x) 
      rigidbody2D.velocity = new Vector2(-1 * 10, 0); 

ответ

1

Это «одно место», вероятно, место, где координата х касание примерно такое же, как координата x в поле игрока.

Пока ваш палец нажимает эту область, на первом кадре touch_pos.x > player_pos.x истинно, и скорость установлена ​​на положительную. На следующем кадре игрок переместился в положительное направление, и на этот раз touch_pos.x < player_pos.x истинно, а скорость установлена ​​на отрицательную. Это приводит к тряски.

Чтобы избежать этого, вы можете, например, увеличивать и уменьшать скорость медленно, а не изменять ее полностью на противоположную в одном кадре. Вы можете сделать это, изменив свой код на этот:

touch_pos = Camera.main.ScreenToViewportPoint(touch_pos); 

    const float acceleration = 60.0f; 
    const float maxSpeed = 10.0f; 

    if(touch_pos.x > player_pos.x) 
     if(rigidbody2D.velocity.x < maxSpeed) 
      rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x + acceleration * Time.deltaTime, 0); 
     else 
      rigidbody2D.velocity = new Vector2(maxSpeed, 0); 
    else if (touch_pos.x < player_pos.x) 
     if(rigidbody2D.velocity.x > -maxSpeed) 
      rigidbody2D.velocity = new Vector2(rigidbody2D.velocity.x - acceleration * Time.deltaTime , 0); 
     else 
      rigidbody2D.velocity = new Vector2(-maxSpeed, 0); 

Просто отрегулируйте acceleration к значению, которое кажется правильным.