"null texture passed" for any texture2D other than the 2 originals.

GUI.DrawTexture working for 2 textures, but not for others. Code functions fine otherwise, but it is giving “null texture passed” for any texture2D other than the 2 originals.

I’m afraid I simply have not been able to find a copy of this same problem, so I apologize if it exists somewhere already.

I am having an issue when using the GUI.DrawTexture in the function OnGUI to create “cast bars” that essentially have a static bar texture, then a second texture which filsl up or depletes based on a variable.

The problem arises in that the first bar works completely. However when a second bar was added with its own textures, Unity begins to fill up with hundreds of these:

null texture passed to GUI.DrawTexture
UnityEngine.GUI:DrawTexture(Rect, Texture)
Controller:OnGUI() (at Assets/Scripts/Controller.js:121)

The problem I do not understand is that I am creating the Texture2D area for these 2 new textures exactly how I am doing it for the first 2, am filling the variable slot on the inspector with the files, but they will not load. If I simply use the original 2 texture2D textures in place of the new variables, everything works fine.

So, why am I unable to load 4 Texture2D textures? Why do only the first 2 work? I’ll paste the code I think matters (omitting the rest of the script), but can post more if needed (please note the ones labeled “progress bar” work, while everything labeled the GCD bar works code-wise but is not loading the textures):

//GCD Bar
var gcdProgress : float = 0.0;
var bar02 : Texture2D;
var bar03 : Texture2D;

//Progress bar
var progress : float = 0.0;
var progressBarEmpty : Texture2D;
var progressBarFull : Texture2D;

//Function Update isn't as important for this question, just showing where the progress bars are being updated.
function Update () {
	//Progress Bar
	progress = castbarPub * 0.01;
	
	//GCD Bar
	gcdProgress = globalCoolDownPub * 2;
}


function OnGUI(){
	//GCD Bar
	GUI.DrawTexture(Rect(500, 496, 200, 4), bar02);
	GUI.DrawTexture(Rect(500, 496, 200 * Mathf.Clamp01(gcdProgress), 4), bar03);

	//Progress bar
	GUI.DrawTexture(Rect(500, 500, 200, 40), progressBarEmpty);
	GUI.DrawTexture(Rect(500, 500, 200 * Mathf.Clamp01(progress), 40), progressBarFull);
}

There’s obviously a lot of other code omitted but none of it should be interacting with this other than to adjust the variables being used for the progress. I can post it all if need be, however.

Further info would be that the textures that do work are named “BarEmpty” and “BarFull”. They are both saved as .tiff and are 200x40 in size. The files that have not worked have been 200x10 and 200x4, and have been named a few different things (I don’t think the texture name should matter as long as it has been dragged into the appropriate variable slot on the script?). This is all in Unity Free 4.1.3

Any help with figuring this out is greatly appreciated, or even a nudge in the right direction if someone already asked this question. All I could find myself were people trying to use the function in function Update or just incorrect code, not a problem with code working but these textures not loading. Also if this is not formatted in a way that people tend to expect or need, please let me know.

EDIT: Holy formatting batman.

EDIT 2: Unity Version is 4.1.3 Free.

Edit 3: Here is the full script named “Controller” (There are some variables that probably don’t need to exist and need cleaning up, but none should be initializing incorrectly):

#pragma strict

//Gobal Cooldown
static var globalCoolDownPub : float = 0.0;
static var gcdPub = false;
static var canDragPub = false;

//Tells that the autocast is currently functioning
static var autoCastPub = false;

//Whether the player can cast or not?
static var canCastPub : boolean = true;

static var isMouseClickedPub : boolean = false;

//Tells when the cast has ended and a new cast can be started.
static var castOverPub : boolean = true;

//Is there currently something being cast
static var castInProgressPub : boolean = false;

//Which bucket is currently being targeted*
static var targetBucketPub : float = 0.0;

//Which ability is currently highlighted*
static var currentAbilityPub : float = 2.0;

//CastBar*
static var castbarPub : float = 0.0;

//Tells the game to reset the cast bar*
static var castResetPub : boolean = false;

//Cast Speeds
static var medCastPub : float = 0.0;
static var bigCastPub : float = 0.0;
static var aoeCastPub : float = 0.0;

var medCastSpeed : float = 0.0;
var bigCastSpeed : float= 0.0;
var aoeCastSpeed : float = 0.0;

//GCD Bar
var gcdProgress : float = 0.0;
var bar02 : Texture2D;
var bar03 : Texture2D;

//Progress bar
var progress : float = 0.0;
var progressBarEmpty : Texture2D;
var progressBarFull : Texture2D;

function Start () {
	//Set public vars to private var values
	medCastPub = medCastSpeed;
	bigCastPub = bigCastSpeed;
	aoeCastPub = aoeCastSpeed;

}

function Update () {
	//GCD
	if(globalCoolDownPub <= 0){
		globalCoolDownPub = 0;
		gcdPub = false;
	}
	if(globalCoolDownPub != 0){
		globalCoolDownPub -= 1 * Time.deltaTime;
	}
	//Progress Bar
	progress = castbarPub * 0.01;
	
	//GCD Bar
	gcdProgress = globalCoolDownPub * 2;
	
	//Changes current ability
	if(Input.GetKey(KeyCode.Alpha1) && castInProgressPub == false){
		currentAbilityPub = 1;
	}
	if(Input.GetKey(KeyCode.Alpha2) && castInProgressPub == false){
		currentAbilityPub = 2;
	}
	if(Input.GetKey(KeyCode.Alpha3) && castInProgressPub == false){
		currentAbilityPub = 3;
	}
	if(Input.GetKey(KeyCode.Alpha4) && castInProgressPub == false){
		currentAbilityPub = 4;
	}
	if(Input.GetKey(KeyCode.Alpha5) && castInProgressPub == false){
		currentAbilityPub = 5;
	}
	
	//Reset the cast bar if casting is canceled before 80%
	if(castResetPub == false && castbarPub < 80 || castResetPub == false && castbarPub >= 100){
		castbarPub = 0;
		targetBucketPub = 0;
		castInProgressPub = false;
		canCastPub = true;
	}
	
	//Prevents the cast bar from exceeding 100% and causes it to reset to 0 upon completion
	if(castbarPub >= 100){
		castbarPub = 0;
		targetBucketPub = 0;
		castInProgressPub = false;
		castResetPub = true;
		autoCastPub = false;
	}
	if(castbarPub == 0 && isMouseClickedPub == false){
		canCastPub = true;
	}
}

function OnGUI(){
	//debug GUI
	GUI.Label(Rect(10,10,200,20), "Castbar: " + castbarPub);
	GUI.Label(Rect(10,30,200,20), "Reset: " + castResetPub);
	GUI.Label(Rect(10,50,200,20), "Ability: " + currentAbilityPub);
	GUI.Label(Rect(10,70,200,20), "Target: " + targetBucketPub);
	GUI.Label(Rect(10,90,200,20), "GCD: " + globalCoolDownPub);

	//GCD Bar
	GUI.DrawTexture(Rect(500, 496, 200, 4), progressBarEmpty);
	GUI.DrawTexture(Rect(500, 496, 200 * Mathf.Clamp01(gcdProgress), 4), progressBarFull);

	//Progress bar
	GUI.DrawTexture(Rect(500, 500, 200, 40), progressBarEmpty);
	GUI.DrawTexture(Rect(500, 500, 200 * Mathf.Clamp01(progress), 40), progressBarFull);
}

And then, if needed, the other script named “BucketScript01” running with it:

#pragma strict

function Start () {

}

function Update () {
	if(Controller.castbarPub >= 80 && Controller.castbarPub <= 100 && Controller.targetBucketPub == 1 && Controller.currentAbilityPub == 2){
		Controller.autoCastPub = true;
		Controller.castResetPub = true;
		Controller.canCastPub = false;
		Controller.castbarPub += Controller.medCastPub * Time.deltaTime;
		transform.Rotate(0,0,5);
	}
	if(Controller.castbarPub >= 80 && Controller.castbarPub <= 100 && Controller.targetBucketPub == 1 && Controller.currentAbilityPub == 3){
		Controller.autoCastPub = true;
		Controller.castResetPub = true;
		Controller.canCastPub = false;
		Controller.castbarPub += Controller.bigCastPub * Time.deltaTime;
		transform.Rotate(0,0,2);
	}
}

function OnMouseDown () {
	//isMouseClicked flags true when the mouse has been clicked and unflags when it is unclicked.
	Controller.isMouseClickedPub = true;
	//Checks if the global cooldown is currently active
	if(Controller.gcdPub == false){
		//If the GCD is inactive, flags that the drag may work
		Controller.canDragPub = true;
	}
	if(Controller.globalCoolDownPub == 0 && Controller.castInProgressPub == false){
		Controller.globalCoolDownPub = 0.5;
		Controller.gcdPub = true;
	}
}

function OnMouseDrag () {
	if(Controller.canCastPub == true && Controller.canDragPub == true && Controller.currentAbilityPub == 2 && Controller.autoCastPub == false){
		if(Controller.castbarPub < 80){
			//Sets the target bucket to this bucket
			Controller.targetBucketPub = 1;
			//ResetPub tells the cast bar to reset to 0 if the mouse is let up before the casting finishes
			Controller.castResetPub = true;
			//CastInProgress flags true if a cas is in progress. Unused currently.
			Controller.castInProgressPub = true;
			//Counts up the cast bar
			Controller.castbarPub += Controller.medCastPub * Time.deltaTime;
			//Rotates the object to show it is working.
			transform.Rotate(0,0,5);
		}
	}
	if(Controller.canCastPub == true && Controller.canDragPub == true && Controller.currentAbilityPub == 3 && Controller.autoCastPub == false){
		if(Controller.castbarPub < 80){
			Controller.targetBucketPub = 1;
			Controller.castResetPub = true;
			Controller.castInProgressPub = true;
			Controller.castbarPub += Controller.bigCastPub * Time.deltaTime;
			transform.Rotate(0,0,2);
		}
	}
}

function OnMouseUp () {
	//isMouseClicked flags true when the mouse has been clicked and unflags when it is unclicked.
	Controller.isMouseClickedPub = false;
	//ResetPub tells the cast bar to reset to 0 if the mouse is let up before the casting finishes
	Controller.castResetPub = false;
	Controller.canDragPub = false;
}

From your comments I guess you just assigned the textures to the “default references” of the script itself but not on your actual instance. The default references are only used when the script component is added to a GameObject to initialize the variables. I guess that you already have an instance of your script in your scene or on a prefab and there you don’t have the textures assigned since you set the default references afterwards.

Such things can easily be verified. When you test inside the editor, just select your GameObject in the scene that has the script attached. Now you can see if the textures are assigned or not.

The default references are quite handy if you need to assign a lot of textures / sounds / … but use them with caution. Default references are also included into a build, even when they aren’t used. If you don’t create a lot instances of your script in the editor you should avoid using default references. Just assign the textures directly on your object.