2017-09-22 17 views
0

나는 실린더 또는 캡슐에서 잘못된 중력으로 고심하고 있습니다. 기본적으로 나는 구형 중력과 같은 코드를 사용할 수 있다고 생각했는데 작동하지 않습니다. 그래서 나는 더 나은 결과를 얻기 위해 몇 줄을 바꿨다.단일체 : 인조 중력 - 내부 캡슐/실린더

[SerializeField] float gravity = 10; 

public void Attract (Transform target) 
{ 
    Vector3 gravityUp = (target.position - new Vector3(transform.position.x, transform.position.y,target.position.z)).normalized; 
    Vector3 bodyDown = -target.up; 

    Rigidbody rb = target.GetComponent<Rigidbody>(); 
    rb.AddForce(gravityUp * gravity); 

    Quaternion targetRotation = Quaternion.FromToRotation(bodyDown, gravityUp) * target.rotation; 
    targetRotation.x = 0; 

    target.rotation = Quaternion.Slerp(target.rotation, targetRotation, 30.0f * Time.deltaTime); 

} 

첫 번째 시도에서 정상적으로 작동했습니다. 그러나 플레이어 (목표)는 Y 축을 회전시킬 수 없습니다. 누구든지 아이디어가 있습니까?

답변

0

좋아요, 나는 다음을 시도했다.

Quaternion targetRotation = Quaternion.FromToRotation(bodyDown, gravityUp) * target.rotation; 
targetRotation.x = 0; 

target.rotation = Quaternion.Slerp(target.rotation, targetRotation, 30.0f * Time.deltaTime); 

이제 Surface normal을 사용하여 플레이어를 회전 시켰습니다.

if (Physics.Raycast(attractedBody.transform.position + attractedBody.transform.forward, -attractedBody.transform.up, out hit, distance)) 
    { 
     surfaceNorm = hit.normal; 
    } 

그러나 Rigidbody Contrains가 없으면 플레이어는 입력없이 회전을 시작합니다. 그래서 사용해야합니다 :

rb.constraints = RigidbodyConstraints.FreezeRotation; 

이것은 작동합니다.