stef_7

2 answers · asked · Lesson: Setting up the Spaceship · Course: Creating a 2D Space Shooter

This version of the spaceship script works in Unity 2018

I had problems making the spaceship script work (haven't tried the bullet script yet). Here are the changes I've done to the script to make it work for me in Unity 2018 :

- the rigidbody2D.AddForce()... line is not working in Unity 2018. I've changed this line and added 2 other lines (look for them in the vicinity of the void Start() line)
-  my spaceship was jumping to one corner of the screen just after the start of the game. The reason was the values for screenSW and screenNE were inverted so I changed the lines were they get their values and it fixed the problem.  EDIT : no need to do this change, problem was my camera was not set properly, it needs to be set to 'orthographic'

Here's the whole script.

******************************************************************

using UnityEngine;

using System.Collections;

using System.Collections.Generic;


public class Spaceship : MonoBehaviour {


    public GameObject spaceshipBulletPrefab;


    public float speed =  1f;

    public float turnSpeed = 1f;

    public float fireRate = 0.5f;


    private float accelRate = 0f;

    private Animator animator;

    private Vector3 screenSW;

    private Vector3 screenNE;

    private float wrapPadding = 1f;

    private bool hit = false;

    private float nextFire;


   public Rigidbody2D rb2D;


   // Use this for initialization


   void Start () {

        animator = GetComponent<Animator>();


       rb2D = GetComponent<Rigidbody2D>();


       screenNE = Camera.main.ScreenToWorldPoint(new Vector3(0, 0, Camera.main.transform.localPosition.z));

 

       screenSW = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height, Camera.main.transform.localPosition.z));

   

   }

    

    // Update is called once per frame

    void Update () {

        float translation = Input.GetAxis("Vertical");

        float rotation = Input.GetAxis("Horizontal");


        if(rotation > 0){

            TurnRight(rotation);

        }

        else if(rotation < 0){

            TurnLeft(rotation);

        }


        if(translation >= 0.5f){

            Move(translation);

        }

        else{

            Idle();

        }


        if(Input.GetButton("Jump")){

            ShootBullet();

        }



       rb2D.AddForce(transform.up * (speed * accelRate));



       

       if (transform.localPosition.x < screenSW.x - wrapPadding){

            transform.localPosition = new Vector3(screenNE.x, transform.localPosition.y, transform.localPosition.z);

        }

        else if(transform.localPosition.x > screenNE.x + wrapPadding){

            transform.localPosition = new Vector3(screenSW.x, transform.localPosition.y, transform.localPosition.z);

        }


        if(transform.localPosition.y < screenSW.y - wrapPadding){

            transform.localPosition = new Vector3(transform.localPosition.x, screenNE.y, transform.localPosition.z);

        }

        else if(transform.localPosition.y > screenNE.y + wrapPadding){

            transform.localPosition = new Vector3(transform.localPosition.x, screenSW.y, transform.localPosition.z);

        }

       

    }


    public void TurnRight(float rotation = 1){

        if(hit){

            return;

        }


        transform.Rotate(Vector3.back * (rotation * turnSpeed));

    }


    public void TurnLeft(float rotation = 1){

        if(hit){

            return;

        }

        

        transform.Rotate(Vector3.forward * (rotation * -turnSpeed));

    }


    public void Move(float accel){

        if(hit){

            return;

        }


        accelRate = accel;


        animator.SetInteger("State", 1);

    }


    public void Idle(){

        if(hit){

            return;

        }


        accelRate = accelRate * 0.5f;


        animator.SetInteger("State", 0);

    }


    public void ShootBullet(){

        if(hit){

            return;

        }


        if(Time.time > nextFire){

            nextFire = Time.time + fireRate;

            Instantiate(spaceshipBulletPrefab, transform.localPosition, transform.localRotation);

        }

    }

}


  • crew

    Great!  I may need to go through the project files to see what needs to be updated. From time to time Unity changes the script API and usually  makes it easy on you by updating the script for you. Sometimes you'll see a popup say that Unity will update your scripts and it'll add that kind of stuff in. 

  • Yes, I've seen this kind of pop up at times. My guess is it's more likely to happen if the version of Unity is not too different from the old one (maybe just one or two generations more recent).

    Anyway, I'm more than halfway into the tutorial now and that's the only change I had to do (btw, this is a very nice project to do :-)  ).

    About the lines where I swapped the definitions of screenSW and screenNE, the problem was not the script but my camera. It was set to perspective instead of orthographic.