Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. Dismiss Notice

AI Path-finding error

Discussion in 'Scripting' started by Alzan, May 8, 2013.

  1. Alzan

    Alzan

    Joined:
    Sep 2, 2012
    Posts:
    81
    I have been working on this path finding script for my android app. I'm getting an error that i can seem to fix. Can anyone help? Thanks.

    Gates are triggers with rigidbodys at the edge of an area. Areas are also triggers with rigidbodys. The AI has a CharacterController for movement, and a collider acting as a trigger for the path.

    Error:
    Code (csharp):
    1. NullReferenceException: Object reference not set to an instance of an object
    2. Boo.Lang.Runtime.RuntimeServices.CheckNumericPromotion (IConvertible convertible)
    3. Boo.Lang.Runtime.RuntimeServices.CheckNumericPromotion (System.Object value)
    4. Boo.Lang.Runtime.RuntimeServices.UnboxInt32 (System.Object value)
    5. AI_Controller.Update () (at Assets/AI_Controller.js:46)
    6.  
    AI movement - The error is coming from this.
    Code (csharp):
    1. #pragma strict
    2. var health : float = 100f;
    3. var deathEffect : GameObject;
    4.  
    5. var currentArea : GameObject;
    6. var player : GameObject;
    7. //@HideInInspector
    8. //var playerScript : GameObject;
    9. var playerArea : GameObject;
    10. var targetDoor : GameObject;
    11. var currentPathLength : float;
    12. @HideInInspector
    13. var startDelay : int = 5;
    14. var controller : CharacterController;
    15. function Start () {
    16. currentPathLength = Mathf.Infinity;
    17. player = GameObject.FindGameObjectWithTag("Player");
    18. //playerScript = player.GetComponent(Player_Move);
    19. startDelay = 5;
    20. controller = gameObject.GetComponent(CharacterController);
    21. }
    22.  
    23. function Update () {
    24.  
    25.  
    26.  
    27.   if(health <= 0) {
    28.     if(deathEffect != null)
    29.       Instantiate(deathEffect, transform.position,transform.rotation);
    30.     Destroy(gameObject);
    31.   }
    32.  
    33.   if(startDelay <= 0) {
    34.  
    35.     var playerScript = player.GetComponent(Player_Move);
    36.     playerArea = playerScript.currentAreaP;
    37.    
    38.     for(var doorChecking : GameObject in currentArea.GetComponent(AI_Area).gates) {
    39.    
    40.       Debug.Log("a");
    41.      
    42.       for(var i = 0; i < doorChecking.GetComponent(AI_Gate).areas.length-1; i++) {
    43.      
    44.         if(doorChecking.GetComponent(AI_Gate).areas[i] == playerArea)
    45.        
    46.           var gates : int = doorChecking.GetComponent(AI_Gate).numberOfGates[i];
    47.          
    48.           Debug.Log(gates);
    49.          
    50.           if(gates < currentPathLength) {
    51.          
    52.             targetDoor = doorChecking;
    53.            
    54.             currentPathLength = gates;
    55.           }
    56.       }
    57.     }
    58.   } else {
    59.   startDelay--;
    60.   }
    61.  
    62.   currentPathLength = Mathf.Infinity;
    63.  
    64.       //Move the AI
    65.       var moveDir = Physics.gravity;
    66.       if(targetDoor != null) {
    67.         var targetRot = Quaternion.LookRotation(Vector3(targetDoor.gameObject.transform.position.x,0,targetDoor.gameObject.transform.position.z) - Vector3(transform.position.x,0,transform.position.z));
    68.         transform.rotation = Quaternion.Slerp(transform.rotation, targetRot, Time.deltaTime * 5);
    69.         moveDir += transform.forward;
    70.       }
    71.       controller.Move(moveDir *2* Time.deltaTime);
    72.      
    73. }
    74.  
    75. function OnTriggerEnter(other : Collider) {
    76.   if(other.tag == "AI_area")
    77.     currentArea = other.gameObject;
    78. }
    79.  
    80.  
    AI_area
    Code (csharp):
    1. #pragma strict
    2.  
    3.  
    4. var gates = new Array();
    5.  
    6. //Get touching gates
    7. function OnTriggerEnter(other : Collider)  {
    8.   if(other.tag == "AI_gate")
    9.     gates.Add(other.gameObject);
    10.     Debug.Log(gameObject.name + " : " + gates.length);
    11. }
    12.  
    13.  
    AI_gate
    Code (csharp):
    1. #pragma strict
    2.  
    3. var areas = new Array();
    4. var numberOfGates = new Array();
    5. var touchingAreas = new Array();
    6. var findAreas : boolean = true;
    7.  
    8. @HideInInspector
    9. var findAreasDelay : float = 2f;//Delay before we find the areas
    10.  
    11. @HideInInspector
    12. var phase : int = 0;
    13.  
    14. @HideInInspector
    15. var doorOpen : boolean = true;//Is the door unlocked
    16.  
    17.  
    18. function Start () {
    19.   doorOpen = true;
    20.   areas = GameObject.FindGameObjectsWithTag("AI_area");
    21.   numberOfGates.length = areas.length;
    22.   findAreas = true;
    23.   findAreasDelay = 2f;
    24.   phase = 0;
    25. }
    26.  
    27. function Update () {
    28.  
    29.   if(findAreas  findAreasDelay <= 0) {
    30.     for(var touchingArea : GameObject in touchingAreas) {
    31.       for(var i = 0; i <= areas.length-1; i++) {
    32.         if(areas[i] == touchingAreas) {
    33.           numberOfGates[i] = 1;
    34.         }
    35.       }
    36.     }
    37.     for(phase = 2; phase <= areas.length-1; phase++) {
    38.       for(i = 0; i <= areas.length-1; i++) {
    39.         if(numberOfGates[i] == phase - 1) {
    40.           var areaG : GameObject = areas[i];
    41.           var currentAreaGates = areaG.GetComponent(AI_Area).gates.length;
    42.           for(var l = 0; l <= currentAreaGates; l++) {
    43.             var checkDoor : GameObject = areaG.GetComponent(AI_Area).gates[l];
    44.             if(checkDoor != gameObject) {
    45.               for(var checkArea : GameObject in checkDoor.GetComponent(AI_Gate).touchingAreas) {
    46.                 for(var j = 0; j <= areas.length-1; j++) {
    47.                   if(areas[i] == checkArea  numberOfGates[i] == null)
    48.                       numberOfGates[j] = phase;
    49.                 }
    50.               }
    51.             }
    52.           }
    53.         }
    54.       }
    55.     }
    56.    
    57.  
    58.  
    59.  
    60.     findAreas = false;
    61.  }
    62.  
    63.   findAreasDelay--;
    64.  
    65. }
    66.  
    67. //Get the touching areas
    68. function OnTriggerEnter(other : Collider) {
    69.  
    70.   if(other.tag == "AI_area")
    71.     touchingAreas.Add(other.gameObject);
    72.  
    73. }
    74.  
     
  2. Alzan

    Alzan

    Joined:
    Sep 2, 2012
    Posts:
    81
    After a lot of work i got it down to one line. I marked the line in red below so that it's easy to find. I still haven't been able to fix it though.


    var areas = new Array();

    var numberOfGates = new Array();

    var touchingAreas = new Array();

    var findAreas : boolean = true;

    var gates : int[];//For debuging

    @HideInInspector

    var findAreasDelay : float = 2f;//Delay before we find the areas



    @HideInInspector

    var phase : int = 0;



    @HideInInspector

    var doorOpen : boolean = true;//Is the door unlocked





    function Awake () {

    doorOpen = true;

    areas = GameObject.FindGameObjectsWithTag("AI_area");

    numberOfGates.length = areas.length;

    findAreas = true;

    findAreasDelay = 2f;

    phase = 0;

    }

    //Get the touching areas

    function OnTriggerEnter(other : Collider) {


    if(other.tag == "AI_area") {
    touchingAreas.Add(other.gameObject);
    Debug.Log("Added touching area: "+ other.gameObject.name + " to " + gameObject.name);
    }

    }

    function Update () {



    if(findAreas findAreasDelay <= 0) {

    for(var touchingArea : GameObject in touchingAreas) {
    Debug.Log("phase start 1");
    for(var i = 0; i <= areas.length-1; i++) {
    Debug.Log("phase marker 1");
    if(areas == touchingArea) {

    numberOfGates = 1;
    Debug.Log("phase end 1");
    }

    }

    }

    for(phase = 2; phase <= areas.length-1; phase++) {
    Debug.Log("phase start " + phase);
    for(i = 0; i <= areas.length-1; i++) {

    if(numberOfGates == phase - 1) {

    var areaG : GameObject = areas;

    var currentAreaGates = areaG.GetComponent(AI_Area).gates.length;

    for(var l = 0; l <= currentAreaGates-1; l++) {

    var checkDoor : GameObject = areaG.GetComponent(AI_Area).gates[l];

    if(checkDoor != gameObject) {

    for(var checkArea : GameObject in checkDoor.GetComponent(AI_Gate).touchingAreas) {

    for(var j = 0; j <= areas.length-1; j++) {
    //Debug.Log("phase marker " + phase);
    if(areas == checkArea numberOfGates == null) {
    Debug.Log("phase marker " + phase);
    numberOfGates[j] = phase;
    gates = numberOfGates;
    Debug.Log("phase end " + phase);
    }
    }

    }

    }

    }

    }

    }

    }
    Debug.Log(numberOfGates);


    /*
    var outString = "";
    for(var i2 = 0; i2 < numberOfGates.length; i2++) {
    outString = outString + ", " + numberOfGates[i2];
    }
    Debug.Log(gameObject.name + " " + outString);
    */

    findAreas = false;

    }



    findAreasDelay-=1;



    }
     
  3. Alzan

    Alzan

    Joined:
    Sep 2, 2012
    Posts:
    81
    I think i'v fixed it.

    Code (csharp):
    1.  
    2. var areas = new Array();
    3.  
    4. var numberOfGates = new Array();
    5.  
    6. var touchingAreas = new Array();
    7.  
    8. var findAreas : boolean = true;
    9.  
    10. var gates : int[];//For debuging
    11.  
    12. @HideInInspector
    13.  
    14. var findAreasDelay : float = 2f;//Delay before we find the areas
    15.  
    16.  
    17.  
    18. @HideInInspector
    19.  
    20. var phase : int = 0;
    21.  
    22.  
    23.  
    24. @HideInInspector
    25.  
    26. var doorOpen : boolean = true;//Is the door unlocked
    27.  
    28.  
    29.  
    30.  
    31.  
    32. function Awake () {
    33.  
    34.   doorOpen = true;
    35.  
    36.   areas = GameObject.FindGameObjectsWithTag("AI_area");
    37.  
    38.   numberOfGates.length = areas.length;
    39.  
    40.   findAreas = true;
    41.  
    42.   findAreasDelay = 2f;
    43.  
    44.   phase = 0;
    45.  
    46. }
    47.  
    48. //Get the touching areas
    49.  
    50. function OnTriggerEnter(other : Collider) {
    51.  
    52.  
    53.   if(other.tag == "AI_area") {
    54.     touchingAreas.Add(other.gameObject);
    55.     Debug.Log("Added touching area: "+ other.gameObject.name + " to " + gameObject.name);
    56.   }
    57.  
    58. }
    59.  
    60. function Update () {
    61.  
    62.  
    63.  
    64.   if(findAreas  findAreasDelay <= 0) {
    65.  
    66.     for(var touchingArea : GameObject in touchingAreas) {
    67.       Debug.Log("phase start 1");
    68.       for(var i = 0; i <= areas.length-1; i++) {
    69.         Debug.Log("phase marker 1");
    70.         if(areas[i] == touchingArea) {
    71.  
    72.           numberOfGates[i] = 1;
    73.           Debug.Log("phase end 1");
    74.         }
    75.  
    76.       }
    77.  
    78.     }
    79.  
    80.     for(phase = 2; phase <= areas.length-1; phase++) {
    81.       Debug.Log("phase start " + phase);
    82.       for(i = 0; i <= areas.length-1; i++) {
    83.        
    84.         if(numberOfGates[i] == phase - 1) {
    85.          
    86.           var areaG : GameObject = areas[i];
    87.  
    88.           var currentAreaGates = areaG.GetComponent(AI_Area).gates.length;
    89.          
    90.           for(var l = 0; l <= currentAreaGates-1; l++) {
    91.  
    92.             var checkDoor : GameObject = areaG.GetComponent(AI_Area).gates[l];
    93.            
    94.             if(checkDoor != gameObject) {
    95.              
    96.               for(var checkArea : GameObject in checkDoor.GetComponent(AI_Gate).touchingAreas) {
    97.                
    98.                 for(var j = 0; j <= areas.length-1; j++) {
    99.                   Debug.Log("phase marker " + phase);
    100.                   gates = numberOfGates;
    101.                   if(areas[j] == checkArea  numberOfGates[j] == null) {
    102.                       numberOfGates[j] = phase;
    103.                       gates = numberOfGates;
    104.                       Debug.Log("phase end " + phase);
    105.                   }
    106.                 }
    107.  
    108.               }
    109.  
    110.             }
    111.  
    112.           }
    113.  
    114.         }
    115.  
    116.       }
    117.  
    118.     }
    119.     Debug.Log(numberOfGates);
    120.  
    121.  
    122.     /*
    123.     var outString = "";
    124.     for(var i2 = 0; i2 < numberOfGates.length; i2++) {
    125.       outString = outString + ", " + numberOfGates[i2];
    126.     }
    127.     Debug.Log(gameObject.name + " " + outString);
    128.     */
    129.    
    130.     findAreas = false;
    131.  
    132.  }
    133.  
    134.  
    135.  
    136.   findAreasDelay-=1;
    137.  
    138.  
    139.  
    140. }
    141.  
    142.  
    143.  
    144.  
     
  4. BFGames

    BFGames

    Joined:
    Oct 2, 2012
    Posts:
    1,543
    Remember to set numberOfGates, else your numberOfGates == null check wont work as numberOfGates is null