Хочу узнать правильно ли я делаю. Есть баф. Допустим он длится 5 сек.
Код
float bufTimer; float bufTime = 5;
FixedUpdate() { bufTimer = bufTime + Time.time;
if (bufTimer > Time.time) {<свойства бафа>} }
Вопрос собственно в том, а если ли метод который просто говорит держать какое-то свойство определенный отрезок времени ? Что-то типа <метод>.<сколько секунд>.<свойство бафа> хуяк, хуяк и в продакшн
Сообщение отредактировал ArtemS - Вторник, 15 Августа 2017, 10:45
bodya_WM, вопрос был немного не в этом. И кстати бафф в твоём коде будет работать бесконечно, потому что даже после присвоения в Active значения false, оно нигде не проверяется, да и исходный метод Update должен быть virtual. Подстава для ТСа, чтобы он учился?
P.S.: с такими архитектурными решениями можно поседеть при разработке RPG с сотнями различных баффов и дебаффов. Долгожданный анонсик: State of War
Сообщение отредактировал EchoIT - Четверг, 24 Августа 2017, 11:20
Как раз таки нет. Это наоборот будет намного удобнее. Ну или ещё как вариант хранить баффы в файлах, например json, создать какой то базовый набор "действий" баффа(т.е например лечить или увеличивать скорость) и уже в json это всё описывать. Библиотек для сериализации/десериализации С# для .NET достаточно.
Цитата
И кстати бафф в твоём коде будет работать бесконечно
Согласен, в унаследованном баффе нужно делать проверку на Active. Но я лишь пример привёл, суть автору понятна.
Добавлено (28 августа 2017, 06:52) --------------------------------------------- terami, скинь ,пожалуйста, хотелось бы посмотреть на твое решение вопроса
У меня как то так на StrangeIoCе Основной скрипт с логикой
Код
using UnityEngine; using System.Collections;
namespace NegativeEffects { //кровотечение public class Blooding : INegativeEffects { private static Blooding _blooding;
public static Blooding BloodingEffect { get { return _blooding ?? (_blooding = new Blooding()); } }
public NegativeEffectsType EffectType { get {return NegativeEffectsType.Blooding;} }
//запуск логики public void Add(GameObject go, EffectLevel damage) { if (go.CompareTag(ManagerTag.Enemy)) { var logic = go.AddComponent<EnemyBloodingLogic>();
logic.StartCoroutine(logic.TakeDamage(damage)); } else if (go.CompareTag(ManagerTag.Player)) { var logic = go.AddComponent<PlayerBloodingLogic>();
logic.StartCoroutine(logic.TakeDamage(damage)); } else { if (GeneraGameSetting._GeneraGameSetting.BuildVersion == BuildVersion.Debug) DebugConsole.Log("[Blooding] Передан нейтральный обьект или обьект имеющий инной тег", 3); } }
//запуск логики public void Add(GameObject go, int count, int damage) {
if (go.CompareTag(ManagerTag.Enemy)) { var logic = go.AddComponent<EnemyBloodingLogic>();
logic.StartCoroutine(logic.TakeDamage(count, damage)); } else if (go.CompareTag(ManagerTag.Player)) { var logic = go.AddComponent<PlayerBloodingLogic>();
logic.StartCoroutine(logic.TakeDamage(count, damage)); } else { if (GeneraGameSetting._GeneraGameSetting.BuildVersion == BuildVersion.Debug) DebugConsole.Log("[Blooding (custom)] Передан нейтральный обьект или обьект имеющий инной тег", 3); } } } }
public class PlayerBloodingLogic : MonoBehaviour { private const float DAMAGE_EVERY_SECONDS = 3f;
#region Кровотечение (кастомное)
//кастомный эффект Кровотечение public IEnumerator TakeDamage(int damage, int count) { while (count > 0) { //нанесение урона PlayerParams.HealthState(damage, HealthStateDamageType.Damage); //дебаг if (GeneraGameSetting._GeneraGameSetting.BuildVersion == BuildVersion.Debug) Debug.Log("[Эффект Кровотечение(кастомный) ] " + PlayerParams._PlayerParams.gameObject.name + " получил " + damage + " урона");
count--;
yield return new WaitForSeconds(DAMAGE_EVERY_SECONDS); }
Destroy(this); }
#endregion
#region Кровотечение
//уровни эффекта Кровотечение public IEnumerator TakeDamage(EffectLevel level) { int count; //количество ударов int damage; //дамаг
switch (level) { //1 уровень Кровотечения case EffectLevel.One: count = 5; damage = 7; while (count > 0) { PlayerParams.HealthState(damage, HealthStateDamageType.Damage); //дебаг if (GeneraGameSetting._GeneraGameSetting.BuildVersion == BuildVersion.Debug) Debug.Log("[Эффект Кровотечение ] " + PlayerParams._PlayerParams.gameObject.name + " получил " + damage + " урона");
count--;
yield return new WaitForSeconds(5f); } break; //2 уровень Кровотечения case EffectLevel.Two: count = 7; damage = 25; while (count > 0) { PlayerParams.HealthState(damage, HealthStateDamageType.Damage); //дебаг if (GeneraGameSetting._GeneraGameSetting.BuildVersion == BuildVersion.Debug) Debug.Log("[Эффект Кровотечение ] " + PlayerParams._PlayerParams.gameObject.name + " получил " + damage + " урона");
count--;
yield return new WaitForSeconds(3f); } break; //3 уровень кровотечения case EffectLevel.Three: count = 10; damage = 40; while (count > 0) { PlayerParams.HealthState(damage, HealthStateDamageType.Damage); //дебаг if (GeneraGameSetting._GeneraGameSetting.BuildVersion == BuildVersion.Debug) Debug.Log("[Эффект Кровотечение ] " + PlayerParams._PlayerParams.gameObject.name + " получил " + damage + " урона");
using UnityEngine; using System.Collections; using strange.extensions.context.impl;
/*=========================================== = Класс-контролер для управления заклинаниями = и наложением негативных эффектов =============================================*/
//список заклинаний Школы Огня public enum FireMagicSpell { FireClot, FireBall, FeedFire, FireWall, Meteor }
public class NegativeEffectsAndSpellControl : ContextView {
public static NegativeEffectsAndSpellControl NegativeEffectsAndSpell { get { if (!_negativeEffectsAndSpellControl) { _negativeEffectsAndSpellControl = FindObjectOfType<NegativeEffectsAndSpellControl>() as NegativeEffectsAndSpellControl; }
return _negativeEffectsAndSpellControl; } }
#endregion
private void Awake() { this.context = new NegativeEffectsAndSpellContext(this); context.Start(); }
//ДЛЯ ТЕСТОВ public void Update() { //if (Input.GetButtonDown("Fire1")) //{ // var ray = Camera.main.ScreenPointToRay(Input.mousePosition); // EarthMagicStoneBallController.EarthStoneBallControl.CreateSpell(ray);
//} //else if (Input.GetKeyDown(KeyCode.A)) //{ // FireMagicFeedFireController.FireFeedControl.CreateSpell(); //} }
-делаешь иерархию нормальную -делаешь каждый баф отдельным компонентом со своей логикой -делаешь контроллер , который будет накладывать эти баффы -через котроллер просто добавляешь к обьекту через AddComponent нужный бафф со всей его логикой, дальше он уже независимо от других компонентов будет работать ну в общем MVC