我想知道如何在不使用角色控制器的情况下在Unity中跳球。球需要有一个重力的刚体和一个脚本,使它在球的相对方向上跳跃。请有人帮忙。
答案 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并将lastPlatformVelocity
与inAirVelocity
分开, 将其添加为单独的术语并将其减速。为了在空中进行全速控制,我建议你移动 加速if if块(在这种情况下,
inAirVelocity
可能不会 需要在UpdateSmoothedMovementDirection
)中进行更改。可替换地, 您可以更改用于计算跳跃时的移动的内容 做像
这样的事情if(!controller.isGrounded) movement.speed = inAirSpeed;
但这会导致一些不自然的行为和你 可能需要在空中做一些调整。