Advertisement
BERKYT

Base_Zombie_Unity

Apr 9th, 2021 (edited)
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.71 KB | None | 0 0
  1. //--Script By: BERKYT
  2. //--Links: VK: https://vk.com/b_e_r_k_y_t Discord: https://discord.gg/amMreCC YouTube: https://www.youtube.com/channel/UCaPBjmrAYO6p-ksHNaymwLg?view_as=subscriber
  3. //--The script is distributed freely, provided that the author of the script is indicated - BERKYT
  4. using UnityEngine;
  5.  
  6. public class BaseZombie : MonoBehaviour
  7. {
  8.     public string myName; // Имя НПС в консоли. Делал для отладки - в игре это не нужно
  9.  
  10.     public float speed; // Скорость НПС
  11.     public float stoppingDistance; // Поле зрения НПС
  12.     float timeLeft = 3.0f;
  13.  
  14.     public int positionOfPatrol; // Граница триггера
  15.     public int healh = 20; //хп
  16.  
  17.     // Свойство хп
  18.     public int Health
  19.     {
  20.         get
  21.         {
  22.             if(healh < 0)
  23.             {
  24.                 return 0;
  25.             }
  26.             else
  27.             {
  28.                 return healh;
  29.             }
  30.         }
  31.         set
  32.         {
  33.             healh = value;
  34.         }
  35.     }
  36.  
  37.     public Transform point; // Триггер НПС
  38.     public Transform player; // Координаты игрока
  39.  
  40.     bool moveingRight; // переключатель движения нпс вправо/влево
  41.     bool chill = false; // переключает НПС в состояние патрулирования
  42.     bool angry = false; // переключает НПС в состояние преследования
  43.     bool angrySpeed = true; // Костыль, чтобы увеличивать скорость когда НПС видит игрока, но только в первом кадре и также выключать
  44.     bool goBack = false; // Отправляет НПС обратно в зону патрулирования
  45.     bool checkDie = true; // Проверка на то, сдох ли НПС или НЕТ!!!!!!!!!!!
  46.     private bool facingRight = true;
  47.  
  48.  
  49.     // Старт вызывается перед обновлением первого кадра
  50.     void Start()
  51.     {
  52.         // Устанавливаем значение player равным сущности с тэгом Player
  53.         player = GameObject.FindGameObjectWithTag("Player").transform;
  54.         //rb.AddForce(Vector3.up * 10f);
  55.  
  56.         Debug.Log("I am alive and my name is " + myName);
  57.     }
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.     //void FixedUpdate()
  65.     //{
  66.  
  67.  
  68.     //    x++;
  69.  
  70.     //    Debug.Log(myName + ":" + x);
  71.     //    if (Vector2.Distance(transform.position, player.position) < 1)
  72.     //    {
  73.     //        Debug.Log(myName + ": if(Vector2.Distance(transform.position, player.position) < 2 && Time.deltaTime == 2)");
  74.     //        DamageToPlayer();
  75.     //    }
  76.     //}
  77.  
  78.     // Обновление вызывается один раз за кадр
  79.     void Update()
  80.     {
  81.         Debug.Log("Player: HealthBar: " + HealthBar.currentValue);
  82.         if (Vector2.Distance(transform.position, player.position) < 1)
  83.         {
  84.             timeLeft -= Time.deltaTime;
  85.             //Debug.Log(timeLeft);
  86.             if (timeLeft < 0)
  87.             {
  88.                 timeLeft = 1.0f;
  89.                 Debug.Log(myName + ": if(Vector2.Distance(transform.position, player.position) < 2 && Time.deltaTime == 2)");
  90.                 DamageToPlayer();
  91.             }
  92.         }
  93.  
  94.         // Если игрок и НПС близко, и игрок нажал клавишу "удар", то единожды вызвать метод урона НПС
  95.         if (Vector2.Distance(transform.position, player.position) < 4 && Input.GetKeyDown(KeyCode.B) && PlayerController.checkDie)
  96.         {
  97.             Debug.Log(myName + ": if (Vector2.Distance(transform.position, player.position) == 1)");
  98.             //Debug.Log(myName + ": " + Time.deltaTime);
  99.             DamageToBot();
  100.         }
  101.  
  102.         //Debug.Log("Update(): I am alive!");
  103.         //Если расстояни между вектором и точкой меньше, чем positionOfPatrol - по сути граница триггера, и нпс не заагрен, то начать патрулирование.
  104.         if (Vector2.Distance(transform.position, point.position) < positionOfPatrol && !angry)
  105.         {
  106.             chill = true;
  107.         }
  108.         //Если расстояни между вектором и точкой меньше, чем stoppingDistance - по сути поле зрения нпс, то начать преследование.
  109.         if (Vector2.Distance(transform.position, player.position) < stoppingDistance)
  110.         {
  111.             angry = true;
  112.             //Debug.Log("Update() : speed is " + speed);
  113.             chill = false;
  114.             // Костыль, чтобы скорость не улетала в ебеня.
  115.             if (angrySpeed)
  116.             {
  117.                 if (checkDie)
  118.                     Flip();
  119.                 Debug.ClearDeveloperConsole();
  120.                 speed += 2f;
  121.                 Debug.Log(myName + ": Angry() : speed is " + speed);
  122.                 angrySpeed = false;
  123.             }
  124.             goBack = false;
  125.         }
  126.         //Если расстояни между вектором и точкой больше, чем stoppingDistance - по сути поле зрения нпс, то идти назад.
  127.         if (Vector2.Distance(transform.position, player.position) > stoppingDistance)
  128.         {
  129.             goBack = true;
  130.             angry = false;
  131.             // Костыль, чтобы скорость не улетала в ебеня.
  132.             if (!angrySpeed)
  133.             {
  134.                 if (checkDie)
  135.                     Flip();
  136.                 Debug.ClearDeveloperConsole();
  137.                 angrySpeed = true;
  138.                 speed -= 2f;
  139.                 Debug.Log(myName + ": chill : speed is " + speed);
  140.             }
  141.             //angrySpeed = false;
  142.         }
  143.  
  144.         if (chill && checkDie)
  145.             Chill();
  146.         else if(angry && checkDie)
  147.             Angry();
  148.         else if (goBack && checkDie)
  149.             GoBack();
  150.  
  151.     }
  152.  
  153.     //Метод урона
  154.     void DamageToBot()
  155.     {
  156.         Debug.Log(myName + ": DamageToBot();");
  157.         Health -= 2;
  158.  
  159.         //Если хп меньше 0 и checkDie истина, то сдохнем
  160.         if (Health <= 0 && checkDie)
  161.         {
  162.             Die();
  163.         }
  164.     }
  165.  
  166.     void DamageToPlayer()
  167.     {
  168.         if(checkDie)
  169.         {
  170.             Debug.Log(myName + "to player: DamageToPlayer();");
  171.             HealthBar.AdjustCurrentValue(-3);
  172.         }
  173.  
  174.         //Если хп меньше 0 то сдохнет игрок
  175.         if (HealthBar.currentValue <= 0 && PlayerController.checkDie)
  176.         {
  177.             PlayerController.checkDie = false;
  178.             Debug.Log("Player: I am die...");
  179.             //Die();
  180.         }
  181.     }
  182.  
  183.     //Сдох
  184.     void Die()
  185.     {
  186.         //Если checkDie истина, то.........
  187.         if (checkDie)
  188.         {
  189.             GUI.Label(new Rect(10, 10, 100, 20), "Hello World!");
  190.             //Делаем её ложной, чтобы не дохнуть 1000+ раз в секунду, а только один раз.
  191.             checkDie = false;
  192.             Debug.Log(myName + ": I am die...");
  193.         }
  194.     }
  195.  
  196.     void Chill()
  197.     {
  198.         //Если по оси х позиция нпс больше, чем позиция точки и коэффицента positionOfPatrol - по сути границы триггера, то нпс поворачивает налево.
  199.         //Вернее устанавливается значение переменной moveingRight как false и потом уже поворачиваем
  200.         //_____________/Т\<--(НПС)_______
  201.         if (transform.position.x > point.position.x + positionOfPatrol)
  202.         {
  203.  
  204.             if (checkDie)
  205.                 Flip();
  206.             Debug.Log(myName + ": Move to left");
  207.             moveingRight = false;
  208.         }
  209.         //Если по оси х позиция нпс меньше, чем позиция точки и коэффицента positionOfPatrol - по сути границы триггера, то нпс поворачивает направо.
  210.         //Вернее устанавливается значение переменной moveingRight как true и потом уже поворачиваем
  211.         //_____________(НПС)-->/Т\_______
  212.         else if (transform.position.x < point.position.x - positionOfPatrol)
  213.         {
  214.             if (checkDie)
  215.                 Flip();
  216.             moveingRight = true;
  217.         }
  218.  
  219.         if (moveingRight)
  220.             //Как я понял. Скрипт тут(в Unity) исполняется каждый кадр, и соответственно передвижение происходит по принципу: сдвинуть на n координат картинку по икс(transform.position.x)
  221.             // и игрек(transform.position.у) Переменная speed просто некий коэффицент, на который мы двигаем картинку нпс.
  222.             transform.position = new Vector2(transform.position.x + speed * Time.deltaTime, transform.position.y);
  223.         else
  224.             //Как я понял. Скрипт тут(в Unity) исполняется каждый кадр, и соответственно передвижение происходит по принципу: сдвинуть на n координат картинку по икс(transform.position.x)
  225.             // и игрек(transform.position.у) Переменная speed просто некий коэффицент, на который мы двигаем картинку нпс.
  226.             transform.position = new Vector2(transform.position.x - speed * Time.deltaTime, transform.position.y);
  227.     }
  228.  
  229.     void Angry()
  230.     {
  231.         // Сводка: MoveTowards()
  232.         //     Moves a point current towards target.
  233.         //     Перевод: Перемещает текущую точку к цели.
  234.         //
  235.         // Параметры:
  236.         //   current:
  237.         //
  238.         //   target:
  239.         //
  240.         //   maxDistanceDelta:
  241.         //
  242.         // Мы перемещаем нашего нпс(current: transform.position)  на некоторую
  243.         // координату(maxDistanceDelta: speed * Time.deltaTime) каждый кадр в сторону цели(target: player.position)
  244.         //
  245.         // В данном случае мы смещаем его в сторону игрока
  246.         transform.position = Vector2.MoveTowards(transform.position, player.position, speed * Time.deltaTime);
  247.     }
  248.  
  249.     void GoBack()
  250.     {
  251.         // Сводка: MoveTowards()
  252.         //     Moves a point current towards target.
  253.         //     Перевод: Перемещает текущую точку к цели.
  254.         //
  255.         // Параметры:
  256.         //   current:
  257.         //
  258.         //   target:
  259.         //
  260.         //   maxDistanceDelta:
  261.         //
  262.         // Мы перемещаем нашего нпс(current: transform.position) на некоторую
  263.         // координату(maxDistanceDelta: speed * Time.deltaTime) каждый кадр в сторону цели(target: point.position)
  264.         //
  265.         // В данном случае мы смещаем его в зону патрулирования
  266.         transform.position = Vector2.MoveTowards(transform.position, point.position, speed * Time.deltaTime);
  267.     }
  268.  
  269.     void Flip()
  270.     {
  271.         facingRight = !facingRight;
  272.         Vector3 Scaler = transform.localScale;
  273.         Scaler.x *= -1;
  274.         transform.localScale = Scaler;
  275.     }
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement