Advertisement
BERKYT

Base_Zombie_Unity

Apr 9th, 2021
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 12.38 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 = 1.0f; // Интервал между атаками.
  13.  
  14.     public int positionOfPatrol; // Граница триггера
  15.     public int healh = 8; //хп
  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.     //void FixedUpdate()
  60.     //{
  61.  
  62.  
  63.     //    x++;
  64.  
  65.     //    Debug.Log(myName + ":" + x);
  66.     //    if (Vector2.Distance(transform.position, player.position) < 1)
  67.     //    {
  68.     //        Debug.Log(myName + ": if(Vector2.Distance(transform.position, player.position) < 2 && Time.deltaTime == 2)");
  69.     //        DamageToPlayer();
  70.     //    }
  71.     //}
  72.  
  73.     // Обновление вызывается один раз за кадр
  74.     void Update()
  75.     {
  76.         Debug.Log("Player: HealthBar: " + HealthBar.currentValue);
  77.         // Если игрок подойдёт достаточно близко к НПС, то:
  78.         if (Vector2.Distance(transform.position, player.position) < 1)
  79.         {
  80.             //Включается таймер
  81.             timeLeft -= Time.deltaTime;
  82.             //Debug.Log(timeLeft);
  83.             //Таймер равен 0, то:
  84.             if (timeLeft < 0)
  85.             {
  86.                 //Таймер сбрасывается
  87.                 timeLeft = 1.0f;
  88.                 Debug.Log(myName + ": if(Vector2.Distance(transform.position, player.position) < 2 && Time.deltaTime == 2)");
  89.                 //Игрок получает урон
  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.                 //Чтобы он не поворачивался за нами, будучи трупом
  118.                 if (checkDie)
  119.                     Flip();
  120.                 Debug.ClearDeveloperConsole();
  121.                 speed += 2f;
  122.                 Debug.Log(myName + ": Angry() : speed is " + speed);
  123.                 angrySpeed = false;
  124.             }
  125.             goBack = false;
  126.         }
  127.         //Если расстояни между вектором и точкой больше, чем stoppingDistance - по сути поле зрения нпс, то идти назад.
  128.         if (Vector2.Distance(transform.position, player.position) > stoppingDistance)
  129.         {
  130.             goBack = true;
  131.             angry = false;
  132.             // Костыль, чтобы скорость не улетала в ебеня.
  133.             if (!angrySpeed)
  134.             {
  135.                 //Чтобы он не поворачивался за нами, будучи трупом
  136.                 if (checkDie)
  137.                     Flip();
  138.                 Debug.ClearDeveloperConsole();
  139.                 angrySpeed = true;
  140.                 speed -= 2f;
  141.                 Debug.Log(myName + ": chill : speed is " + speed);
  142.             }
  143.             //angrySpeed = false;
  144.         }
  145.  
  146.         if (chill && checkDie)
  147.             Chill();
  148.         else if(angry && checkDie)
  149.             Angry();
  150.         else if (goBack && checkDie)
  151.             GoBack();
  152.  
  153.     }
  154.  
  155.     //Метод урона
  156.     void DamageToBot()
  157.     {
  158.         Debug.Log(myName + ": DamageToBot();");
  159.         Health -= 2;
  160.  
  161.         //Если хп меньше 0 и checkDie истина, то сдохнем
  162.         if (Health <= 0 && checkDie)
  163.         {
  164.             Die();
  165.         }
  166.     }
  167.  
  168.     void DamageToPlayer()
  169.     {
  170.         //Чтобы он не убивал нас будучи трупом
  171.         if(checkDie)
  172.         {
  173.             Debug.Log(myName + "to player: DamageToPlayer();");
  174.             HealthBar.AdjustCurrentValue(-2);
  175.         }
  176.  
  177.         //Если хп меньше 0 то сдохнет игрок
  178.         if (HealthBar.currentValue <= 0 && PlayerController.checkDie)
  179.         {
  180.             PlayerController.checkDie = false;
  181.             Debug.Log("Player: I am die...");
  182.             //Die();
  183.         }
  184.     }
  185.  
  186.     //Сдох
  187.     void Die()
  188.     {
  189.         //Если checkDie истина, то.........
  190.         if (checkDie)
  191.         {
  192.             GUI.Label(new Rect(10, 10, 100, 20), "Hello World!");
  193.             //Делаем её ложной, чтобы не дохнуть 1000+ раз в секунду, а только один раз.
  194.             checkDie = false;
  195.             Debug.Log(myName + ": I am die...");
  196.         }
  197.     }
  198.  
  199.     void Chill()
  200.     {
  201.         //Если по оси х позиция нпс больше, чем позиция точки и коэффицента positionOfPatrol - по сути границы триггера, то нпс поворачивает налево.
  202.         //Вернее устанавливается значение переменной moveingRight как false и потом уже поворачиваем
  203.         //_____________/Т\<--(НПС)_______
  204.         if (transform.position.x > point.position.x + positionOfPatrol)
  205.         {
  206.             if (checkDie)
  207.                 Flip();
  208.             Debug.Log(myName + ": Move to left");
  209.             moveingRight = false;
  210.         }
  211.         //Если по оси х позиция нпс меньше, чем позиция точки и коэффицента positionOfPatrol - по сути границы триггера, то нпс поворачивает направо.
  212.         //Вернее устанавливается значение переменной moveingRight как true и потом уже поворачиваем
  213.         //_____________(НПС)-->/Т\_______
  214.         else if (transform.position.x < point.position.x - positionOfPatrol)
  215.         {
  216.             if (checkDie)
  217.                 Flip();
  218.             moveingRight = true;
  219.         }
  220.  
  221.         if (moveingRight)
  222.             //Как я понял. Скрипт тут(в Unity) исполняется каждый кадр, и соответственно передвижение происходит по принципу: сдвинуть на n координат картинку по икс(transform.position.x)
  223.             // и игрек(transform.position.у) Переменная speed просто некий коэффицент, на который мы двигаем картинку нпс.
  224.             transform.position = new Vector2(transform.position.x + speed * Time.deltaTime, transform.position.y);
  225.         else
  226.             //Как я понял. Скрипт тут(в Unity) исполняется каждый кадр, и соответственно передвижение происходит по принципу: сдвинуть на n координат картинку по икс(transform.position.x)
  227.             // и игрек(transform.position.у) Переменная speed просто некий коэффицент, на который мы двигаем картинку нпс.
  228.             transform.position = new Vector2(transform.position.x - speed * Time.deltaTime, transform.position.y);
  229.     }
  230.  
  231.     void Angry()
  232.     {
  233.         // Сводка: MoveTowards()
  234.         //     Moves a point current towards target.
  235.         //     Перевод: Перемещает текущую точку к цели.
  236.         //
  237.         // Параметры:
  238.         //   current:
  239.         //
  240.         //   target:
  241.         //
  242.         //   maxDistanceDelta:
  243.         //
  244.         // Мы перемещаем нашего нпс(current: transform.position)  на некоторую
  245.         // координату(maxDistanceDelta: speed * Time.deltaTime) каждый кадр в сторону цели(target: player.position)
  246.         //
  247.         // В данном случае мы смещаем его в сторону игрока
  248.         transform.position = Vector2.MoveTowards(transform.position, player.position, speed * Time.deltaTime);
  249.     }
  250.  
  251.     void GoBack()
  252.     {
  253.         // Сводка: MoveTowards()
  254.         //     Moves a point current towards target.
  255.         //     Перевод: Перемещает текущую точку к цели.
  256.         //
  257.         // Параметры:
  258.         //   current:
  259.         //
  260.         //   target:
  261.         //
  262.         //   maxDistanceDelta:
  263.         //
  264.         // Мы перемещаем нашего нпс(current: transform.position) на некоторую
  265.         // координату(maxDistanceDelta: speed * Time.deltaTime) каждый кадр в сторону цели(target: point.position)
  266.         //
  267.         // В данном случае мы смещаем его в зону патрулирования
  268.         transform.position = Vector2.MoveTowards(transform.position, point.position, speed * Time.deltaTime);
  269.     }
  270.  
  271.     // Зеркалит спрайт бота
  272.     void Flip()
  273.     {
  274.         facingRight = !facingRight;
  275.         Vector3 Scaler = transform.localScale;
  276.         Scaler.x *= -1;
  277.         transform.localScale = Scaler;
  278.     }
  279. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement