0

Unityでキャラクターコントローラーを使わずにボールをジャンプさせる方法を知りたいです。ボールには、重力用のリジッドボディと、ボールの相対的な向きでジャンプさせるためのスクリプトが必要です。誰か助けてください。

4

1 に答える 1

0

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;

ただし、これにより不自然な動作が発生し、空中で調整が必要になる可能性があります。

于 2011-03-28T09:58:48.733 に答える