2014-06-17 10 views
0

플레이어를 마지막으로 클릭 한 위치로 회전하려고합니다. 나는이 작업을 수행하기 위해 최선을 다했지만 지금은 회전을 즉시 변경하는 대신 스프라이트 대신 설정된 속도로 플레이어가 회전하는 것을보고 싶습니다. Ive는 온라인에서 찾은 여러 가지 방법을 시도했지만 그 중 어느 것도 나를 위해 일하지 않았습니다. 여기에 내가 무엇입니까Unity : Lerp/Slerp와 함께 Z 축을 중심으로 오브젝트 회전

void Update() 
{ 
    if (Input.GetMouseButtonDown (0)) 
    { 

      Vector3 diff = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position; 
      diff.Normalize(); 
      float rot_z = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg; 
      transform.rotation= Quaternion.Euler(0f, 0f, rot_z - 90); 


      Instantiate(ProjectilePrefab, transform.position, transform.rotation); 
     } 
} 

위의 코드는 정상적으로 작동하지만 아무런 움직임도 보이지 않습니다. 나는 이것을하려고했지만 위치가 틀리며 회전도 즉각적입니다.

Vector3 diff = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position; 
var newRotation = Quaternion.LookRotation(diff); 
newRotation.y = 0.0f; 
newRotation.x = 0.0f; 
transform.rotation = Quaternion.Slerp(transform.rotation, newRotation, Time.deltaTime * 30); 

아이디어가 있습니까?

답변

2

두 가지 문제가 있습니다. 먼저 Slerp 함수는 사용자가 마우스 버튼을 누른 후에 한 번만 호출됩니다. if 부분 밖으로 이동하거나 코 루틴을 사용해야합니다. 둘째, Slerp0에서 1까지의 부동 소수점을 나타내며 진행을 나타냅니다 (time 또는 deltaTime이 아님). lerp 함수를 다루는 공식 예제는 단지 잘못되었습니다. 왜냐하면 time 값을 사용하면 게임이 실행되는 초 동안에 만 작동하기 때문입니다.

당신은 회전 1 초 후에 완료 할이

if (Input.GetMouseButtonDown (0)) { 
    // your other stuff here 
    float starTime = Time.time; 
} 
float t = Time.time - startTime; 
transform.rotation = Quaternion.Slerp(transform.rotation, newRotation, t); 

뭔가를해야합니다. 더 빨리 또는 더 느리게하려면 t에 인수를 곱하면됩니다.

0

답변을 찾았습니다. 이것이 내가 만든 방법이다.

if (Input.GetMouseButtonDown (0)) { 
        target = Camera.main.ScreenToWorldPoint (Input.mousePosition); 
        rotateToTarget = true; 
        print ("NEW TARGET: " + target); 
      } 

      if (rotateToTarget == true && target != null) {        
        print ("Rotating towards target"); 


        targetRotation = Quaternion.LookRotation (transform.position - target.normalized, Vector3.forward); 
        targetRotation.x = 0.0f;//Set to zero because we only care about z axis 
        targetRotation.y = 0.0f; 

        player.transform.rotation = Quaternion.Slerp (transform.rotation, targetRotation, Time.deltaTime * rotationSpeed); 



        if (Mathf.Abs (player.transform.rotation.eulerAngles.z - targetRotation.eulerAngles.z) < 1) { 

          rotateToTarget = false; 
          travelToTarget = true; 
          player.transform.rotation = targetRotation; 
          print ("ROTATION IS DONE!"); 
        } 
      } 
관련 문제