호버 탱크가 있는데 컨트롤러를 사용하고 있습니다. 목표는 부유물을 땅 위에 올려 놓는 것입니다. 그러나 나는 그것을 한 두 정도 더 기울이기를 원하지 않습니다. 기본적으로 항상 평평하게 유지하고 싶습니다.유니티 오브젝트에서 기울어 짐을 방지하는 방법
저는 .MovePosition
과 .MoveRotation
으로 조절하기 위해 탱크에 Rigidbody
을 사용하고 있습니다. 아래의 FixedUpdate
함수를 볼 수 있습니다. 아래 섹션에서 생각 수준을 유지해야합니다. 여기서 탱크가 maxTilt를 지나치는 지 확인합니다. 일치하면 최대 값으로 유지하십시오.
이렇게하면 탱크가 항상 지저분 해집니다. 그것은 빠르게 위아래로 튀는 것처럼 보입니다. 나는 그것이 공중 선회 세력 때문에 생각한다. 그러나 나는 확실하지 않다.
탱크 레벨을 계속 유지하면서 탱크 레벨을 유지하려면 어떻게해야합니까?
FixedUdpate
void FixedUpdate() {
if (!isServer) {
return;
}
CheckGrounded();
Hoover();
if (_moveForward) {
float moveAmount = moveSpeed * Time.deltaTime;
_rigidbody.MovePosition(_rigidbody.position + _rigidbody.transform.forward * moveAmount);
}
if (_moveBackward) {
float moveAmount = (-moveSpeed * 0.6f) * Time.deltaTime;
_rigidbody.MovePosition(_rigidbody.position + _rigidbody.transform.forward * moveAmount);
}
if (_turnLeft) {
Quaternion rotateAmount = Quaternion.Euler(new Vector3(0f, -angularSpeed, 0f) * Time.deltaTime);
_rigidbody.MoveRotation(_rigidbody.rotation * rotateAmount);
}
if (_turnRight) {
Quaternion rotateAmount = Quaternion.Euler(new Vector3(0f, angularSpeed, 0f) * Time.deltaTime);
_rigidbody.MoveRotation(_rigidbody.rotation * rotateAmount);
}
if (_jump && _isGrounded) {
_isJumping = true;
}
if (_isJumping && _jumpTimeLeft > 0) {
float moveAmount = jumpSpeed * Time.deltaTime;
_rigidbody.MovePosition(_rigidbody.position + _rigidbody.transform.up * moveAmount);
_jumpTimeLeft -= Time.deltaTime;
} else if (_isJumping) {
_isJumping = false;
_jumpTimeLeft = jumpTime;
}
// Keep things level
Vector3 rotation = _rigidbody.rotation.eulerAngles;
if (rotation.x > maxTilt) {
rotation.x = maxTilt;
} else if (rotation.x < -maxTilt) {
rotation.x = -maxTilt;
}
if (rotation.y > maxTilt) {
rotation.y = maxTilt;
} else if (rotation.y < -maxTilt) {
rotation.y = -maxTilt;
}
if (rotation.z > maxTilt) {
rotation.z = maxTilt;
} else if (rotation.z < -maxTilt) {
rotation.z = -maxTilt;
}
Quaternion q = new Quaternion();
q.eulerAngles = rotation;
_rigidbody.rotation = q;
}
후버
void Hoover() {
foreach (Transform hoverPoint in hooverPoints) {
Ray ray = new Ray (hoverPoint.position, -hoverPoint.up);
RaycastHit hitInfo;
if (Physics.Raycast (ray, out hitInfo, hooverHeight)) {
float distance = Vector3.Distance (hoverPoint.position, hitInfo.point);
if (distance < hooverHeight) {
_rigidbody.AddForceAtPosition (hoverPoint.up * hooverForce * (1f - distance/hooverHeight), hoverPoint.position, ForceMode.Force);
}
}
}
}