没有角色控制器的团结跳球

时间:2011-03-24 17:58:26

标签: unity3d character gravity

我想知道如何在不使用角色控制器的情况下在Unity中跳球。球需要有一个重力的刚体和一个脚本,使它在球的相对方向上跳跃。请有人帮忙。

1 个答案:

答案 0 :(得分:0)

正如skovacs1 states on Unity Answers

  

简单的答案是调整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)。

     

我认为这应该模拟   不知怎的,惯性,但它真的不起作用,因为你可以   仍然改变方向,没有减速。

     

要获得正确的惯性方向,你需要移动   将movement.direction更改为if(Controller.isGrounded)块   接下来。为了得到实际的惯性减速度,你会的   以某种平滑率从else语句中减去速度,直到   它为0并将lastPlatformVelocityinAirVelocity分开,   将其添加为单独的术语并将其减速。

     

为了在空中进行全速控制,我建议你移动   加速if if块(在这种情况下,inAirVelocity可能不会   需要在UpdateSmoothedMovementDirection)中进行更改。

     

可替换地,   您可以更改用于计算跳跃时的移动的内容   做像

这样的事情
if(!controller.isGrounded) movement.speed = inAirSpeed;
     

但这会导致一些不自然的行为和你   可能需要在空中做一些调整。