Search Unity

Problem with a parralaxing script in a brackeys tutorial

Discussion in '2D' started by Shippety, Oct 25, 2014.

  1. Shippety

    Shippety

    Joined:
    May 9, 2014
    Posts:
    31
    I was taking the “Bullet Trail” (
    ) and I messed up the code somehow, so I took a break from it for a week and went back to it. I deleted the changes I had made to the weapon script, and tried to play the game, and while it worked the mountains in the background wirred all over the place extremely fast. I got the error:
    NullReferenceException: Object reference not set to an instance of an object
    Parallaxing.Update () (at Assets/Parallaxing.cs:40)

    I had never seen a problem with the parralaxing before, and apparently it had something to do with both that script and the camerafollow2d script. Can anyone help? Here the the scripts:

    Parralaxing:

    using UnityEngine;
    using System.Collections;

    public class Parallaxing : MonoBehaviour {

    public Transform[] backgrounds; // Array (list) of all the back- and foregrounds to be parallaxed
    private float[] parallaxScales; // The proportion of the camera’s movement to move the backgrounds by
    public float smoothing = 1f; // How smooth the parallax is going to be. Make sure to set this above 0

    private Transform cam; // reference to the main cameras transform
    private Vector3 previousCamPos; // the position of the camera in the previous frame

    // Is called before Start(). Great for references.
    void Awake () {
    // set up camera the reference
    cam = Camera.main.transform;
    }

    // Use this for initialization
    void Start () {
    // The previous frame had the current frame’s camera position
    previousCamPos = cam.position;

    // asigning coresponding parallaxScales
    parallaxScales = new float[backgrounds.Length];
    for (int i = 0; i < backgrounds.Length; i++) {
    parallaxScales = backgrounds.position.z*-1;
    }
    }

    // Update is called once per frame
    void Update () {

    // for each background
    for (int i = 0; i < backgrounds.Length; i++) {
    // the parallax is the opposite of the camera movement because the previous frame multiplied by the scale
    float parallax = (previousCamPos.x – cam.position.x) * parallaxScales;

    // set a target x position which is the current position plus the parallax
    float backgroundTargetPosX = backgrounds.position.x + parallax;

    // create a target position which is the background’s current position with it’s target x position
    Vector3 backgroundTargetPos = new Vector3 (backgroundTargetPosX, backgrounds.position.y, backgrounds.position.z);

    // fade between current position and the target position using lerp
    backgrounds.position = Vector3.Lerp (backgrounds.position, backgroundTargetPos, smoothing * Time.deltaTime);
    }

    // set the previousCamPos to the camera’s position at the end of the frame
    previousCamPos = cam.position;
    }
    }

    And the camerafollow2d script:

    using UnityEngine;
    using System.Collections;

    public class Camera2DFollow : MonoBehaviour {

    public Transform target;
    public float damping = 1;
    public float lookAheadFactor = 3;
    public float lookAheadReturnSpeed = 0.5f;
    public float lookAheadMoveThreshold = 0.1f;

    float offsetZ;
    Vector3 lastTargetPosition;
    Vector3 currentVelocity;
    Vector3 lookAheadPos;

    // Use this for initialization
    void Start () {
    lastTargetPosition = target.position;
    offsetZ = (transform.position – target.position).z;
    transform.parent = null;
    }

    // Update is called once per frame
    void Update () {

    // only update lookahead pos if accelerating or changed direction
    float xMoveDelta = (target.position – lastTargetPosition).x;

    bool updateLookAheadTarget = Mathf.Abs(xMoveDelta) > lookAheadMoveThreshold;

    if (updateLookAheadTarget) {
    lookAheadPos = lookAheadFactor * Vector3.right * Mathf.Sign(xMoveDelta);
    } else {
    lookAheadPos = Vector3.MoveTowards(lookAheadPos, Vector3.zero, Time.deltaTime * lookAheadReturnSpeed);
    }

    Vector3 aheadTargetPos = target.position + lookAheadPos + Vector3.forward * offsetZ;
    Vector3 newPos = Vector3.SmoothDamp(transform.position, aheadTargetPos, ref currentVelocity, damping);

    transform.position = newPos;

    lastTargetPosition = target.position;
    }
    }
     
  2. vakabaka

    vakabaka

    Joined:
    Jul 21, 2014
    Posts:
    1,153
    cam = Camera.main.transform;

    may be something wrong with name or tag of your camera. Try set tag for camera MainCamera.
     
  3. Shippety

    Shippety

    Joined:
    May 9, 2014
    Posts:
    31
    That didn't seem to do much... Here are some errors that popped up if that helps:
    NullReferenceException: Object reference not set to an instance of an object
    Parallaxing.Update () (at Assets/Parallaxing.cs:40)