Unityでキャラクターコントローラーを使わずにボールをジャンプさせる方法を知りたいです。ボールには、重力用のリジッドボディと、ボールの相対的な向きでジャンプさせるためのスクリプトが必要です。誰か助けてください。
1 に答える
skovacs1がUnityAnswersで述べているように:
簡単な答えは、inAirControlAccelerationの値を調整することです。これにより、想像したものに似たものが得られるはずです。さらに制御するために、の複合代入をで置き換えることもでき
movement.inAirVelocity
ますmovement.inAirVelocity += movement.direction * Time.deltaTime * movement.inAirControlAcceleration
値がhの入力量によってスケーリングされるようにします。
リンクされた正確なスクリプトを使用していると仮定して(他に何も投稿しなかったため)、それでも希望どおりの結果が得られない場合は、Updateの関連する関数型コードの機能を次に示します。
//move horizontally as calculated in UpdateSmoothedMovementDirection * speed //+ vertically by the speed calculated in ApplyGravity or ApplyJumping //+ horizontally + vertically by the inAirMovement calculated in ApplyJumping //+ horizontally by the adjustment to inAirMovement calculated in //UpdateSmoothedMovementDirection var currentMovementOffset = movement.direction * movement.speed + Vector3(0,movement.verticalSpeed,0) + movement.inAirVelocity; currentMovementOffset *= Time.deltaTime; movement.collisionFlags = controller.Move (currentMovementOffset);
気になるのは水平方向の動きだけなので、実際に気にする必要がある変数は、movement.direction、movement.speed、movement.inAirVelocityだけです。
仕事をする部分:
function UpdateSmoothedMovementDirection() { //called by Update every frame //...irrelevant stuff //move direction is *always* (canControl is never changed in this script) //the horizontal input when the absolute horizontal input is greater than 0.1 if (movement.isMoving) movement.direction = Vector3 (h, 0, 0); //calculate the speed change only when on the ground if (controller.isGrounded) { var curSmooth = movement.speedSmoothing * Time.deltaTime; var targetSpeed = Mathf.Min (Mathf.Abs(h), 1.0); if(Input.GetButton("Fire2") && canControl) targetSpeed *= movement.runSpeed; else targetSpeed *= movement.walkSpeed; movement.speed = Mathf.Lerp (movement.speed, targetSpeed, curSmooth); //...irrelevant stuff } //inAirVelocity is going to be adjusted horizontally by Time.deltaTime //in the direction of horizontal input else { //...irrelevant stuff if (movement.isMoving) movement.inAirVelocity += Vector3(Mathf.Sign(h),0,0) * Time.deltaTime * movement.inAirControlAcceleration; } }
初期のinAirVelocityを設定する部分:
function ApplyJumping() { //called by Update every frame //...irrelevant stuff //When on the ground and we can jump, the inAirVelocity will be //the motion of the platform we're on if (controller.isGrounded) { if (jump.enabled && Time.time < jump.lastButtonTime + jump.timeout) { //...irrelevant stuff movement.inAirVelocity = lastPlatformVelocity; //...irrelevant stuff } } }
おそらくあなたが期待していることではないのは、地上にいるときだけ速度を計算するということです。
空中に入ると、最後に地面に着いたときに移動していた速度で入力方向(
movement.direction
)+入力方向の影響を受ける調整()で移動しますinAirVelocity
。これはどういうわけか慣性をシミュレートすることになっていると思いますが、方向を変えることができ、減速がないため、実際にはそのようには機能しません。
if(Controller.isGrounded)
慣性で適切な方向を取得するには、movement.directionへの変更を次のブロックに移動する必要があります。実際の慣性減速を取得するには、elseステートメントの速度から0になるまで平滑化率で減算し、lastPlatformVelocity
からの分離を維持しinAirVelocity
、それを別の項として追加して減速します。空中で完全な速度制御を行うには、ifブロックから速度を移動することをお勧めします(この場合、
inAirVelocity
で変更する必要がない場合がありますUpdateSmoothedMovementDirection
)。または、次のような操作を行うことで、ジャンプ時の動きの計算に使用するものを変更できます。
if(!controller.isGrounded) movement.speed = inAirSpeed;
ただし、これにより不自然な動作が発生し、空中で調整が必要になる可能性があります。