klasa abstrakcyjna i sendMessage

Programowanie w Unity.

klasa abstrakcyjna i sendMessage

Postprzez gregor9131 » 02 Paź 2018, 18:39

Cześć, mam taki mały problem. Mianowicie, mam klasę abstrakcyjną:
Kod: Zaznacz wszystko
public abstract class EnemyAbstract : MonoBehaviour {
 protected int _enemyHealth;
    public abstract int EnemyHealth { get; set; }
    public abstract void Demage(int demage);
}

Po tej klasie dziedziczy inna klasa:
Kod: Zaznacz wszystko
public class ArcherEnemy : EnemyAbstract
{
 public override int EnemyHealth
    {
        get { return _enemyHealth = 10; }
        set { _enemyHealth = value; }
    }
 public override void Demage(int demage)
    {
        EnemyHealth = EnemyHealth - demage;
        _enemyHealth = _enemyHealth - demage;
    }
}

W tej metodzie mam operacje na obu zmiennych EnemyHealth, żeby je debugować i sprawdzać na których mogę (powinienem) wykonywać operacje.
Oraz 3 klasę, gdzie chcę aby był wysyłany "message", po kolizji:
Kod: Zaznacz wszystko
public GameObject Enemy;
 void OnTriggerEnter2D(Collider2D col)
    {
        if (col.gameObject.tag == "Enemy")
        {
            _checkAttack1 = true;
            if (_checkAttack1 && _pushButton && _death == false)
            {
                SwordHit.Play();
                StartCoroutine(ChangeCheckAttack());
                if (_enemyHealth > 0)
                    StartCoroutine(HitEnemySprites());
               
                Enemy.gameObject.SendMessage("Demage",3);
                _pushButton = false;

            }
        }
    }

W tej trzeciej klasie funkcja się wykonuje do momentu, kiedy trzeba wysłać message, albo jest on wysyłany tylko coś jest nie halo w klasie EnemyArcher. Ktoś podpowie czemu to nie działa i co zmienić, żeby zaczęło?
gregor9131
 
Posty: 20
Rejestracja: 02 Paź 2017, 18:56
Has thanked: 0 time
Been thanked: 0 time

Re: klasa abstrakcyjna i sendMessage

Postprzez simple » 02 Paź 2018, 21:36

Jak niedziala tak to spróboj tak:
To taka moja alternatywa dla SendMessage().

Kod: Zaznacz wszystko
EnemyAbstract[] childs = Enemy.gameObject.GetComponentsInChildren<EnemyAbstract>();
   foreach(EnemyAbstract ab in childs)
     ab.Demage(3);
simple
 
Posty: 5
Rejestracja: 20 Wrz 2018, 09:10
Has thanked: 0 time
Been thanked: 0 time

Re: klasa abstrakcyjna i sendMessage

Postprzez gregor9131 » 02 Paź 2018, 22:38

Dzięki za sugestie, potestowałem to trochę z jedną i drugą metodą debugując zwykłe prywatne zmienne i demage i wychodzi na to, że message jest wysyłany, bo po zdebugowaniu wyrzuca, że demage jest równy 3. Tylko sama operacja na EnemyHealth nie pyka.
gregor9131
 
Posty: 20
Rejestracja: 02 Paź 2017, 18:56
Has thanked: 0 time
Been thanked: 0 time

Re: klasa abstrakcyjna i sendMessage

Postprzez EvilArev » 02 Paź 2018, 22:53

Może tu jest problem:
Kod: Zaznacz wszystko
get { return _enemyHealth = 10; }
?
EvilArev
 
Posty: 354
Rejestracja: 14 Kwi 2013, 15:32
Has thanked: 0 time
Been thanked: 0 time

Re: klasa abstrakcyjna i sendMessage

Postprzez Hostur » 03 Paź 2018, 09:18

Kilka rzeczy
1. "Damage" a nie "Demage"
2.
Kod: Zaznacz wszystko
_checkAttack1 = true;
 if (_checkAttack1{...})

Fajny warunek.

3. To nie jest przykład dla użycia klasy abstrakcyjnej, co najwyżej interfejsu.
Kod: Zaznacz wszystko
public interface IHealth
{
 int Health {get;}
 void Damage(uint value);
}

public class EnemyArcher : IHealth
{
  public int Health { get; private set; }
  public void Damage(uint value)
  {
    int newValue = Health - value;
    Health = (newValue < 0) ? 0 : newValue
  }
}

I tak jak napisał EvilArev, przy pobieraniu enemyhealth zawsze ustawiasz wartość na 10.


Po co Ci ten health jako MonoBehaviour? I po co używać SendMessage w ogóle?
Hostur
 
Posty: 633
Rejestracja: 05 Sie 2015, 07:36
Has thanked: 0 time
Been thanked: 0 time

Re: klasa abstrakcyjna i sendMessage

Postprzez gregor9131 » 03 Paź 2018, 09:44

Fakt, ten warunek nie jest potrzebny.

Jak w takim razie powinna wyglądać tutaj architektura? No ok, interfejs zamiast tej klasy abstrakcyjnej, a zmienne w konkretnych klasach Enemy czy zmienne w klasie abstrakcyjnej, a sama metoda w interfejsie? Czego powinienem użyć, zamiast SendMessage?

Sory, uczę się, konkretnych przykładów jak zbudować takie zależności poprawnie w 100% nie znalazłem.
gregor9131
 
Posty: 20
Rejestracja: 02 Paź 2017, 18:56
Has thanked: 0 time
Been thanked: 0 time

Re: klasa abstrakcyjna i sendMessage

Postprzez Palanthir » 03 Paź 2018, 10:25

Z tego co mi wiadomo SendMessage jest bardzo wolne i nie zalecane. Skoro i tak używasz klasy abstrakcyjnej albo interfejsu, to je sobie pobieraj i wywołuj metodę.
Palanthir
 
Posty: 83
Rejestracja: 31 Sie 2017, 16:13
Has thanked: 0 time
Been thanked: 0 time

Re: klasa abstrakcyjna i sendMessage

Postprzez Hostur » 03 Paź 2018, 11:11

Nie idź w interfejsy i abstrakcje jeśli nie wiesz jak je zastosujesz. Przejście do "wirtualizacji" kodu powinno być następstwem potrzeby z jaką się spotkasz pisząc kod. Tutaj zrobiłeś to na siłę, interfejs też nie jest potrzebny bo pewnie każdy enemy zaiplementuje tą logikę tak samo.

Po co do prostych operacji na danych używać GameObjectów? MonoBehaviour (behaviour) reprezentuje zachowanie a nie dane. Oddziel logikę gry od danych na których wykonujesz tą logikę. Zacznij od zapoznania się z SOLID, data oriented programming/data driven design i Dependency injection jeśli chcesz pisać dobrą architekturę.
Hostur
 
Posty: 633
Rejestracja: 05 Sie 2015, 07:36
Has thanked: 0 time
Been thanked: 0 time

Re: klasa abstrakcyjna i sendMessage

Postprzez gregor9131 » 04 Paź 2018, 11:09

Ok, poczytam sobie trochę o tym. Dzięki za rady:)
gregor9131
 
Posty: 20
Rejestracja: 02 Paź 2017, 18:56
Has thanked: 0 time
Been thanked: 0 time


Wróć do Skrypty

Kto jest na forum

Użytkownicy przeglądający to forum: Bing [Bot] oraz 10 gości