2016-09-11 10 views
1

У меня проблема с BoxCollider2D, который у меня есть на моем GameObject. Когда я вращаю GameObject, BoxCollider2D вращается вместе с ним, но не так быстро. Есть ли способ заставить BoxCollider2D двигаться с той же скоростью, что и GameObject? Я чувствую, что мне не хватает чего-то очевидного.Unity BoxCollider2D вращение не совпадает с поворотом GameObject

Before Rotation
After Rotation

Ниже мой код для движения игрока:

Animator anim; 
Rigidbody2D rbody; 
float speed = 0f; 
public float moveSpeed = 0.6f; 
public float acceleration = 0.2f; 
public int turnSpeed = 20; 
bool sails = false; 

// Use this for initialization 
void Start() { 

    anim = GetComponentInChildren<Animator>(); 
    rbody = GetComponent<Rigidbody2D>(); 
} 

// Update is called once per frame 
void Update() { 

    if (sails) { 
     rbody.transform.Translate (transform.right * (speed * Time.deltaTime)); 
     speed += acceleration * Time.deltaTime; 

     if (speed > moveSpeed) 
      speed = moveSpeed; 

     if (Input.GetKey (KeyCode.LeftArrow)) { 
      rbody.transform.Rotate (0,0,turnSpeed * Time.deltaTime); 
     } 

     if (Input.GetKey (KeyCode.RightArrow)) { 
      rbody.transform.Rotate (0,0,-turnSpeed * Time.deltaTime); 
     } 
    } 

    if (!sails) { 

     rbody.transform.Translate (transform.right * (speed * Time.deltaTime)); 
     speed += -acceleration * Time.deltaTime; 

     if (speed < 0f) 
      speed = 0f; 
    } 

    if (Input.GetKeyDown (KeyCode.Space)) { 
     sails = !sails; 
     anim.SetBool ("sailsDown", sails); 
    } 
} 

ответ

0

Проблема не ваше вращение, но как вы применяете движение. Вы используете transform.right который является местным правом объекта. Но тогда, применяя перевод, вы также применяете его к объекту локально.

Например, если ваше судно обращено вниз (вращение.Z = -90), значение transform.right равно (0, -1,0), в координатах мира это равно «вниз».

Но тогда вы используете rbody.transform.Translate(vector), который переведет объект, используя локальные координаты. Это означает, что если вы передадите ему «вниз» вектор, он будет двигаться вниз локально, что в случае поворота -90 в оси Z означает перемещение «слева» относительно мира.

Вы должны изменить эту строку:

rbody.transform.Translate(transform.right * (speed * Time.deltaTime)); 

To:

rbody.transform.Translate(transform.right * (speed * Time.deltaTime),Space.World); 

Или:

rbody.transform.Translate(Vector2.right * (speed * Time.deltaTime)); 
+1

Это идеальный вариант. Я застрял, думая, что проблема лежит в поворот. Благодаря! – StevieBruce

+0

Да, локальные и мировые координаты могут сначала немного запутываться, убедитесь, что вы понимаете, какое фактическое значение вы получаете при запросе значений относительно игрового объекта. Могли бы вы проголосовать за андерса? Я был бы очень признателен! благодаря – Leo

 Смежные вопросы

  • Нет связанных вопросов^_^