Use of unassigned local variable (582466)

Hi there!

I’m an artist who is trying to learn a little scripting to test my assets, I’m super new to it. A lot of the code is actually borrowed from elsewhere! I’d really appreciate some help with this problem.

Everything works when played in Unity, but i get the following error when i try to make a build:

(39/44): error CS0165: Use of unassigned local variable ‘ray’

using UnityEngine;
using System.Collections;

public class PlayerMovement : MonoBehaviour {
    //flag to check if the user has tapped / clicked. 
    //Set to true on click. Reset to false on reaching destination
    private bool flag = false;
    //destination point
    private Vector3 endPoint;
    //alter this to change the speed of the movement of player / gameobject
    public float duration = 50.0f;
    private Animator anim;
    public Vector3 startPosition;
   
    void Start(){
        startPosition = transform.position;
        anim = GetComponent<Animator>();
    }
   
    // Update is called once per frame
    void Update () {

        //check if the screen is touched / clicked  
        if((Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) || (Input.GetMouseButtonDown(0)))
        {
            //declare a variable of RaycastHit struct
            RaycastHit hit;
            //Create a Ray on the tapped / clicked position
            Ray ray;
            //for unity editor
            #if UNITY_EDITOR
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //for touch device
            #elif (UNITY_ANDROID || UNITY_IPHONE || UNITY_WP8)
            ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
            #endif
           
            //Check if the ray hits any collider
            if(Physics.Raycast(ray, out hit))
            {
                //set a flag to indicate to move the gameobject
                flag = true;
                //save the click / tap position
                endPoint = hit.point;
                Debug.Log(endPoint);
                anim.SetFloat("SpeedX", endPoint.x);
                anim.SetFloat("SpeedY", endPoint.y);
            }               

        }
        //check if the flag for movement is true and the current gameobject position is not same as the clicked / tapped position
        if(flag && !Mathf.Approximately(gameObject.transform.position.magnitude, endPoint.magnitude)){ //&& !(V3Equal(transform.position, endPoint))){
            //move the gameobject to the desired position
            gameObject.transform.position = Vector3.Lerp(gameObject.transform.position, endPoint, 1/(duration*(Vector3.Distance(gameObject.transform.position, endPoint))));
        }
        //set the movement indicator flag to false if the endPoint and current gameobject position are equal
        else if(flag && Mathf.Approximately(gameObject.transform.position.magnitude, endPoint.magnitude)) {
            flag = false;
            Debug.Log("I am here");
        }
        {
            if(flag && !Mathf.Approximately(gameObject.transform.position.magnitude, endPoint.magnitude)) {
                anim.SetBool("walking", true);
            } else if (flag && Mathf.Approximately(gameObject.transform.position.magnitude, endPoint.magnitude)) {
                anim.SetBool("walking", false);
                    }
       
        }

    }
}

I believe your conditional compilation means that the compiler can’t be sure that ray has been assigned a value before it is used in line 39.

Changing line 29 to Ray ray = null; should allow it to compile, however you should really change your conditional compilation block to have a default part which also initializes the variable ray, to guard against possible run time errors.

Thanks Munchy2007

I tried out your suggestion and got the following error:

CS0037: Cannot convert null to ‘UnityEngine.Ray’ because it is a value type

As for your other suggestion, I’m still too new to this to understand what you mean :stuck_out_tongue: I need to spend some more time doing the basic tutorials.

A Ray is a struct, and cannot be null.

Your problem is probably that your #if chain does not have a ‘default’ condition, and though I’m not familiar with all the preprocessor directives, I’d bet that you’re building in a situation where none of those are true. I’d restructure it so that the “using mouse” code is the default fallback, rather than being specific to the editor:

#if (UNITY_ANDROID || UNITY_IPHONE || UNITY_WP8)
            ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
            #else
            ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            #endif

Yay! It will build now :smile:

Thanks very much StarManta!

if((Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began) || (Input.GetMouseButtonDown(0)))
{
//rb.AddForce(transform.up * thrust);
//declare a variable of RaycastHit struct
RaycastHit hit;
//Create a Ray on the tapped / clicked position
Ray ray;

#if (UNITY_ANDROID || UNITY_IPHONE || UNITY_WP8)
ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
#else
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
#endif
//Check if the ray hits any collider
if(Physics.Raycast(ray,out hit))
{
//set a flag to indicate to move the gameobject
flag = true;
//save the click / tap position
endPoint = hit.point;
//as we do not want to change the y axis value based on touch position, reset it to original y axis value
endPoint.y = yAxis;
}

}
//check if the flag for movement is true and the current gameobject position is not same as the clicked / tapped position
if(flag && !Mathf.Approximately(gameObject.transform.position.magnitude, endPoint.magnitude)){ //&& !(V3Equal(transform.position, endPoint))){
//move the gameobject to the desired position
gameObject.transform.position = Vector3.Lerp(gameObject.transform.position, endPoint, 4/(duration*(Vector3.Distance(gameObject.transform.position, endPoint))));
}
//set the movement indicator flag to false if the endPoint and current gameobject position are equal
else if(flag && Mathf.Approximately(gameObject.transform.position.magnitude, endPoint.magnitude)) {
flag = false;
Debug.Log(“I am here”);
}
}

i am getting the same error pls someone help me

error CS0165: Use of unassigned local variable ‘ray’ : 15th line