Search Unity

Help with scalable AI

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

  1. suctioncup

    suctioncup

    Joined:
    May 19, 2012
    Posts:
    273
    Hello,

    I am working on a 'tag' style game. One player is 'it', and that player has to try to tag other players. When the player who is 'it' tags another player, other said player becomes it instead. And the cycle repeats.

    Currently, my AI only works with 1 NPC, and one player. Im trying to change that, and be able to drop in more NPC's and have the game continue as normal. I tried editing the scripts to make them scale, but now they have many bugs and do not work properly.

    This script goes on the NPC:

    Code (csharp):
    1. #pragma strict
    2.  
    3. //Player, currently not scalable
    4. var target : GameObject;
    5.  
    6. //players
    7. var players : GameObject[];
    8.  
    9. //Am I it or not?
    10. var it : boolean;
    11.  
    12. //Movement speed
    13. var speed : float = 10.0;
    14.  
    15. //Size of movement area
    16. var size : Vector2;
    17.  
    18. //Point to move to
    19. private var point : Vector3;
    20.  
    21. //Light
    22. var glow : Light;
    23.  
    24. //Can be tagged
    25. private var canChange : boolean = true;
    26.  
    27. //Follow the player?
    28. private var followPlayer : boolean = false;
    29.  
    30. function Start()
    31. {
    32.     GeneratePoint();
    33. }
    34.  
    35. function Update()
    36. {  
    37.     if( it  target == null)
    38.     {
    39.         GetClosestPlayer();
    40.     }
    41.    
    42.     if(it)
    43.     {
    44.         GetClosestPlayer();
    45.     }
    46.    
    47.     //Movement, following player
    48.     if(it  followPlayer)
    49.     {
    50.     transform.position = Vector3.MoveTowards( transform.position, target.transform.position, speed*Time.deltaTime );
    51.     } else if(it  !followPlayer) {
    52.     transform.position = Vector3.MoveTowards( transform.position, point, speed*Time.deltaTime );
    53.     } else if(!it)
    54.     {
    55.     transform.position = Vector3.MoveTowards( transform.position, point, speed*Time.deltaTime );
    56.     }
    57.    
    58.     //if tagged someone while it
    59.     if(Vector3.Distance(transform.position, target.transform.position) < 0.5  it  canChange)
    60.     {
    61.         toFalse();
    62.     //if tagged while not it
    63.     } else if(Vector3.Distance(transform.position, target.transform.position) < 1  it == false  canChange)
    64.     {
    65.         toTrue();
    66.     }
    67.    
    68.     //Generating points to run to
    69.     if(Vector3.Distance(transform.position, point) < 2  !it)
    70.     {
    71.         GeneratePoint();
    72.     //Generating points to run to while it, adds slight variety in movements
    73.     } else if(Vector3.Distance(transform.position, point) < 2  it)
    74.     {
    75.         GeneratePointNearTarget();
    76.     }
    77.    
    78.     //if the point is over 10 units away, generate another point
    79.     if(Vector3.Distance(transform.position, point) > 10)
    80.     {
    81.         GeneratePoint();
    82.     }
    83.    
    84.     //Ignore this statement
    85.     if(Vector3.Distance(transform.position, point) < 5  it)
    86.     {
    87.         GeneratePointNearTarget();
    88.     }
    89.    
    90.     //If it, turn on light
    91.     if(it)
    92.     {
    93.         glow.enabled = true;
    94.         gameObject.tag = "it";
    95.         } else {
    96.         glow.enabled = false;
    97.         gameObject.tag = "neutral";
    98.     }
    99. }
    100.  
    101. //Generates a point to run to
    102. function GeneratePoint()
    103. {
    104.     var x : float = Random.Range(0, size.x + 1);
    105.     var z : float = Random.Range(0, size.y + 1);
    106.    
    107.     point = Vector3(x, 0.2, z);
    108. }
    109.  
    110. //Generates a point near the player, to run to
    111. function GeneratePointNearTarget()
    112. {
    113.     followPlayer = false;
    114.    
    115.     var q : float = Random.Range(1, 11);
    116.    
    117.     var x : float = Random.Range(0, 5);
    118.     var z : float = Random.Range(0, 5);
    119.    
    120.     if(q <= 5)
    121.     {
    122.     point = Vector3(target.transform.position.x + x, 0.2, target.transform.position.z + z);
    123.     } else {
    124.     followPlayer = true;
    125.     }
    126. }
    127.  
    128. //From it to not it
    129. function toFalse()
    130. {
    131.         it = false;
    132.         speed = 15;
    133.         canChange = false;
    134.         yield WaitForSeconds(2);
    135.         speed = 10;
    136.         it = false;
    137.         canChange = true;
    138.         GeneratePoint();
    139. }
    140.  
    141. //From not it to it
    142. function toTrue()
    143. {
    144.         it = true;
    145.         speed = 5;
    146.         canChange = false;
    147.         yield WaitForSeconds(2);
    148.         speed = 11;
    149.         it = true;
    150.         canChange = true;
    151. }
    152.  
    153.  
    154. //I realise I need this function (Below) to iterate through all the npcs (and the player)
    155. //and find the closest one, and set that as the target, but it doesn't work properly
    156.  
    157. function GetClosestPlayer()
    158. {
    159.     players = GameObject.FindGameObjectsWithTag("neutral");
    160.  
    161.     if(players.length > 0) {
    162.         var closestEnemy = players[0];
    163.         var dist = Vector3.Distance(transform.position, players[0].transform.position);
    164.  
    165.         for(var i=0;i<players.Length;i++) {
    166.             var tempDist = Vector3.Distance(transform.position, players[i].transform.position);
    167.             if(tempDist < dist) {
    168.                 closestEnemy = players[i];
    169.             }
    170.         }
    171.  
    172.         //do something with the closestEnemy
    173.         target = closestEnemy;
    174.     }
    175. }
    and this onto the player:

    Code (csharp):
    1. //Movement
    2.  
    3. #pragma strict
    4.  
    5. //Movement
    6. var speed : float = 10.0;
    7. var trailThresh : float = 0.5;
    8. var wantedPos : Vector3;
    9. private var canDie : boolean = false;
    10.  
    11. //It
    12. var it : boolean = true;
    13.  
    14. //npc that is it
    15. var npcIt : GameObject;
    16. var glow : Light;
    17.  
    18. private var canChange : boolean = true;
    19.  
    20. function FixedUpdate()
    21. {  
    22.     npcIt = GameObject.FindGameObjectWithTag("it");
    23.    
    24.     //Movement
    25.     var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
    26.     var hit : RaycastHit;  
    27.  
    28.     wantedPos.y = 0.1;
    29.    
    30.         if(Vector3.Distance(this.transform.position, wantedPos) > 0.5)
    31.         {
    32.         transform.position = Vector3.MoveTowards( transform.position, wantedPos, speed*Time.deltaTime);
    33.         //transform.LookAt(wantedPos);
    34.         //transform.Translate(Vector3.forward * Time.deltaTime * speed);
    35.         }
    36.  
    37.         if (Physics.Raycast (ray, hit, 100))
    38.         {
    39.             wantedPos = hit.point;
    40.         }
    41.    
    42.     //Getting tagged
    43.     if(Vector3.Distance(transform.position, npcIt.transform.position) < 1  it  canChange)
    44.     {
    45.         toFalse();
    46.     } else if(Vector3.Distance(transform.position, npcIt.transform.position) < 0.5  it == false  canChange)
    47.     {
    48.         toTrue();
    49.     }
    50.    
    51.     //Changing the lights
    52.     if(it)
    53.     {
    54.         glow.enabled = true;
    55.     } else if(!it) {
    56.         glow.enabled = false;
    57.     }
    58.    
    59. }
    60.  
    61. function toFalse()
    62. {
    63.         it = false;
    64.         speed = 15;
    65.         canChange = false;
    66.         yield WaitForSeconds(2);
    67.         speed = 10;
    68.         it = false;
    69.         canChange = true;
    70. }
    71.  
    72. function toTrue()
    73. {
    74.         it = true;
    75.         speed = 5;
    76.         canChange = false;
    77.         yield WaitForSeconds(2);
    78.         speed = 11;
    79.         it = true;
    80.         canChange = true;
    81. }
    However, when I play, sometimes both lights are on, both are off, one is off one is on, etc. etc. It doesnt work. Help?