I am making an RTS and whenever I try to click on a unit, it returns with an error saying
NullReferenceException: Object
reference not set to an instance of an
object MousePoint.Update () (at
Assets/Standard
Assets/Scripts/MousePoint.cs:112)
This is my script, please help.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MousePoint : MonoBehaviour {
#region Class Variables
RaycastHit hit;
public GameObject Target;
public static GameObject CurrentlySelectedUnit;
public static ArrayList CurrentlySelectedUnits = new ArrayList();
public static ArrayList UnitsOnScreen = new ArrayList ();
public static ArrayList UnitsInDrag = new ArrayList();
private static Vector3 mouseDownPoint;
private static bool UserIsDragging;
private static float TimeLimitBeforeDeclareDrag = 1f;
private static float TimeLeftBeforeDeclareDrag;
private static Vector2 MouseDragStart;
private static float clickDragZone = 1.3f;
private bool FinishedDragOnThisFrame;
//GUI
public LayerMask SelectMeshLayerMask;
#endregion
// Update is called once per frame
void Update ()
{
Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
if (Physics.Raycast (ray, out hit, Mathf.Infinity)) {
//Store point at mouse button down
if (Input.GetMouseButtonDown (0)) {
mouseDownPoint = hit.point;
//Mouse drag
if (Input.GetMouseButtonDown (0))
{
TimeLeftBeforeDeclareDrag = TimeLimitBeforeDeclareDrag;
MouseDragStart = Input.mousePosition;
}
else if (Input.GetMouseButton (0))
{
//If user is not dragging, do tests
if (!UserIsDragging)
{
TimeLeftBeforeDeclareDrag -= Time.deltaTime;
if (TimeLeftBeforeDeclareDrag <= 0f)
{
//If tests pass true, user is dragging
UserIsDragging = true;
}
}
//User is dragging, lets compete (GUI)
//if(UserIsDragging)
//Debug.Log("User is dragging!");
}
else if (Input.GetMouseButtonUp (0))
{
TimeLimitBeforeDeclareDrag = 0f;
UserIsDragging = false;
}
}
if (hit.collider.name == "TerrainMain") {
//When we click the right mouse button, instantiate target
if (Input.GetMouseButtonDown (1)) {
GameObject TargetObj = Instantiate (Target, hit.point, Quaternion.identity) as GameObject;
TargetObj.name = "Target Instantiated";
} else if (Input.GetMouseButtonUp (0) && DidUserClickLeftMouse (mouseDownPoint))
{
if(!CTRLKeysDown())
DeselectGameObjectsIfSelected ();
}
} //End of the terrain
else {
//Hitting other objects
if (Input.GetMouseButtonUp (0) && DidUserClickLeftMouse (mouseDownPoint))
{
//Is the user hitting a unit?
if (hit.collider.gameObject.GetComponent<Unit>() || hit.collider.gameObject.layer == LayerMask.NameToLayer("SelectMesh"))
{
Transform UnitGameObject;
if (hit.collider.gameObject.layer == LayerMask.NameToLayer ("SelectMesh"))
UnitGameObject = hit.collider.transform.parent.transform;
else
UnitGameObject = hit.collider.transform;
//Are we selecting a different object?
if (!UnitAlreadyInCurrentlySelectedUnits (UnitGameObject.gameObject))
{
//If the CTRL key is not down, remove the rest of the units
if (!CTRLKeysDown ())
DeselectGameObjectsIfSelected ();
GameObject SelectedObj = UnitGameObject.Find("Selected").gameObject;
SelectedObj.active = true;
//Add unit to currently selected units
CurrentlySelectedUnits.Add (UnitGameObject.gameObject);
//Change unit Selected value to true
UnitGameObject.gameObject.GetComponent<Unit> ().Selected = true;
} else {
//Unit is already in the currently selected units arraylist
//Remove the unit
if (CTRLKeysDown())
RemoveUnitFromCurrentlySelectedUnits (UnitGameObject.gameObject);
else
{
DeselectGameObjectsIfSelected ();
GameObject SelectedObj = UnitGameObject.transform.Find ("Selected").gameObject;
SelectedObj.active = true;
CurrentlySelectedUnits.Add (UnitGameObject.gameObject);
UnitGameObject.gameObject.GetComponent<Unit> ().Selected = true; //Need to show this
}
}
} else {
//If this object is not a unit
if(!CTRLKeysDown())
DeselectGameObjectsIfSelected ();
}
}
}
} else {
if (Input.GetMouseButtonDown (0) && DidUserClickLeftMouse(mouseDownPoint))
if(!CTRLKeysDown())
DeselectGameObjectsIfSelected ();
}
}
void LateUpdate()
{
}
#region Helper function
//Is user dragging, relative to mouse drag start point
public bool UserDraggingByPosition(Vector2 DragStartPoint, Vector2 NewPoint)
{
if(
(NewPoint.x > DragStartPoint.x + clickDragZone || NewPoint.x < DragStartPoint.x - clickDragZone) ||
(NewPoint.y > DragStartPoint.y + clickDragZone || NewPoint.y < DragStartPoint.y - clickDragZone)
)
return true;
else
return false;
}
//Check if a user clicked mouse
public bool DidUserClickLeftMouse(Vector3 hitPoint)
{
if(
(mouseDownPoint.x < hitPoint.x + clickDragZone && mouseDownPoint.x > hitPoint.x - clickDragZone) &&
(mouseDownPoint.y < hitPoint.y + clickDragZone && mouseDownPoint.y > hitPoint.y - clickDragZone) &&
(mouseDownPoint.z < hitPoint.z + clickDragZone && mouseDownPoint.z > hitPoint.z - clickDragZone)
)
return true; else return false;
}
//Deselects gameobject if selected
public static void DeselectGameObjectsIfSelected()
{
if (CurrentlySelectedUnits.Count > 0)
{
for (int i = 0; i < CurrentlySelectedUnits.Count; i++)
{
GameObject ArrayListUnit = CurrentlySelectedUnits *as GameObject;*
-
ArrayListUnit.transform.Find ("Selected").gameObject.active = false;*
-
ArrayListUnit.GetComponent<Unit> ().Selected = false;*
-
}*
-
CurrentlySelectedUnits.Clear();*
-
}*
-
}*
-
//Check if a unit is already in the currently selected units arraylist*
-
public static bool UnitAlreadyInCurrentlySelectedUnits(GameObject Unit)*
-
{*
-
if (CurrentlySelectedUnits.Count > 0) {*
-
for (int i = 0; i < CurrentlySelectedUnits.Count; i++) {*
_ GameObject ArrayListUnit = CurrentlySelectedUnits as GameObject;_
* if (ArrayListUnit == Unit)*
* return true;*
* }*
* return false;*
* } else*
* return false;*
* }*
* //Remove a unit from the currently selected units arraylist*
* public void RemoveUnitFromCurrentlySelectedUnits(GameObject Unit)*
* {*
* if (CurrentlySelectedUnits.Count > 0) {*
* for (int i = 0; i < CurrentlySelectedUnits.Count; i++) {*
_ GameObject ArrayListUnit = CurrentlySelectedUnits as GameObject;
* if (ArrayListUnit == Unit)
{
CurrentlySelectedUnits.RemoveAt (i);
ArrayListUnit.transform.Find (“Selected”).gameObject.active = false;
}
}*_
* return;*
* } else*
* return;*
* }*
* //Are the control keys being held dowN?*
* public static bool CTRLKeysDown()*
* {*
* if (Input.GetKey(KeyCode.LeftControl))*
* return true;*
* else*
* return false;*
* }*
* //Check if a unit is within screen space to deal with mouse drag selection*
* public static bool UnitWithinScreenSpace(Vector2 UnitScreenPos)*
* {*
* if(*
* (UnitScreenPos.x < Screen.width && UnitScreenPos.y < Screen.height) &&*
* (UnitScreenPos.x > 0f && UnitScreenPos.y > 0f)*
* )*
* return true;*
* else*
* return false;*
* }*
* //Remove unit from screen units UnitsOnScreen arraylist*
* public static void RemoveFromOnScreenUnits(GameObject Unit)*
* {*
* for (int i = 0; i < UnitsOnScreen.Count; i++) {*
_ GameObject UnitObj = UnitsOnScreen as GameObject;
* if (Unit == UnitObj) {
UnitsOnScreen.RemoveAt (i);
UnitObj.GetComponent ().OnScreen = false;
return;
}*_
* return;*
* }*
* }*
* #endregion *
}