помогите с задачей

помогите с задачей

Сообщение BIOS23 21 ноя 2015, 14:26

всем привет, уже не одну неделю ломаю голову как решить такое вот условие. Помогите, направите на путь истинный. (в скриптинге у меня совсем небольшой опыт)
2д игра на фотон клауд. чтото типа арены. у персонажей есть переменная очков, когда 2 перса сталкиваются друг с другом, то тот у кого очков меньше ворует у того у кого больше. На первый взгляд все просто, я построил решение таким образом:
на префабе перса есть управляющий скрипт, в котором ОнКолижен событие вызывается при столкновении с другим персом(отслеживает по тегу "Плеер"), получает очки противника, сравнивает со своими, и выполняет одно из условий:
1. если мои очки больше чем у противника, то у меня отнять кусок очков
2. если мои очки меньше чем у противника, то мне добавить.
И это все происходит на мастерклиенте.
Получается когда 2 перса сталкиваются, у ОБОИХ вызывается событие колизии, происходит проверка, и у каждого из них выполняеться разный кусок кода. одному добавляется очки, другому отнимается.
Так вот у меня все это прекрасно работало, но когда я решил ввести флаг неуязвимости, и добавил проверку в событии - если перс неуязвим, то не выполнять это событие, то начались нехорошие баги.
И я начал думать возможно нужно не на каждом персе проверять столкновение с другими, а сделать в сцене какой то контроллер (типа рефери) который следит кто с кем столкнулся , обрабатывает логику и выдает значение очков игрокам (на мастерклиенте). Но проблема в том - как отследить события столкновения, если ОнКолижен метод должен быть на персах, и как обезопасить себя от того, что если в одном тике столкнутся 2 пары персов, обработчик (рефери) не будет знать какую пару из них обрабатывать, правда можно в массиве что бы он получал игроков, но как то мудрено все. Или может дистанцию использовать между персами, но у меня будет около 30ти игроков на арене, и каждый с каждым должен прощитывать дистанцию, уж вроди ресурсозатратно. Извините если криво объяснил, надеюсь на помощь советом, спрашивайте что не понятно, я развернуто опишу.
BIOS23
UNец
 
Сообщения: 13
Зарегистрирован: 30 авг 2015, 14:15

Re: помогите с задачей

Сообщение Cr0c 21 ноя 2015, 14:50

Как костыль, можно отнимать 0.5 очков - сработает же 2 раза
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: помогите с задачей

Сообщение BIOS23 21 ноя 2015, 15:31

да, но проблема в флажке "я под защитой", вот кусочек кода:

Синтаксис:
Используется csharp
void OnTriggerEnter2D(Collider2D collider)
    {
        if (collider.gameObject.tag == "ColliderInteraction") // когда сталкиваемся с тригером который привязан вокруг  другого игрока (у меня колизия не плееров а тригерной зоны вокруг плееров)
        {
            Player_Control enemy = collider.gameObject.transform.root.GetComponent<Player_Control>();
            if (!protected_flag && !enemy.protected_flag) // если защита у обоих отключена
            {
                float pointEnemy = enemy.point;

                if (PhotonNetwork.isMasterClient)
                {
                    if (pointEnemy > point)
                    {
                        speed += Mathf.Abs(pointEnemy - point) / 5;
                        Debug.LogError("+");
                    }
                    if (pointEnemy < point)
                    {
                        point-= Mathf.Abs(pointEnemy - point) / 3;
                        Debug.LogError("-");
                    }

                    m_PhotonView.RPC("point_Voice", PhotonTargets.All, point);
                    StartCoroutine("ProtectedStatusChange"); // запускаем корутину что бы игрок не мог взаимодействовать с другими игроками на 3 сек
                }
            }
        }


    IEnumerator ProtectedStatusChange()
    {
        protected_flag = true;
        yield return new WaitForSeconds(3);
        protected_flag = false;
    }



вот тут как раз получается что protected_flag мне всю жизнь и портит (но защита нужна по геймплею).

происходит такая штука с флагом "protected_flag" :
игроки столкнулись, и событие выполняется только у одного игрока, потому что у второго оно уже выполняется быстрей и корутина ставит флаг protected_flag = true; и соответственно событие не выполняется.
BIOS23
UNец
 
Сообщения: 13
Зарегистрирован: 30 авг 2015, 14:15

Re: помогите с задачей

Сообщение Cr0c 21 ноя 2015, 16:06

можно у обоих очки посчитать, а потом второму флаг игнора одной коллизии, как вариант. или передавать в независимую функцию обработку переноса очков.
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81

Re: помогите с задачей

Сообщение BIOS23 21 ноя 2015, 16:23

или передавать в независимую функцию обработку переноса очков.

этот вариант мне кажется более правильным, но не получится такая проблема как я писал выше, что одновременно у двух пар столкновение и функция незнает кого общитовать?

и какой способ лдуше использовать что бы передеть обработчику параметры? как обработчик должен отслеживать колизии плееров ?
BIOS23
UNец
 
Сообщения: 13
Зарегистрирован: 30 авг 2015, 14:15

Re: помогите с задачей

Сообщение Cr0c 21 ноя 2015, 16:48

добавить GameObject ignorePlayer и в коллизии задавать второму в это поле себя, а у него в коллизии
Синтаксис:
Используется csharp
if (ignorePlayer != null) { ignorePlayer=null; return; }
делать, например
Аватара пользователя
Cr0c
Адепт
 
Сообщения: 3035
Зарегистрирован: 19 июн 2015, 13:50
Skype: cr0c81


Вернуться в Photon

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2