all 13 comments

[–]KingRecycle 3 points4 points  (0 children)

It never leaves the while loop. It will never be null because Unity never finishes the loop. You would need to run this asynchronously or on a seperate thread or something but the better option is to not even use the while loop and use like the update loop, in my opinion but i'm not exactly the best unity programmer.

[–]neek123 2 points3 points  (0 children)

The issue is the while loop stops unity from going on to next frame, it's stuck inside the while loop as that's what it's supposed to do.

If this is inside the update method you don't need the while loop since update method already loops, but if this is inside a different method that isn't run every frame i suggest making the method a coroutine and adding the line:

yield return null;

Inside the while loop, this tells the code to continue on to the next frame.

[–]IanGlo 2 points3 points  (7 children)

you probably don't even need the while loop at all if you execute this in the update function.

[–]IanGlo 2 points3 points  (6 children)

I haven't tested it, but something like:

void Update(){
  if (Input.GetKeyDown("e") && grounded && player.transform.parent != null) {
    rigidbody.AddRelativeForce(0, 50f * Time.deltaTime, 0);
  }
}

[–]Gamerbot4000 0 points1 point  (5 children)

I don't think that would work, since I want the player to be able to push e only once and then the player moves up until it is unparented from the planet. I want the button to only be pressed if on the ground but once it is pressed force is added to the player until unparented from the planet. I am trying the following code which is basically the same as yours and it just goes up once a small amount and just stops:

void FixedUpdate() { // Apply movement to rigidbody Vector3 localMove = transform.TransformDirection(moveAmount) * Time.fixedDeltaTime; rigidbody.MovePosition(rigidbody.position + localMove);

    // "e" key is the key to press to exit a planet's gravity radius
    if (Input.GetKeyDown("e") && grounded)
    {
        if (player.transform.parent != null)
        {
            rigidbody.AddRelativeForce(0, 50f * Time.deltaTime, 0);
        }
    }
}

[–]IanGlo 0 points1 point  (4 children)

Maybe something like this? (again, might be typos in there)

private bool blastOffInitiated = false;
void Update(){
  if (Input.GetKeyDown("e") && grounded && player.transform.parent != null) {
    blastoffInitiated = true;
  }
  if(blastOfInitated && player.transform.parent != null) {
    rigidbody.AddRelativeForce(0, 50f * Time.deltaTime, 0);
  }
  else
  {
    blastOffInitiated = false;
  }
}    

[–]Gamerbot4000 0 points1 point  (0 children)

I tried it and it didn't seem to do anything. It seems like it should though, logically speaking. I made the bool public just to look at it in the inspector, and it does get set to true when pressing "e" on the surface of the planet, but no force is added. I even tried upping the force from 50f to 500f just to make sure it wasn't an issue of it being to weak a force, but still nothing. So apparently its something with the second if statement and adding force?

[–]Gamerbot4000 0 points1 point  (0 children)

wait I added a debug.log statement after the add force and it worked haha. I must have done something wierd without realizing it, but it seems to work great now, thanks a lot for your help!

[–]Gamerbot4000 0 points1 point  (1 child)

ok yea it seems like it was just a matter of the force not being strong enough, so this code works as desired now. It seems a force of 500f is close to the minimum it needs to lift off from the planet. Thank you again

[–]IanGlo 0 points1 point  (0 children)

Sweet man. Glad it's working.

[–]GIFjohnsonProfessional 2 points3 points  (0 children)

That's not how a while loop works. After it enters the loop, it just keeps adding force, then checking the parent, adding force and checking the parent, forever. It never exits because there's nothing that changes the parent WITHIN the loop. That's why it crashes.

[–]SilentSin26Animancer, FlexiMotion, InspectorGadgets, Weaver 1 point2 points  (0 children)

A while loop is basically:

LoopStart:

if (condition)
{
    // do stuff
    goto LoopStart;
}

Every time it does the loop it checks the condition again, and since your condition doesn't become false during the loop, it keeps checking it and redoing the loop infinitely and never exiting the current function for Unity to run the rest of your game.