Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

Script not working properly, cannot figure out why.

Discussion in 'Scripting' started by suctioncup, Jan 28, 2013.

  1. suctioncup

    suctioncup

    Joined:
    May 19, 2012
    Posts:
    273
    Hello,

    I am working on an AI. This AI has 2 states, specified by a boolean. When the boolean is false, the AI picks a random point and moves to it. When it reaches this point, it should pick another point to move to. For some reason, this doesnt work.

    Code (csharp):
    1. import System.Collections.Generic;
    2. #pragma strict
    3.  
    4. //var players = new List.<GameObject>();
    5. //      players.Add(array[i]);
    6.  
    7. //Players
    8. var players : GameObject[];
    9.  
    10. //Who is it
    11. var whoEverIsIt : GameObject;
    12.  
    13. //Who to target whilst it
    14. var closestPlayer : GameObject;
    15.  
    16. //Am I it?
    17. var it : boolean = false;
    18.  
    19. //Point to run to
    20. private var point : Vector3;
    21.  
    22. //Speed
    23. var speed : float = 10.0;
    24.  
    25. //Size of movement area
    26. var size : Vector2;
    27.  
    28. //Lights
    29. var glow : Light;
    30.  
    31. //Can change
    32. private var canChange : boolean = true;
    33.  
    34. function Start()
    35. {
    36.     GeneratePoint();
    37. }
    38.  
    39. function Update ()
    40. {
    41.     players = GameObject.FindGameObjectsWithTag ("neutral");
    42.     whoEverIsIt = GameObject.FindGameObjectWithTag("it");
    43.    
    44.     if(it)
    45.     {
    46.         GetClosestPlayer();
    47.         transform.position = Vector3.MoveTowards( transform.position, closestPlayer.transform.position, speed*Time.deltaTime );
    48.         glow.enabled = true;
    49.         gameObject.tag = "it";
    50.     } else {
    51.         transform.position = Vector3.MoveTowards( transform.position, point, speed*Time.deltaTime );
    52.         glow.enabled = false;
    53.         gameObject.tag = "neutral";
    54.     }
    55.    
    56.     if(!it  Vector3.Distance(transform.position, whoEverIsIt.transform.position) < 1  canChange)
    57.     {
    58.         toTrue();
    59.     } else if(it  Vector3.Distance(transform.position, closestPlayer.transform.position) < 1  canChange)
    60.     {
    61.         toFalse();
    62.     }
    63.    
    64.     if(Vector3.Distance(transform.position, point) < 2 || Vector3.Distance(transform.position, point) > 10)
    65.     {
    66.         GeneratePoint();
    67.     }
    68. }
    69.  
    70. function GetClosestPlayer()
    71. {
    72.     if(players.length > 0)
    73.     {
    74.         var closestEnemy = players[0];
    75.         var dist = Vector3.Distance(transform.position, players[0].transform.position);
    76.  
    77.         for(var i=0;i<players.Length;i++)
    78.         {
    79.             var tempDist = Vector3.Distance(transform.position, players[i].transform.position);
    80.             if(tempDist < dist) {
    81.                 closestEnemy = players[i];
    82.             }
    83.         }
    84.  
    85.         //do something with the closestEnemy
    86.         closestPlayer = closestEnemy;
    87.     }
    88. }
    89.  
    90. //From it to not it
    91. function toFalse()
    92. {
    93.         it = false;
    94.         speed = 15;
    95.         canChange = false;
    96.         yield WaitForSeconds(2);
    97.         speed = 10;
    98.         it = false;
    99.         canChange = true;
    100.         GeneratePoint();
    101. }
    102.  
    103. //From not it to it
    104. function toTrue()
    105. {
    106.         it = true;
    107.         speed = 5;
    108.         canChange = false;
    109.         yield WaitForSeconds(2);
    110.         speed = 11;
    111.         it = true;
    112.         canChange = true;
    113. }
    114.  
    115.  
    116. //Generates a point to run to whilst not it
    117. function GeneratePoint()
    118. {
    119.     var x : float = Random.Range(0, size.x + 1);
    120.     var z : float = Random.Range(0, size.y + 1);
    121.    
    122.     point = Vector3(x, 0.2, z);
    123. }
    I suspect the problem lies within these statements:

    Code (csharp):
    1.  else {
    2.         transform.position = Vector3.MoveTowards( transform.position, point, speed*Time.deltaTime );
    3.         glow.enabled = false;
    4.         gameObject.tag = "neutral";
    5.     }
    And

    Code (csharp):
    1. //Generates a point to run to whilst not it
    2. function GeneratePoint()
    3. {
    4.     var x : float = Random.Range(0, size.x + 1);
    5.     var z : float = Random.Range(0, size.y + 1);
    6.    
    7.     point = Vector3(x, 0.2, z);
    8. }
    But I am not sure. Help?
     
  2. renman3000

    renman3000

    Joined:
    Nov 7, 2011
    Posts:
    6,697
    I would suggest you add in prints to each of your functions checking particular values. That way you can see what is being reached and what equals what at that time.


    Code (csharp):
    1.  
    2. print("ok we are here");
    3.  
     
  3. suctioncup

    suctioncup

    Joined:
    May 19, 2012
    Posts:
    273
    Ok,

    Now my AI's move around, and it all works. For a little while.

    Code (csharp):
    1. import System.Collections.Generic;
    2. #pragma strict
    3.  
    4. //var players = new List.<GameObject>();
    5. //      players.Add(array[i]);
    6.  
    7. //Players
    8. var players : GameObject[];
    9.  
    10. //Who is it
    11. var whoEverIsIt : GameObject;
    12.  
    13. //Who to target whilst it
    14. var closestPlayer : GameObject;
    15.  
    16. //Am I it?
    17. var it : boolean = false;
    18.  
    19. //Point to run to
    20. private var point : Vector3;
    21.  
    22. //Speed
    23. var speed : float = 10.0;
    24.  
    25. //Size of movement area
    26. var size : Vector2;
    27.  
    28. //Lights
    29. //var glow : Light;
    30.  
    31. var onMat : Material;
    32. var offMat : Material;
    33.  
    34. //Can change
    35. private var canChange : boolean = true;
    36.  
    37. function Start()
    38. {
    39.     GeneratePoint();
    40. }
    41.  
    42. function Update ()
    43. {
    44.     players = GameObject.FindGameObjectsWithTag ("neutral");
    45.     whoEverIsIt = GameObject.FindGameObjectWithTag("it");
    46.    
    47.     if(it)
    48.     {
    49.         renderer.material = onMat;
    50.         GetClosestPlayer();
    51.         transform.position = Vector3.MoveTowards( transform.position, closestPlayer.transform.position, speed*Time.deltaTime );
    52.         //glow.enabled = true;
    53.         gameObject.tag = "it";
    54.     } else {
    55.         renderer.material = offMat;
    56.         transform.position = Vector3.MoveTowards( transform.position, point, speed*Time.deltaTime );
    57.         //glow.enabled = false;
    58.         gameObject.tag = "neutral";
    59.     }
    60.    
    61.     if(!it  Vector3.Distance(transform.position, whoEverIsIt.transform.position) < 1  canChange)
    62.     {
    63.         toTrue();
    64.     } else if(it  Vector3.Distance(transform.position, closestPlayer.transform.position) < 1  canChange)
    65.     {
    66.         toFalse();
    67.     }
    68.    
    69.     if(Vector3.Distance(transform.position, point) < 2 || Vector3.Distance(transform.position, point) > 10)
    70.     {
    71.         GeneratePoint();
    72.     }
    73. }
    74.  
    75. function GetClosestPlayer()
    76. {
    77.     if(players.length > 0)
    78.     {
    79.         var closestEnemy = players[0];
    80.         var dist = Vector3.Distance(transform.position, players[0].transform.position);
    81.  
    82.         for(var i=0;i<players.Length;i++)
    83.         {
    84.             var tempDist = Vector3.Distance(transform.position, players[i].transform.position);
    85.             if(tempDist < dist) {
    86.                 closestEnemy = players[i];
    87.             }
    88.         }
    89.  
    90.         //do something with the closestEnemy
    91.         closestPlayer = closestEnemy;
    92.     }
    93. }
    94.  
    95. //From it to not it
    96. function toFalse()
    97. {
    98.         it = false;
    99.         speed = 15;
    100.         canChange = false;
    101.         yield WaitForSeconds(2);
    102.         speed = 10;
    103.         it = false;
    104.         canChange = true;
    105.         GeneratePoint();
    106. }
    107.  
    108. //From not it to it
    109. function toTrue()
    110. {
    111.         it = true;
    112.         speed = 5;
    113.         canChange = false;
    114.         yield WaitForSeconds(2);
    115.         speed = 11;
    116.         it = true;
    117.         canChange = true;
    118. }
    119.  
    120.  
    121. //Generates a point to run to whilst not it
    122. function GeneratePoint()
    123. {
    124.     var x : float = Random.Range(0, size.x + 1);
    125.     var z : float = Random.Range(0, size.y + 1);
    126.         Debug.Log("Generating point");
    127.     point = Vector3(x, 0.2, z);
    128. }
    My code should emulate the 'tag' game that children play. For some reason, after a little while more than one AI become 'it', then none become it.
     
  4. renman3000

    renman3000

    Joined:
    Nov 7, 2011
    Posts:
    6,697
    Again, your code is so long, posted here, I personally do not have the time to sort thru it all but I do recommend that you practice the prints, to see where things are going arye. Try and isolate it.