- Home /
Object reference not set to an instance of an object
I am trying to reference a script but it keeps giving me this error. This is the code
var AttackCombo : AttackCombo;
function Awake ()
{
AttackCombo.Test();
and this is the script i'm trying to reference
public var attackTime : float[]; // store each length of each attack in order (in the inspector)
//public var attackAnimations : AnimationClip[]; // store a reference to the animations, then use the same index 'attackType'
public var waitTime : float = 10; // how long player has to hit LMB after last attack has finished
private var attackTimer : float = 0.0; // timer variable
private var attackType : int = -1; // reference to what attack the combo is up to (-1 is none, 0+ is the array index for attackTime )
//private var attack
enum attack { Idle, Attacking, Waiting } // different states while the combo inputs are being checked
var attackState : attack; // current attack input state (public for viewing in the Inspector)
var test : int = 0;
var totalChainedHits : int = 0; // total Chained Hits without missing a LMB press (public for viewing in the Inspector)
function Start()
{
// set defaults
attackType = -1;
attackState = attack.Idle;
// tell animation to play Idle
totalChainedHits = 0;
// You could set up the attackTime array here (and make it private)
attackTime = new float[3];
attackTime[0] = 0.5;
attackTime[1] = 0.5;
attackTime[2] = 0.5;
}
function Test () {
test++;
}
function Update()
{
CheckForPlayerAttackInput();
}
function CheckForPlayerAttackInput()
{
switch( attackState ) // what state is the combo in
{
case attack.Idle :
if ( Input.GetMouseButtonDown(0) ) // start attacking
{
animation.CrossFade("Attack");
attackType = 0;
attackState = attack.Attacking;
attackTimer = attackTime[0];
// tell animation to play attack 0 (first attack)
totalChainedHits = 1;
}
break;
case attack.Attacking :
attackTimer -= Time.deltaTime; // wait for attackTimer
if ( attackTimer < 0 )
{
attackTimer = waitTime;
attackState = attack.Waiting;
}
/* // uncomment this to break the combo while attacking
if ( Input.GetMouseButtonDown(0) ) // break attack
{
attackType = -1;
attackState = attack.Idle;
// tell animation to play Idle
}
*/
break;
case attack.Waiting :
attackTimer -= Time.deltaTime; // check the Waiting Timer (attackTimer)
if ( attackTimer < 0 ) // ran out of time to chain combo
{
attackType = -1;
attackState = attack.Idle;
// animation.CrossFade("Idle");
// tell animation to play Idle
}
if ( Input.GetMouseButtonDown(0) ) // continue attacking
{
// animation.CrossFade("Attack1");
attackType ++; // go to next attack
if ( attackType >= attackTime.Length ) // check if the combo is over, start a new combo
{
attackType = 0;
attackState = attack.Attacking;
attackTimer = attackTime[0];
// tell animation to play attack 0 (first attack)
animation.CrossFade("Attack");
totalChainedHits ++;
}
else
{
attackState = attack.Attacking;
attackTimer = attackTime[ attackType ];
animation.CrossFade("Combo");
// tell animation to play attack 'attackType' (next attack in array)
totalChainedHits ++;
}
}
break;
}
}
// example GUI for testing this script
function OnGUI()
{
GUI.Box( Rect( 10, 10, 100, 25 ), "Hit " + attackType.ToString() );
GUI.Box( Rect( 10, 60, 100, 25 ), "Hit " + test.ToString() );
GUI.Box( Rect( (Screen.width * 0.5) - 50, 10, 100, 25 ), "" + attackState.ToString() );
GUI.Box( Rect( Screen.width - 110, 10, 100, 25 ), "Total " + totalChainedHits.ToString() );
GUI.Box( Rect( (Screen.width * 0.5) - 50, 45, 100, 25 ), "" + attackTimer.ToString() );
}
Answer by getyour411 · Feb 15, 2014 at 09:06 PM
Ok, I tried that and then I got this error
The name 'AttackCombo' does not denote a valid type ('not found'). Did you mean 'UnityEngine.AddComponent$$anonymous$$enu'?
I've added this
private var attackCombo : AttackCombo;
and this
function Awake ()
{
attackCombo = GetComponent(AttackCombo);
}
and this
function Start () {
attackCombo.Test();
}
and this is my test function in attackCombo
function Test () {
Debug.Log("Test Recieved");
}
Please don't post follow-ups as Answers, I converted this one for you. This is looking much better, nearly there. Is your script actually called AttackCombo and it attached to the same GameObject as the 1st script that's trying to reference it?
The actual script is attackCombo and yes, it is attached to the same GameObject as the script that is trying to reference it
Not to be nitpicky but since Computers are... is the script named AttackCombo or attackCombo? If it's lowercase, you need to change things a bit (as a standard, not required, Classes/Scripts are often Uppercase and the variable assigned to hold the reference is usually lowercase). Sounds like you might have it the other way around?