2017-05-02 9 views
2

내 게임 장면에 큐브 (플레이어)가 있습니다. 큐브의 움직임을 제한하기 위해 C# 스크립트를 작성하여 화면을 벗어나지 않도록했습니다.Unity의 Mathf.clamp() 함수

는 아래 x_minx_maxz_minz_max -3, 3, -2, 8은 각각 단일 관리자를 통해 입력된다의 스크립트

private void FixedUpdate() 
    { 
     float moveHorizontal = Input.GetAxis("Horizontal"); 
     float moveVertical = Input.GetAxis("Vertical"); 

     Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); 
     rb.velocity = movement * speed; 

     rb.position = new Vector3(
      Mathf.Clamp (rb.position.x, x_min, x_max), 
      0.5f, 
      Mathf.Clamp(rb.position.z, z_min, z_max) 
      ); 

    } 

값으로부터 제 FixedUpdate() 방법이다.

문제

스크립트는 잘 작동하지만 (내가 왼쪽 화살표 버튼을 누르면 계속하는 경우) 내 플레이어 (큐브)는 부정적인 X-AXIS에서 0.1 단위 이상이다 부정적인 X-AXIS에서 -3.1 대까지 이동할 수 있습니다 (이 동작은 다른 축에도 마찬가지입니다). 버튼을 누르지 않으면 분명히 -3.1을 -3으로 고정시킵니다.

enter image description here

  • 왜 이런 일이 무엇입니까? 왜 그것이 (Mathf.Clamp()) 큐브를 처음 -3 단위로 제한하지 않습니까?
  • 추가 0.1 단위가 필요한 이유는 무엇입니까?
  • 그리고 왜이 값은 0.1 단위입니까? 왜 그다지 많지 않습니까?
+2

내가 틀릴 수도 있지만, 나는 당신이 속도를 설정하고 있기 때문에 생각하고 위치를 설정 :

이 문제를 해결하기 위해, 당신은 당신의 경계 외부 갈 수있는 큐브를 방지하기 위해이 코드를 사용할 수 있습니다 , 다음 프레임 이전에 다시 추측하겠습니다. 화합은 객체의 속도를 사용하여 다음 위치를 계산합니다. 그것은 그러한 입장에 서게된다. 위치가 경계를 벗어나는 경우 속도를 0으로 재설정해야한다고 생각합니다. – Alox

+0

@Alox 당신은 답으로 써야합니다. 나는 그것이 너무 문제가 될 것 같아요.Rigidbody 구성 요소를 완전히 제거하거나 'Rigidbody.MovePosition' 기능을 사용하는 것 이외의 다른 문제를 해결할 수 있다고 생각지 않습니다. – Programmer

+0

그렇다면 왜 항상 0.1 단위입니까? – rayan

답변

3
  • 내부 물리 업데이트로 큐브 after을 고정 위치에 놓았 기 때문에 이러한 현상이 발생합니다. 위치를 할당 한 직후에 Debug.Log를 직접 입력하여 확인할 수 있으므로 예상 위치로 큐브를 제한하십시오.
  • 줄 수 있기 때문에 추가 .1 단위를 얻고 있습니다. 개체 클램프 후 적용되는 속도
  • 고정 된 시간 단계 (프로젝트 설정> 시간)의 속도와 설정으로 인해 0.1 단위입니다. 더 높은 속도를 설정하면 더 많을 것입니다. Fixed Timestep을 낮추면 조금 더 나아질 것입니다.
+0

내부 물리 업데이트에서'FixedUpdate()'가 호출 된 후 0.1 단위가 추가되고이 값은 속도 (큐브의 속도)와 Timestep에 따라 달라진다는 것이 맞습니까? – rayan

+0

맞습니까? 예 Debug.Log에 -3.1 값이 표시되지 않았습니다. – rayan

+0

예, 정확합니다. FixedUpdate()가 완료된 후 0.1 단위가 추가되며 큐브 및 시간 단계의 속도에 따라 다릅니다. 따라서 가능한 수정은 Alox가 제안한대로 경계를 넘어 서기 전에 속도를 0으로 설정하는 것입니다. – Tubeliar

4

속도를 설정하고 위치를 지정했기 때문에 문제가 발생할 수 있지만 다음 프레임에서는 개체 위치에 속도가 추가됩니다. 그래서 그것이 0.1 단위를 끝내는 이유입니다.

이 문제를 해결하려면 경계를 벗어날 경우 개체의 속도를 0으로 재설정하십시오.

0

이미 이러한 이유가 발생했습니다.

private void FixedUpdate() { 
    Vector3 movement = new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical")); 

    // Get new position in advance 
    float xPos = rb.position.x + movement.x * speed * Time.fixedDeltaTime; 
    float zPos = rb.position.z + movement.z * speed * Time.fixedDeltaTime; 

    // Check if new position goes over boundaries and if true clamp it 
    if (xPos > x_max || xPos < x_min) { 
     if (xPos > x_max) 
      rb.position = new Vector3(x_max, 0, rb.position.z); 
     else 
      rb.position = new Vector3(x_min, 0, rb.position.z); 
     movement.x = 0; 
    } 
    if (zPos > z_max || zPos < z_min) { 
     if (zPos > z_max) 
      rb.position = new Vector3(rb.position.x, 0, z_max); 
     else 
      rb.position = new Vector3(rb.position.x, 0, z_min); 
     movement.z = 0; 
    } 

    rb.velocity = movement * speed; 
}