2017-09-07 4 views
3

저는 Unity와 rigidbodies를 처음 접했고, 3D Tron Light-cycle 게임을 만들려고 배워야한다고 생각했습니다. 내가 실린더, 구, 직사각형의 조합을 사용하여 내 플레이어 차량을했습니다, 아래와 :유니티 - 오토바이 용 강체 사용 - 어떻게해야합니까?

enter image description here

나는 긴 영역에 강체를 사용하고, 다음 코드를 사용 :

public float accel = 1.0f;  
// Use this for initialization 
void Start() { 
    cycleSphere = GetComponent<Rigidbody>(); 
} 

void FixedUpdate() { 
    cycleSphere.velocity = Vector3.forward * accel; 
} 

차량이 전진합니다. 나는 이것을 할 수있는 더 좋은 방법이 있는지 확신하지 못하지만, 있다면 그렇게 말하십시오.

주 카메라를 차량에 장착하고 X 회전을 사용 중지하여 카메라가 돌아 가지 않도록했습니다.

이제 A 및 D 버튼을 눌러 회전 시키려합니다. 원래 Tron light-cycles의 90도 회전과는 달리, 나는 그것이 일반 차량처럼 돌아가고 싶었습니다.

그래서 나는 노력이 :

void Update() { 
    if (Input.GetKey (KeyCode.A)) { 
     turning = true; 
     turnAnglePerFixedUpdate -= turnRateAngle; 
    } else if (Input.GetKey (KeyCode.D)) { 
     turning = true; 
     turnAnglePerFixedUpdate += turnRateAngle; 
    } else { 
     turning = false; 
    } 
} 

void FixedUpdate() { 
    float mag = cycleSphere.velocity.magnitude; 
    if (!turning) { 
     Quaternion quat = Quaternion.AngleAxis (turnAnglePerFixedUpdate, transform.up);// * transform.rotation; 
     cycleSphere.MoveRotation (quat); 
    } 
    cycleSphere.velocity = Vector3.forward * accel; 
} 

위의 코드가 차량을 회전 않지만, 그것은 여전히에서 마지막 방향으로 이동 - 더 탱크 포탑처럼 동작합니다. 더 나쁜 것은 A 또는 D를 너무 많이 누르면 원하는 방향으로 회전하게되고, 잠시 후 너트를 가며이 방향으로 회전하고 카메라로 찍습니다.

enter image description here

내가 잘못하지 않았고, 내가 그것을 어떻게 해결할 수 무엇?

답변

3

먼저 Input.GetKey에서 Input.GetAxis으로 변경하여 키를 누를 때 값이 적절히 증가하거나 감소하도록 권장합니다. 이렇게하면 속도로 적용된 힘 벡터를 정규화하는 옵션이 제공됩니다. 그런 다음 그 벡터에 기초하여 "앞바퀴"가 나머지 몸체를 다른 방향 (왼쪽 또는 오른쪽)으로 "끌"도록 힘 입력을 적용해야합니다. 전진 력이 측면 (왼쪽 또는 오른쪽) 힘보다 약간 크기 때문에 이상적인 "실제 물리 동작"이 아닙니다.

코드 예제 :

// member fields 
float sideForceMultiplier = 1.0f; 
float frontForceMultiplier = 2.0f; 
Vector3 currentVeloticy = Vector3.zero; 

void Update() 
{ 
    Vector3 sideForce = (sideForceMultiplier * Input.GetAxis("horizontal")) * Vector3.right; 
    Vector3 frontForce = frontForceMultiplier * Vector3.forward; 
    currentVelocity = (sideForce + fronForce).Normalize; 
} 

void FxedUpdate() 
{ 
    cycleSphere.velocity = currentVelocity * accel; 
} 
+0

흠, 흥미 롭군요. 그 이후로 코드에 몇 가지 수정을가했고 작동하도록 만들었지 만 조언을 받고 getKey를 입력으로 바꿨습니다. 이 코드는 어떻게 전환됩니까? –

+0

이 코드는'2 * forwardForce'와 결합 된'Input.GetAxis ("horizontal")'에서 검색 한 값과 관련이 있습니다. 그것이 앞으로 나아갈 것을 의미하지만 수평 입력이있을 때마다 힘을 수정합니다 (조금 곡선으로 만듭니다). –

관련 문제