Hello, I have a rocket prefab with a rigidbody and box collider that needs to collect coins (fuel) in order to keep moving up. I would like the rocket to stop moving up (run out of fuel) if you stop collections coins and fall to the ground.
My current code after hitting a box trigger is this.
function OnTriggerEnter(fuel: Collider)
{
if(fuel.gameObject.tag == "fuel"){
Debug.Log("We hit a fuel box!");
constantForce.force = Vector3.up * 50;
}
}
I am not sure how to disable the constant Force code above or make it dissipate over time. So I used a force function
rigidbody.AddForce (0, 10, 0);
This only launched me up into the air exponentially for a brief time but at least I ended up crashing back into the ground.
Any help would be appreciated.
Thanks!
Here is one way to approach your problem. Get rid of the ConstantForce component. Just have a Rigidbody with gravity enabled. The attach this script:
#pragma strict
var fuel = 200.0;
var burnRate = 50.0; // Units per second
var velocity = 0.5;
function FixedUpdate() {
fuel -= burnRate * Time.fixedDeltaTime;
if (fuel < 0.0)
fuel = 0.0;
if (fuel > 0.0001)
rigidbody.velocity = Vector3(0.0, velocity, 0.0);
else
rigidbody.velocity = Vector3.zero;
}
function OnTriggerEnter(col: Collider){
if (col.tag == "fuel"){
fuel += 150.0;
}
}
Each time a ‘fule’ is triggered, you increase the amount of fuel. Each frame you burn some of that fuel. If the ship runs out of fuel, the velocity is set to 0 and gravity will pull it down. You can adjust how much fuel you get on a trigger and how fast you burn fuel. Right now the ship starts with 4 seconds of fuel and each trigger event gives the ship an addition 3 seconds of flight.
Here is all of my code in
player.js
// Player.js
//
// Takes care of everything to do with controlling the player (including animations) and checks for death
//
//
// -------------------------------------------------------------------------------
// if you want to change how high (or low) the player jumps, change this value
public var jumpPower : float = 35.0;
// this chunk o variables are just boring variables that the functions use to function
private var theZ : float;
private var jumpEnabled : boolean;
private var canMove : boolean;
private var hit : RaycastHit;
private var mousePos : float;
private var xVel : float=0.0;
private var xPos : float=0.0;
private var yVel : float=0.0;
private var gameEnding : boolean;
private var didGroundHitSound : boolean;
// rocket fuel, burn rate, and velocity
private var fuel = 200.0;
private var burnRate = 50.0; // Units per second
private var velocity = 0.5;
private var jumpSound : GameObject;
private var fallingSound : GameObject;
private var groundHitSound : GameObject;
// we store a reference to the gameController so that we can send it important messages like when the
// player falls too fast (game over) or when the player hits the ground (game over)
private var gameControl : GameController;
// theTransformHit stores a reference to the last transform that the player jumped on so that we can
// destroy it if all the conditions are met to start a jump
private var theTransformHit : Transform;
// we need to make sure we're grounded before starting a new jump
public var grounded : boolean;
// to use an animated character, we parent it to the player object. so that we can still talk to it and
// play animations, the player object needs to know where the animated character is, so we store a reference
// to its gameobject here (accessible through the editor)
//public var animatedCharacter : GameObject;
// change this to change the players movement speed on the x
public var maxMoveSpeed : float = 0.4;
// the width of the play area (used to keep the player within the play area - if you make the game wider, change the value in gameController.js since that's where we get its value from)
private var gameWidth : float;
function Start() {
// set gravity here
Physics.gravity = new Vector3(0, -45, 0);
// grab default position data for the z position (to fix it wherever the player starts) and to
// get a starting point for our xPos variable, which holds the players x position
xPos=transform.position.x;
theZ=transform.position.z;
// we use this to freeze the player at the beginning or end of the game
jumpEnabled=false;
// we use this to freeze player movement at the end of the game
canMove=false;
// grab a reference to our game controller script
gameControl=GameObject.FindObjectOfType(GameController);
// grab the game width from the gameController.js instance
gameWidth=gameControl.gameWidth;
// grab a reference to a gameObject that has audio attached to it. we use this to make a sound when
// we bounce off a platform
jumpSound=GameObject.Find("SOUNDFX_platform_hit");
fallingSound=GameObject.Find("SOUNDFX_falling_down");
groundHitSound=GameObject.Find("SOUNDFX_ground_hit");
// set our game ending flag to false
gameEnding=false;
didGroundHitSound=false;
// fix our player on the spot when the game first starts (until gameController calls our gameStart function)
rigidbody.isKinematic=true;
}
function FixedUpdate () {
// always assume we're NOT grounded every step (and expect to be proved wrong by raycasting etc.)
grounded=false;
// check to see if we're on top of a platform - here we cast two rays, one on each side of the player
// LEFT:
if (Physics.Raycast (transform.position- Vector3.up * 0.5 + Vector3.right * 0.5, -Vector3.up, hit, 1, 1<<9)) {
// we found ground, so set our grounded flag to true, so that the player will jump
grounded=true;
if(rigidbody.velocity.y<0){
theTransformHit=hit.transform;
}
}
// RIGHT:
if (Physics.Raycast (transform.position- Vector3.up * 0.5 - Vector3.right * 0.5, -Vector3.up, hit, 1, 1<<9)) {
// we found ground, so set our grounded flag to true, so that the player will jump
grounded=true;
if(rigidbody.velocity.y<0){
theTransformHit=hit.transform;
}
}
// do jumping, if we're on top of a platform
if(jumpEnabled){
if(grounded && rigidbody.velocity.y<0){
doJump();
// send a message to the platform to tell it to destroy itself
theTransformHit.gameObject.SendMessage("hitPlatform");
}
}
// grab the mouse position and take off the width of the screen /2 so that moving the
// mouse to the left of the window will produce a negative number and moving it to the right of
// the window will produce a positive number
mousePos = (Screen.width/2)-Input.mousePosition.x;
xVel=0;
// now we check the mouse position and move our player accordingly
if(mousePos>1 || mousePos<-1){
xVel+=(mousePos*0.02);
}
if(canMove){
// add x velocity to our position
xPos=transform.position.x;
if(xVel>maxMoveSpeed)
xVel=maxMoveSpeed;
if(xVel<-maxMoveSpeed)
xVel=-maxMoveSpeed;
if(xPos>gameWidth){
xPos=gameWidth;
rigidbody.MovePosition(Vector3(gameWidth,transform.position.y,transform.position.z));
if(xVel>0){
xVel=0;
rigidbody.velocity.x=0;
}
}
if(xPos<-gameWidth){
xPos=-gameWidth;
rigidbody.MovePosition(Vector3(-gameWidth,transform.position.y,transform.position.z));
if(xVel<0){
xVel=0;
rigidbody.velocity.x=0;
}
}
// set our movement velocity
rigidbody.velocity.x=xVel*5;
// lean our player some
transform.eulerAngles.z=-(mousePos*0.2);
}
fuel -= burnRate * Time.fixedDeltaTime;
if (fuel < 0.0)
fuel = 0.0;
if (fuel > 0.0001)
rigidbody.velocity = Vector3(0.0, 10, 0.0);
else
rigidbody.velocity = Vector3.zero;
// if we're falling too fast, we're falling from high up and it must be game over, so we tell
// gameController to endGame()
if(rigidbody.velocity.y<-20 && !gameEnding){
// comment this line out if you don't want the player to go upside down when he falls
transform.eulerAngles.z=180;
// play falling sound
fallingSound.audio.Play();
// tell gameController.js to end the game
gameControl.endGame();
gameEnding=true;
}
if(gameEnding){
// as we fall from the sky, we move the player back toward the center of the play area. we do this
// simply so that we know where he is going to land and theres no chance of him landing on an
// awkward bit of scenery!
if(transform.position.x>0)
rigidbody.velocity.x=-5;
if(transform.position.x<0)
rigidbody.velocity.x=5;
}
// if we fall below the ground at the bottom (which may happen when the physics body is falling super
// fast), we correct it and hold the player in place.
if(transform.position.y<-4.5){
transform.position.y=-4.5;
rigidbody.velocity.y=0;
rigidbody.velocity.x=0;
if(!didGroundHitSound){
groundHitSound.audio.Play();
didGroundHitSound=true;
}
// comment this out if you don't want the player to end up upside down when it gets stuck in
// the ground at the end of the game
transform.eulerAngles.z=180;
}
transform.position.z=theZ;
}
function doJump(){
// force velocity change to our 'jumpPower' value
rigidbody.velocity.y=jumpPower;
// play character animations
// animatedCharacter.animation.Rewind("jump");
// animatedCharacter.animation.Play("jump");
// disable jumping temporarily (to allow the character to move away from the platform)
jumpEnabled=false;
// schedule jumping to be re-enabled in 0.2 seconds, once we're clear of the platform
Invoke("enableJump",0.2);
// play a sound
jumpSound.audio.Play();
}
function enableJump(){
jumpEnabled=true;
}
public function gameStart(){
// until gameStart is called, the player is frozen in place. once this function is called, we release
// any holds we have over it
jumpEnabled=true;
canMove=true;
rigidbody.isKinematic=false;
// start the game ... with a jump!
doJump();
}
function OnTriggerEnter(fule: Collider){
if(fule.gameObject.tag == "fule"){
Debug.Log("We hit a fule box!");
fuel += 150.0;
}
}
public function gameEnd(){
// it's game over, so we stop any jumping from happening and lock out the movement controls with canMove=false
jumpEnabled=false;
canMove=false;
}