-1

Im making a platform game with Unity and Im programming with C#. I have a Ball Control script which handles the input and the physics behind its continuous bouncing. I also have a BounceTrigger script which make the ball stop and then make it bounce again. Im trying to implement a respawn with the player should be respawning at the last platform not destructible he has bounced over.

Ball Control Script public float velocity = 2;

bool alreadyBounced;
bool boost;
float boostMultiplier;
Vector3 boostVelocityAdd;

int fallY = 10;
BounceTrigger platform;

// Update is called once per frame
void Update () 
{
    alreadyBounced = false;

    float appliedVelocity = velocity * (boost ? boostMultiplier : 1);
    Vector3 direction = Vector3.zero;

    if(Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A)) { direction = Vector3.left; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange);}
    if(Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D)) { direction = Vector3.right; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange);}
    if(Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.W)) { direction = Vector3.forward; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange);}
    if(Input.GetKeyDown(KeyCode.DownArrow) || Input.GetKeyDown(KeyCode.S)) { direction = -Vector3.forward; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange); }

    if(Input.GetKeyUp(KeyCode.LeftArrow) || Input.GetKeyUp(KeyCode.A)) { direction = -Vector3.left; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange); }
    if(Input.GetKeyUp(KeyCode.RightArrow) || Input.GetKeyUp(KeyCode.D)){ direction = -Vector3.right; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange); }
    if(Input.GetKeyUp(KeyCode.UpArrow) || Input.GetKeyUp(KeyCode.W)) { direction = -Vector3.forward; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange); }
    if(Input.GetKeyUp(KeyCode.DownArrow) || Input.GetKeyUp(KeyCode.S)) { direction = Vector3.forward; rigidbody.AddForce(direction * appliedVelocity, ForceMode.VelocityChange); }
    CheckFalling ();
}

public void CheckFalling(){
    if(this.transform.position.y < fallY){
        Respawn();
    }
}

public void Respawn(){
    this.transform.position = lastPlatform.transform.position + Vector3.up;
}



public void Bounce(BounceTrigger platform, float upVelocity) {

    var reboteGO = (GameObject) GameObject.FindWithTag ("TextoRebote");
    var reboteComp = reboteGO.GetComponent<BounceCounter>();

    if(!alreadyBounced)
    {
        if(!platform.isDestructible){
            lastPlatform = platform;
        }

        Debug.Log("Bounce");
        alreadyBounced = true;
        reboteComp.AumentarRebote();
        float downVelocity = rigidbody.velocity.y;
        rigidbody.AddForce(Vector3.up * (-downVelocity + upVelocity), ForceMode.VelocityChange);
        ResetBoost();
    }
}

public void Boost(float multiplier){
    if(!boost){
        Debug.Log("Boost");
        StartCoroutine(BoostCoroutine(multiplier));
    }
}

public void ResetBoost(){
    if(boost){
        Debug.Log("Reset boost");
        boost = false;
        Vector3 velocityAdd = rigidbody.velocity;
        velocityAdd.x = velocityAdd.x / boostMultiplier * (boostMultiplier - 1);
        velocityAdd.z = velocityAdd.z / boostMultiplier * (boostMultiplier - 1);
        velocityAdd.y = 0;
        rigidbody.AddForce(-velocityAdd, ForceMode.VelocityChange);
    }
}

public void RestarVida(){
    var vidaGO = (GameObject) GameObject.FindWithTag ("TextoVida");
    var vidaComp = vidaGO.GetComponent<LifeCounter>();
    vidaComp.RestarVida ();
}

IEnumerator BoostCoroutine(float multiplier){
    yield return 0;
    yield return new WaitForFixedUpdate();
    boost = true;
    boostMultiplier = multiplier;
    Vector3 velocityAdd = rigidbody.velocity;
    Debug.Log(velocityAdd);
    velocityAdd.x = velocityAdd.x * (boostMultiplier - 1);
    velocityAdd.z = velocityAdd.z * (boostMultiplier - 1);
    velocityAdd.y = 0;
    rigidbody.AddForce(velocityAdd, ForceMode.VelocityChange);
    Debug.Log(velocityAdd);
}

Bounce Trigger script: ` public float upVelocity = 10;

public bool isDestructible = false;

public virtual void OnTriggerEnter(Collider collider){
    collider.GetComponent<BallControl>().Bounce(this, upVelocity);
}

when I compile this I get a nullReferenceException `

CodeSmile
  • 64,284
  • 20
  • 132
  • 217
Marcos Costa
  • 1
  • 1
  • 4

1 Answers1

0

You have a global variable BounceTrigger platform; instead of BounceTrigger lastPlatform;, so lastPlatform don't exists anywhere in your code.

Jorge Fuentes González
  • 11,568
  • 4
  • 44
  • 64
  • Oh thanks for fast answer. Now I got a NullReferenceException: "NullReferenceException: Object reference not set to an instance of an object BallControl.Respawn () (at Assets/GameAssets/Scripts/BallControl.cs:44) BallControl.CheckFalling () (at Assets/GameAssets/Scripts/BallControl.cs:39) BallControl.Update () (at Assets/GameAssets/Scripts/BallControl.cs:34)" – Marcos Costa Jan 19 '15 at 18:21
  • try `this.Respawn()`. And the same to all functions. Call them using `this.`. Btw, I'm not a c# user so I don't know exactly what is happening. – Jorge Fuentes González Jan 19 '15 at 18:31