2016-06-03 5 views
0

Unity 5로 작성된 프로젝트에서 레이크 캐스트로 객체 터치 작업을 수행하고 있습니다. 그러나 내 물건이 움직이기 때문에 때로는 내가 만질 때 레이크 캐스트가 내 손에 닿을 수 없습니다. 해결책으로 고정 된 업데이트를 사용하여 프로젝트 설정에서 Fixed Timestep을 0.02에서 0.01로 설정했습니다. 그러나,이 시간에, 그것은 마치 두 번 만지고 두 번 감동을받는 것처럼 동작합니다. 업데이트 기능을 사용해서는 안되며 고정 된 업데이트를 사용해야합니다. 문제를 어떻게 해결할 수 있습니까? 당신은 입력을 감지 또는 비 물리/강체 객체를 이동 Update()를 사용Unity 5 고정 업데이트

void FixedUpdate() 
{ 
    if (PlayerPrefs.GetInt ("oyunsonu") == 0) { 

     // Code for OnMouseDown in the iPhone. Unquote to test. 
     RaycastHit hit = new RaycastHit(); 
     for (int i = 0; i < Input.touchCount; ++i) { 
      if (Input.GetTouch (i).phase.Equals (TouchPhase.Began)) { 
       Ray ray = Camera.main.ScreenPointToRay (Input.GetTouch (i).position); 

       touchY = Input.GetTouch (i).position.y; 
       if (Physics.Raycast (ray, out hit)) { 

        //Debug.Log (hit.transform.gameObject.name.ToString()); 

        GameObject myBallObject; 
        myBallObject = GameObject.FindWithTag ("Ball"); 

        Instantiate (effect, myBallObject.transform.position, transform.rotation); 
        GetComponent<AudioSource>().PlayOneShot (saundFile [3], 1); 
        //TextAnimation.Show(); 
        TouchObjectScript myTouchObjectScript = myBallObject.GetComponent<TouchObjectScript>(); 
        myTouchObjectScript.BallForce (hit.transform.gameObject.tag.ToString(), touchY, screenHeight); 

        //PlayerPrefs.SetInt ("aaa", 0); 

       } 

      } 
     } 
    } 

} 
+1

어떤 이유로 든 고정 시간대 변경을 ** 절대 ** 할 수 없습니다. 둘째로, FixedUpdate를 사용해야하는 것은 거의 없습니다. 마지막으로 사소한 점은 RunPop 내에서 PlayerPrefs.GetInt를 절대해서는 안됩니다. – Fattie

+0

고정 된 시간 단계를 변경할 필요가 없습니다. '0.016'보다 작은 값으로 변경하면 물리 문제가 발생할 수 있습니다. 대신, Update 메소드에서이 코드를 사용하면 FixedUpdate를 사용하지 못하게 막을 수 있습니다. – EvilTak

답변

2

:

다음은 내 코드입니다. 물리 객체를 이동하려면 FixedUpdate()을 사용합니다. 유니티의 비디오 UPDATE AND FIXEDUPDATE을 봅니다.

터치 할 때마다 GameObject.FindWithTag("Ball");하는 것이 좋으며 레이 캐스트가 좋지 않습니다. 끊임없이 PlayerPrefs.GetInt("oyunsonu")을 검사하는 것도 좋지 않습니다. 루프에서 여러 번 사용할 변수를 캐시하십시오. 아래는 고정 코드입니다.

AudioSource myAudio; 
GameObject myBallObject; 
TouchObjectScript myTouchObjectScript; 
int oyunsonu = 0; 

void Start() 
{ 
    myAudio = GetComponent<AudioSource>(); 
    myBallObject = GameObject.FindWithTag("Ball"); 
    myTouchObjectScript = myBallObject.GetComponent<TouchObjectScript>(); 
    oyunsonu = PlayerPrefs.GetInt("oyunsonu"); 
} 

void Update() 
{ 
    if (oyunsonu == 0) 
    { 

     // Code for OnMouseDown in the iPhone. Unquote to test. 
     RaycastHit hit = new RaycastHit(); 
     for (int i = 0; i < Input.touchCount; ++i) 
     { 
      if (Input.GetTouch(i).phase == TouchPhase.Began) 
      { 
       Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(i).position); 

       touchY = Input.GetTouch(i).position.y; 
       if (Physics.Raycast(ray, out hit)) 
       { 
        //Debug.Log (hit.transform.gameObject.name.ToString()); 
        Instantiate(effect, myBallObject.transform.position, transform.rotation); 
        myAudio.PlayOneShot(saundFile[3], 1); 
        //TextAnimation.Show(); 
        myTouchObjectScript.BallForce(hit.transform.gameObject.tag.ToString(), touchY, screenHeight); 
       } 

      } 
     } 
    } 

} 
관련 문제