Zatruwanie przeciwnika

Programowanie w Unity.

Zatruwanie przeciwnika

Postprzez _QFL_ » 17 Lip 2020, 20:18

Chcę, aby przeciwnik był zatruwany, gdy oberwie danym pociskiem. W sensie pocisk A zadaje normalne obrażenia, pocisk B zatruwa. Zdaję sobie sprawę, że na to jest wiele sposobów, ale moje umiejętności programowania póki co to mniej więcej piwnica... Jak można zrobić taki efekt, ewentualne co bym musiał wysłać, by zaradzić coś na to?
_QFL_
 
Posty: 4
Rejestracja: 13 Lip 2020, 09:05
Has thanked: 0 time
Been thanked: 0 time

Re: Zatruwanie przeciwnika

Postprzez Wichur » 18 Lip 2020, 08:11

naprosciej jakims booleanem sprawdzic czy pocisk B "isZatruty"
Awatar użytkownika
Wichur
 
Posty: 137
Rejestracja: 19 Gru 2017, 10:33
Miejscowość: Pruszcz Gdański
Has thanked: 0 time
Been thanked: 0 time

Re: Zatruwanie przeciwnika

Postprzez Hostur » 05 Sie 2020, 09:37

To zależy :)
Inaczej będzie wyglądać taki system dla dużej skalowalnej gry a inaczej dla małego testu także opiszę krótko jak możesz sobie zrobić szybki test.

1. Pocisk musi nieść na sobie jakieś info, np coś w stylu

Kod: Zaznacz wszystko
public enum BulletEffect { None = 0, LightPoison = 1, DeadlyPoison = 2 }

public class Bullet : MonoBehaviour
{
  [SerializeField] [Range(0, 10)] private float _damage;
  [SerializeField] private BulletEffect _effect;
  public BulletEffect Effect => _effect;
  public float Damage => _damage;
}


2. Przy trafieniu musisz pobrać komponent Bullet z prefabu który trafił przeciwnika i używając jego danych zaaplikować efekt - zakładam że to już jakoś robisz bo rozumiem, że obrażenia z pocisku już jakoś dodajesz na cel.

3. Robisz sobie prosty komponent efektu, który nakładasz na cel.

Kod: Zaznacz wszystko
public class BulletEffectComponent : MonoBehaviour
{
  [SerializeField] private float _tickEffectTime;
  private EntityHealthComponet _entityHealth;
  private BulletEffect _bulletEffect;
  private byte _effectTicksRemaining; 

  // Can be used from another scipt to add some visual effect etc
  public bool IsPoisoned => _effectTicksRemaining > 0;

  // Called on AddComponent for newly spawned effect.
  // Also can be called on existing effect to reset _effectTicksRemaining.
  public void Apply(BulletEffect effect)
  {
    if(_entityHealth == null)
      _entityHealth = GetComponent<EntityHealthComponent>();

    if(effect >= _bulletEffect)
    {
     _bulletEffect = effect;
     _effectTicksRemaining = 10; // Może chcesz ustawiać ilość ticków i czas między nimi na podstawie jakiejś własnej logiki?
    }
    else
    {
      //If entity have DeadlyPoision and we hit him with LightPoison we just increase remaining ticks by one
      ++_effectTicksRemaining;
    }
   
    CancelInvoke();
    StartInvoking("TickEffect", 1, _tickEffectTime);
  }

  private void TickEffect()
  {
    if(--_effectTicksRemaining < 0)
    (
      CancelInvoke();
      return;
    )

    var damage = GetEffectDamage();
    _entityHealth.ApplyDamage(damage);
  }

  private float GetEffectDamage()
  {
     switch(_bulletEffect)
     {
       case(LightPoison) return 2;
       case(DeadlyPoison) return 6;
       default: return 0;
     }
  }
}


Przy strzale sprawdzasz czy pocisk ma efekt != None i jeśli tak to sprawdzasz czy postać ma już BulletEffect, jeśli tak to wywołujesz na nim Apply. Jeśli takiego komponentu nie ma to dodajesz taki komponent i wywołujesz na nim apply. Możesz też założyć że prefab z przeciwnikiem po prostu ma ten komponent na sobie cały czas a Ty go tylko raz pobierasz i ewentualnie wywołujesz apply w określonym momencie.
Hostur
 
Posty: 758
Rejestracja: 05 Sie 2015, 07:36
Has thanked: 0 time
Been thanked: 0 time


Wróć do Skrypty

Kto jest na forum

Użytkownicy przeglądający to forum: Brak zarejestrowanych użytkowników oraz 3 gości

cron