2015-04-27 3 views
0

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

Мой главный метод вращения заключается в следующем:

void RotateShip() 
{ 
    Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition); 
    Debug.Log (Input.mousePosition.ToString()); 
    Plane playerPlane = new Plane (Vector3.up, transform.position); 

    float hitdist = 0.0f; 

    if (playerPlane.Raycast (ray, out hitdist)) 
    { 
     Vector3 targetPoint = ray.GetPoint (hitdist); 
     Quaternion targetRotation = Quaternion.LookRotation (targetPoint - transform.position); 
     transform.rotation = Quaternion.Slerp (transform.rotation, targetRotation, speed * Time.deltaTime); 
    } 
} 

Я называю этот метод внутри метода FixedUpdate и я завернул его в следующее, если заявление:

void FixedUpdate() 
    { 
     // Generate a plane that intersects the transform's position with an upwards normal. 


     // Generate a ray from the cursor position 
     if (Input.GetMouseButton (0)) 
     { 

      RotateShip(); 

     } 
    } 

Однако объект по-прежнему вращаются только до тех пор, пока моя кнопка мыши удерживается нажатой. Я хочу, чтобы мой объект продолжал вращаться до той точки, где моя мышь просто щелкнула, пока не достигнет этой точки.

Как правильно изменить свой код?

+0

Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

1

Он вращается только тогда, когда ваша мышь опущена, потому что это единственный раз, когда вы говорите ему вращаться. В вашем FixedUpdate (который Imtiaj по праву указал на Update), вы звоните только RotateShip(), а Input.GetMouseButton(0) - это правда. Это означает, что вы вращаете только корабль во время нажатия кнопки.

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

void Update() {  
    if (Input.GetMouseButtonDown (0)) //we only want to begin this process on the initial click, as Imtiaj noted 
    { 

     ChangeRotationTarget(); 

    } 
    Quaternion targetRotation = Quaternion.LookRotation (this.targetPoint - transform.position); 
    transform.rotation = Quaternion.Slerp (transform.rotation, targetRotation, speed * Time.deltaTime); 
} 


void ChangeRotationTarget() 
{ 
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 
    Plane playerPlane = new Plane (Vector3.up, transform.position); 

    float hitdist = 0.0f; 

    if (playerPlane.Raycast (ray, out hitdist)) 
    { 
     this.targetPoint = ray.GetPoint (hitdist); 
    } 
} 

Так что теперь вместо того, чтобы только делать вращение, MouseButton (0) вниз, мы делаем вращение непрерывно в обновлении и вместо того, чтобы только установить целевую точку, когда мы щелкаем мышью.

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