I applied the following script to make a opponent gameobject jump. It can jump but never fall down to ground.
How should I change the ApplyGravity()?
class OpponentControllerJumping
{
var enabled = true;
var height = 10.0;
var extraHeight = 4.1;
@System.NonSerialized
var repeatTime = 0.05;
@System.NonSerialized
var timeout = 0.15;
@System.NonSerialized
var jumping = false;
@System.NonSerialized
var reachedApex = false;
@System.NonSerialized
var lastButtonTime = -10.0;
@System.NonSerialized
var lastTime = -1.0;
@System.NonSerialized
var lastStartHeight = 0.0;
var jumpSpeed : float = 20;
@System.NonSerialized
var isJumping = false;
@System.NonSerialized
var direction = Vector3.zero;
@System.NonSerialized
var verticalSpeed = 0.0;
@System.NonSerialized
var inAirVelocity = Vector3.zero;
@System.NonSerialized
var hangTime = 0.0;
@System.NonSerialized
var speed = 0.0;
var inAirControlAcceleration = 1.0;
var gravity = 60.0;
var maxFallSpeed = 20.0;
}
var jump : OpponentControllerJumping;
private var activePlatform : Transform;
private var activeLocalPlatformPoint : Vector3;
private var activeGlobalPlatformPoint : Vector3;
private var lastPlatformVelocity : Vector3;
function Update ()
{
if(transform.position.y == 1)
{
jump.lastButtonTime = Time.time;
ApplyJumping ();
ApplyGravity ();
transform.Translate(jump.direction * jump.jumpSpeed * Time.deltaTime);
}
}
function ApplyJumping ()
{
if (jump.lastTime > Time.time)
return;
if (transform.position.y == 1)
{
if (jump.enabled Time.time < jump.lastButtonTime + jump.timeout)
{
jump.direction = transform.TransformDirection( Vector3( 0, transform.position.y, 0 ));
jump.direction.Normalize();
jump.direction *= jump.jumpSpeed ;
var h = jump.direction.y;
jump.isJumping = Mathf.Abs(h) > 0.1;
if (jump.isJumping)
{
jump.direction = Vector3 (0, h, 0);
var curSmooth = jump.extraHeight * Time.deltaTime;
var targetSpeed = Mathf.Min (Mathf.Abs(h), 1.0);
targetSpeed *= jump.jumpSpeed;
jump.speed = Mathf.Lerp (jump.speed, targetSpeed, curSmooth);
jump.hangTime = 0.0;
}
else
{
jump.hangTime += Time.deltaTime;
if (jump.isJumping)
{
jump.inAirVelocity += Vector3 (Mathf.Sign(h), 0, 0) * Time.deltaTime * jump.inAirControlAcceleration;
}
}
jump.verticalSpeed = CalculateJumpVerticalSpeed (jump.height);
jump.inAirVelocity = lastPlatformVelocity;
SendMessage ("DidJump", SendMessageOptions.DontRequireReceiver);
}
}
}
function ApplyGravity ()
{
if (transform.position.y == 1)
{
jump.verticalSpeed = -jump.gravity * Time.deltaTime;
}
else
{
jump.verticalSpeed -= jump.gravity * Time.deltaTime;
}
jump.verticalSpeed = Mathf.Max (jump.verticalSpeed, -jump.maxFallSpeed);
}
function CalculateJumpVerticalSpeed (targetJumpHeight : float)
{
return Mathf.Sqrt (2 * targetJumpHeight * jump.gravity);
}
function DidJump ()
{
jump.jumping = true;
jump.reachedApex = false;
jump.lastTime = Time.time;
jump.lastStartHeight = transform.position.y;
jump.lastButtonTime = -10;
}