Jump to content
Sign in to follow this  
Константин Орлов

Unity: Наследование у класса с ХП и ХП регеном [скрипт]

Recommended Posts

Living Class.jpgСкрипт, который является базовым классом, от которого вы можете наследовать другие классы (скрипты). Смысл в том, что создавая скрипт, и вешая его на GameObject (например, NPC или моба, а может и игрока), вы можете унаследовать его от этого, и тогда получите функции, описанные в самом скрипте в комментариях в начале.

 

Это может понадобиться, если у вас много видом мобов или NPC, и у них планируются свои разновидности (еще дочерние классы), и вы хотите всем задать одни и те же особенности. Например, у всех должно быть хп, максимум хп, и здоровье должно восстанавливаться. Если вы их будете наследовать от этого базового класса (либо от других классов, которые наследуются от этого), то все они будут иметь свойства описанные в скрипте.

 

В тексте скрипта все описано, единственное на что стоит уделить особое внимание - в вашем классе-наследнике в методе Start  должен содержаться вызов ХП-регена, иначе ХП не будет восстанавливаться со временем:

 

    void Start()
    {
        StartCoroutine(HPRegen());
    }

Сам скрипт (класс), от которого нужно наследоваться: 

Спойлер

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Living : MonoBehaviour {
    //Этот класс определяет поведение живых существ в игре. Для работы скрипта создайте класс наследник (ваш_класс : Living)
    //и повесьте ваш скрипт на игровой объект. Этот скрипт вешать не надо, так как он автоматически "подгрузится".

    //Наследники класса автоматически получают:
    //- переменную с текущим ХП, в методах доступа к которой уже заложено, что она не может быть больше
    //значения переменной, определяющей максимальный уровень ХП.
    //- переменную, определяющую максимум ХП;
    //Обе переменные protected, и наследуются дочерними классами, но видны в инспекторе и доступны для редактирования.
    //
    //Также этот класс реализрует ХП реген, чтобы активировать его в дочернем классе, необходимо в методе Start вызвать 
    //функцию ХП регена (HPRegen();). В инспекторе вы можете задать силу ХП регена и частоту
    //Для каждого экземляра классов-наследников (каждого игрового объекта) можно устанавливать свои значения скорости регена, максимума хп и т.п.

    //ТЕКУЩЕЕ ХП
    [SerializeField]
    protected float currHP = 22; //значение текущего ХП
    public float CurrHP //метод доступа к текущему значению ХП
    {
        get { return currHP; } //просто возвращаем инфу о кол-ве ХП
        set
        {
            currHP = value; //устанавливаем полученное значение в переменную ХП
            if (value >= MaxHP) currHP = MaxHP; //если полученное значение больше максимума ХП, то ХП устанавливается в максимум
            if (currHP <= 0) Debug.Log("HP < 0, Object is Dead!!!"); //если ХП 0 или меньше, то выводим сообщение, что объект умер
        }
    }

    //МАКСИМАЛЬНОЕ ХП
    [SerializeField]
    protected float maxHP = 100; //значение максимального ХП
    public float MaxHP //метод доступа к максимальному значению ХП
    {
        get { return maxHP; }
        set
        {
            maxHP = value;
        }
    }

    //### НАСТРОЙКИ И МЕТОД ХП РЕГЕНА ### - эти поля отображаются в инспекторе и у наследников класса
    [Header("Настройки ХП регена")]
    [SerializeField]
    [Tooltip("Сила урона/лечения (отрицательные числа отнимают ХП, положительные прибавляют)")]
    protected float DamageOrHealing = 1;
    [SerializeField]
    [Tooltip("Как часто регать ХП(в секундах)")]
    protected float SecondsRate = 1;
    [SerializeField]
    [Tooltip("Вкл/выкл ХП реген (галочка работает только если у наследующего класса в Start есть вызов метода ХП регена)")]
    protected bool HPRegenEnabled = true; //галочка не отключает работу корутины, она определяет будет ли работающая корутина влиять на ХП

    //функция выполняющая реген ХП с помощью корутины (помните - ее нужно вызывать в Start из дочерних классов, иначе ХП не регается)
    protected IEnumerator HPRegen()
    {
        while (true) //условие выполнения корутины (если true, то будет выполняться всегда), если это условие отключит корутину, 
            //то она "уничтожится", и сама заново не запустится, даже когда условие опять станет true (придется заново вызывать метод корутины из другого кода)
        {
            Debug.Log("Корутин ХП регена Living запущена"); //для теста
            if (HPRegenEnabled) //переключатель из инспектора, если поставить галочку, то ХП реген остановится (тут уже можно бескоречно вкл/выкл, ничего вызывать не надо)
            {
                CurrHP += DamageOrHealing; //прибавляет к текущему ХП или отнимает, если число отрицательное, используя модификатор доступа
            }
            yield return new WaitForSeconds(SecondsRate); //задержка в секундах
        }
    }
    //КОНЕЦ: НАСТРОЙКИ И МЕТОД ХП РЕГЕНА


    void Start ()
    {

    }


     void Update()
    {



    }
}

Share this post


Link to post
Share on other sites
 

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
Sign in to follow this  

  • Если у вас есть факты, вещдоки, и свидетельские показания, то обратитесь: vk.com/orkons или orkons@ya.ru, они будут проверены и опубликованы. Возможна беседа под запись с публикацией на YouTube.
    Все материалы на сайте сделаны в пародийных целях и являются художественным вымыслом, все совпадения с реальными людьми и событиями случайны.

Powered by Invision Community
Поддержка Invision Community в России