2016-01-13 7 views
0

У меня есть класс ниже, который я прикрепляю к объекту, чтобы он вращался вокруг его оси. Я отправил стержень спрайта через инспектора.Вращение спрайта вокруг его оси

Это работает именно так, как я тоже хочу, но проблема заключается в том, что всякий раз, когда я касаюсь и перетаскиваю его, а затем снова касаюсь и перетаскиваю его, он привязывается к новой позиции.

Что бы я хотел, чтобы это произошло, когда оно повернуто и затем снова повернуто, спрайт остается в том же вращении, а не привязывается к новому положению, и я хотел бы, чтобы угол спрайта был сброшен на 0. Затем следует, что я хочу, чтобы угол постоянно вращался. Поэтому, если я поворачиваю его в положительном направлении, угол должен продолжать увеличиваться в положительном направлении и не меняться. Так как 0 ---> 360 ----> 720 -----> и т. Д. И т. Д. И тогда когда мышь отпущена, спрайт остается в том же положении, но теперь угол теперь установлен на 0. И затем, когда он снова щелкнет, чтобы повернуть, он вращается с этого точного положения.

Вот мой код, который хорошо работает для вращения, но я хотел бы изменить его для достижения вышеуказанного сценария. Любая помощь в этом?

public class Steering : MonoBehaviour { 

float prevAngle,wheelAngle,wheelNewAngle = 0; 
public SpriteRenderer sprite; 
void Start() { 
} 

void Update() { 


} 

public float GetAngle(){ 


    return wheelAngle; 



} 

void OnMouseDrag(){ 

    Vector3 mouse_pos = Input.mousePosition; 
    Vector3 player_pos = Camera.main.WorldToScreenPoint(this.transform.position); 

    mouse_pos.x = mouse_pos.x - player_pos.x; 
    mouse_pos.y = mouse_pos.y - player_pos.y; 

    wheelNewAngle = Mathf.Atan2 (mouse_pos.y, mouse_pos.x) * Mathf.Rad2Deg; 

    if (Input.mousePosition.x > sprite.bounds.center.x) { 

     wheelAngle += wheelNewAngle - prevAngle; 

    } else { 
     wheelAngle -= wheelNewAngle - prevAngle; 

    } 



    this.transform.rotation = Quaternion.Euler (new Vector3(0, 0, wheelAngle)); 

    Debug.Log (wheelAngle); 
    prevAngle = wheelNewAngle; 
} 

void OnMouseUp(){ 


    prevAngle = wheelNewAngle; 
    wheelAngle = 0; 


} 

}

+0

Ответ, данный TheOsirian, был фактически совершенно правильным :) – Fattie

+1

К сожалению, этот вопрос слишком неясен. – Fattie

ответ

0

По углу спрайта, вы имеете в виду поворот? Я не уверен, как изменится позиция, если в вашем коде ничего нет. Всегда ли он перемещается в одно и то же положение? У меня небольшие проблемы с визуализацией того, как должна выглядеть ваша система, но я надеюсь, что это поможет.

Похоже, что вы захотите сохранить предыдущую позицию мыши, чтобы вы могли получить относительное количество для вращения каждого кадра.

Вверху:

Vector3 prevMousePos = Vector3.zero; 

Этот метод поможет получить позицию, когда игрок нажата:

void OnMouseDown(){ 
    prevMousePos = Input.mousePosition; 
} 

Тогда в OnMouseDrag() получить разницу между двумя позициями мыши, чтобы получить (если вы перемещали мышь влево, вправо, вверх или вниз с момента нажатия):

Vector3 mouseDiff = Input.mousePosition - prevMousePos; 

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