Не работает сериализация/интерполяция

Не работает сериализация/интерполяция

Сообщение akter23 09 июн 2017, 18:59

Всем привет! 3 день никак не могу понять что не так с работой скрипов.
Собственно вот кусок кода отвечающий за сериализацию объекта.
Синтаксис:
Используется csharp
    Vector3 oldPos;
    Vector3 newPos;
        if!photonView.isMine)
        {
                Debug.LogError("<Color=Green>Vector3.Lerp: " + Vector3.Lerp(oldPos, newPos, Time.deltaTime * 5f) + "</Color>");
                transform.position = Vector3.Lerp(oldPos, newPos, Time.deltaTime * 5f);
        }

    void IPunObservable.OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.isWriting)
        {
            oldPos = transform.position;
            stream.SendNext(oldPos);
            Debug.LogError("<Color=Yellow>stream.isWriting " + gameObject.name + "| SerializeView position: " + oldPos + "| new Pos " + newPos + "</Color>");
        }
        else
        {
            oldPos = transform.position;
            newPos = Vector3.zero;
            oldPos = (Vector3)stream.ReceiveNext();
            newPos = oldPos;
            Debug.LogError("<Color=Black>stream.isReading " + gameObject.name + "| SerializeView position: " + oldPos + "| new Pos " + newPos + "</Color>");
        }
    }
 

В таком виде объект принимает координаты 0.0.0 и ни о чем другом даже слышать не хочет. Дебаг показывает, что координаты совпадают с позицией объекта, но в инспекторе он всё равно находится в нулях.
Пробовал стандартный фотоновский скрипт
Синтаксис:
Используется csharp
public class SmoothSyncMovement : Photon.MonoBehaviour, IPunObservable
{
    public float SmoothingDelay = 5;
    private Vector3 correctPlayerPos = Vector3.zero; //We lerp towards this
    private Quaternion correctPlayerRot = Quaternion.identity; //We lerp towards this

    void Update()
    {
        if (!photonView.isMine)
        {
            //Update remote player (smooth this, this looks good, at the cost of some accuracy)
            transform.position = Vector3.Lerp(transform.position, correctPlayerPos, Time.deltaTime * 1f);
            transform.rotation = Quaternion.Lerp(transform.rotation, correctPlayerRot, Time.deltaTime * 1f);
        }
    }

    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.isWriting)
        {
            //We own this player: send the others our data
            stream.SendNext(transform.position);
            stream.SendNext(transform.rotation);
        }
        else
        {
            correctPlayerPos = (Vector3)stream.ReceiveNext();
            correctPlayerRot = (Quaternion)stream.ReceiveNext();
        }
    }
}

Но он тоже не дал никаких плодов, разве что объект теперь стал дергаться в ноль ноль координаты.
Я перелапатил уже все форумы англоязычные и русскоязычные, но вся инфа с них не дает решения вопроса.
Вот фото дебага Изображение
Вот фото Фотонвиева и в нём находится первый скрипт Изображение
Подскажите, что же все таки не так??? Почему при идентичном коде у всех остальных всё работает, а у меня 0 0 0
P.S. создавал отдельный проект и в нем стандартный фотоновский скрипт отображает позицию игроков нормально...
Аватара пользователя
akter23
UNITрон
 
Сообщения: 191
Зарегистрирован: 21 фев 2014, 08:11

Re: Не работает сериализация/интерполяция

Сообщение seaman 09 июн 2017, 19:01

Можно спросить - а нафига Вы везде LogError сделали? Вы считаете что у Вас везде в коде ошибки?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Не работает сериализация/интерполяция

Сообщение akter23 09 июн 2017, 19:28

seaman писал(а):Можно спросить - а нафига Вы везде LogError сделали? Вы считаете что у Вас везде в коде ошибки?

Хотелось видеть, что происходит в каждом блоке кода. Думал, может таким образом удаться выявить проблему.
Аватара пользователя
akter23
UNITрон
 
Сообщения: 191
Зарегистрирован: 21 фев 2014, 08:11

Re: Не работает сериализация/интерполяция

Сообщение seaman 09 июн 2017, 20:30

Так Error то зачем?
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Не работает сериализация/интерполяция

Сообщение akter23 09 июн 2017, 21:44

seaman писал(а):Так Error то зачем?

Мне проще за ним наблюдать и он отображается в скомпилированном окне. К тому же я заметил, что на игровой процесс он вроде как не влияет.Или я ошибаюсь?
Аватара пользователя
akter23
UNITрон
 
Сообщения: 191
Зарегистрирован: 21 фев 2014, 08:11

Re: Не работает сериализация/интерполяция

Сообщение seaman 09 июн 2017, 22:34

на игровой процесс он вроде как не влияет.

Если только не включена "Error Pause"
Изображение
Вообще Ваш скрипт - какая то мешанина. Даже разбирать не буду.
Ну а Фотоновский по идее должен работать. Конечно если photonView.observed == this.Полностью скрипт Фотоновский попробуйте. Там в Awake делается необходимая проверка
Синтаксис:
Используется csharp
    public void Awake()
    {
        if (this.photonView == null || this.photonView.observed != this)
        {
            Debug.LogWarning(this + " is not observed by this object's photonView! OnPhotonSerializeView() in this class won't be used.");
        }
}
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Не работает сериализация/интерполяция

Сообщение akter23 10 июн 2017, 14:14

Error Pause выключена, конечно же.
Пробую использовать стандартный фотоновский скрипт - проверка не ругается. Чекнул каждый объект и на каждом объекте находится именно тот скрипт, который должен на нём находиться
Скрытый текст:
Изображение

Но это всё равно не работает.... Координаты 0 0 0
Возможно что-то не так в скрипте отвечающем за перемещение?
Синтаксис:
Используется csharp
myTransform.position += myTransform.forward * movespeed * Time.deltaTime;

В чем может быть ошибка?
Аватара пользователя
akter23
UNITрон
 
Сообщения: 191
Зарегистрирован: 21 фев 2014, 08:11

Re: Не работает сериализация/интерполяция

Сообщение Aleksey 11 июн 2017, 01:23

akter23 писал(а):Всем привет! 3 день никак не могу понять что не так с работой скрипов.


ты обнуляешь движение(newPos) которое участвует в лерпе. Это вариант движения обнуляет третий аргумент лерпа.Для того чтобы быстрей дойти до конца отрезка .Позиции в лерпе он не обнуляет.
Вот нормальная реализация быстрой передачи позиций.
Синтаксис:
Используется csharp
using UnityEngine;
public class CubeLerp : Photon.MonoBehaviour
{
    private Vector3 latestCorrectPos;
    private Vector3 onUpdatePos;
    private float fraction;

    void Start()
    {
        latestCorrectPos = transform.position;
        onUpdatePos = transform.position;
    }

    void OnPhotonSerializeView(PhotonStream stream)
    {
        if (stream.isWriting)
            stream.SendNext(transform.position);
        else
        {
            Vector3 pos = Vector3.zero;
            pos = (Vector3)stream.ReceiveNext();

            latestCorrectPos = pos;              
            onUpdatePos = transform.position;
            fraction = 0;                          
        }
    }

    void Update()
    {
        if (photonView.isMine)  return;
               
        fraction = fraction + Time.deltaTime * 9;
        transform.position = Vector3.Lerp(onUpdatePos, latestCorrectPos, fraction);
    }
}
Продукты на тему онлайна в Ассет Сторе
_https://www.assetstore.unity3d.com/en/# ... sher:21589
Аватара пользователя
Aleksey
UNIт
 
Сообщения: 56
Зарегистрирован: 17 фев 2015, 16:09

Re: Не работает сериализация/интерполяция

Сообщение akter23 12 июн 2017, 15:21

Aleksey писал(а):
akter23 писал(а):Всем привет! 3 день никак не могу понять что не так с работой скрипов.


ты обнуляешь движение(newPos) которое участвует в лерпе. Это вариант движения обнуляет третий аргумент лерпа.Для того чтобы быстрей дойти до конца отрезка .Позиции в лерпе он не обнуляет.
Вот нормальная реализация быстрой передачи позиций.
Синтаксис:
Используется csharp
using UnityEngine;
public class CubeLerp : Photon.MonoBehaviour
{
    private Vector3 latestCorrectPos;
    private Vector3 onUpdatePos;
    private float fraction;

    void Start()
    {
        latestCorrectPos = transform.position;
        onUpdatePos = transform.position;
    }

    void OnPhotonSerializeView(PhotonStream stream)
    {
        if (stream.isWriting)
            stream.SendNext(transform.position);
        else
        {
            Vector3 pos = Vector3.zero;
            pos = (Vector3)stream.ReceiveNext();

            latestCorrectPos = pos;              
            onUpdatePos = transform.position;
            fraction = 0;                          
        }
    }

    void Update()
    {
        if (photonView.isMine)  return;
               
        fraction = fraction + Time.deltaTime * 9;
        transform.position = Vector3.Lerp(onUpdatePos, latestCorrectPos, fraction);
    }
}


С вашим скриптом явно есть прогресс. Проблема в том, что теперь объекты вместо того, чтобы перемещаться в 0 0 0 - просто стоят на месте и ничего не делают. Я пробовал Ваш код заносить и в основной скрипт перемещения объектов и выносить в отдельный, но результат один и тот же.
Опытным путем я выявил одну интересную вещь:Если добавлять скрипт с OnPhotonSerializeView на префаб ручками, то начинают выскакивать вот такие предупреждения
Скрытый текст:
Изображение

А если добавлять так
Синтаксис:
Используется csharp
void Start()
    {
        photonView.ObservedComponents.Add(this);
        }

То предупреждения не появляются. Всё чисто.
Тем не менее, в обоих случая объекты стоят на месте. Гугл никакой толковой информации не даёт
Игра жанра TD. Может в этом жанре есть какие-то подводные камни? Или что я делаю не так?
Аватара пользователя
akter23
UNITрон
 
Сообщения: 191
Зарегистрирован: 21 фев 2014, 08:11

Re: Не работает сериализация/интерполяция

Сообщение Aleksey 13 июн 2017, 06:03

ты что то намудрил. Давай начнем сначала.
возьмем твой префаб :
на нем компонент фотонвиев
в нем значит обсервед компонент скрипт который передает движение(первый скрипт)
Само движение от владельца префаба(второй скрипт)
Два скрипт полных эти покажи
Продукты на тему онлайна в Ассет Сторе
_https://www.assetstore.unity3d.com/en/# ... sher:21589
Аватара пользователя
Aleksey
UNIт
 
Сообщения: 56
Зарегистрирован: 17 фев 2015, 16:09

Re: Не работает сериализация/интерполяция

Сообщение Aleksey 13 июн 2017, 06:05

Все правильно автор поста делает по поводу дебаг ЛогЕрор. Обычный тест вывода данных на стороне второго игрока который не в юнити, а в пс билде тестит.
Продукты на тему онлайна в Ассет Сторе
_https://www.assetstore.unity3d.com/en/# ... sher:21589
Аватара пользователя
Aleksey
UNIт
 
Сообщения: 56
Зарегистрирован: 17 фев 2015, 16:09

Re: Не работает сериализация/интерполяция

Сообщение akter23 13 июн 2017, 11:36

Aleksey писал(а):ты что то намудрил. Давай начнем сначала.
возьмем твой префаб :
на нем компонент фотонвиев
в нем значит обсервед компонент скрипт который передает движение(первый скрипт)
Само движение от владельца префаба(второй скрипт)
Два скрипт полных эти покажи

Фотонвиев на нём, разумеется, есть. Для передачи движения я использовал тот скрипт, который Вы написали выше. Собственно я решил впиндюрить его в скрипт движения.
Синтаксис:
Используется csharp
private Vector3 latestCorrectPos;
    private Vector3 onUpdatePos;
    private float fraction;
///////////////////////////////////////////////////////////////////////////////////////////////////
        void Start()
    {
        if (!photonView.isMine) GetComponent<WorkAI>().enabled = false;
        photonView.ObservedComponents.Add(this);
        latestCorrectPos = transform.position;
        onUpdatePos = transform.position;
        mainTower = GameObject.Find("DefenseObject");
                xaudio = GetComponent<AudioSource>();
                anim = GetComponent<Animation>();
                myTransform = transform;
        Mindam = GetComponent<MainAI>().Damage[0];
        Maxdam = GetComponent<MainAI>().Damage[1];
                distanceattack = GetComponent<MainAI>().DistanceAttack;
                distancemove = GetComponent<MainAI>().DistanceMove;
                movespeed = GetComponent<MainAI>().MoveSpeed;
                rotationspeed = GetComponent<MainAI>().RotationSpeed;
                anim[animationCharapter[0].name].speed = GetComponent<MainAI>().SpeedRunAnimation;
        attack = true;
        }

    void IPunObservable.OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.isWriting)
        {
            stream.SendNext(transform.position);
        }
        else
        {
            Vector3 pos = Vector3.zero;
            pos = (Vector3)stream.ReceiveNext();

            latestCorrectPos = pos;
            onUpdatePos = transform.position;
            fraction = 0;
        }
    }

        void Update()
    {
            if (SpecTrue)
            {
                SpecTrue = false;
            }

            if (target != null)
            {
                myTransform.rotation = Quaternion.Slerp(myTransform.rotation,
                    Quaternion.LookRotation(target.transform.position - myTransform.position), rotationspeed * Time.deltaTime);
                distance = Vector3.Distance(target.transform.position, myTransform.position);
                if (distance < distanceattack)
                {
                    doPerson = Person.Person_Attack;
                }
                else if (distance >= distanceattack)
                {
                    doPerson = Person.Person_Move;
                }
            }

            if (targetList.Count == 0)
            {
                attack = true;
                if (gameObject.tag == "Defender" || gameObject.tag == "Clone") targetList.AddRange(GameObject.FindGameObjectsWithTag("Attacker"));
                if (gameObject.tag == "Attacker") targetList.AddRange(GameObject.FindGameObjectsWithTag("Defender"));
            }

            if (target == null)
            {
                doPerson = Person.Person_Find;
            }

            switch (doPerson)
            {
                case Person.Person_Attack:

                    if (attack)
                    {
                        attack = false;
                        anim.CrossFade(animationCharapter[Random.Range(1, 3)].name);
                        if (TAU == TypeAttackUnit.Melee)
                        {
                            StartCoroutine(UnitAttackMelee());
                        }
                        else
                        {
                            StartCoroutine(UnitAttackRange());
                        }
                    }

                    if (target != null)
                    {
                        if (target.GetComponent<MainAI>().Death)
                        {
                            if (GetComponent<BiggerAttacker>())
                            {
                                GetComponent<BiggerAttacker>().curAttack = 0;
                                AttackEndInt = 0;
                            }
                            targetList.Remove(target);
                            target = null;
                        }
                    }


                    break;

                case Person.Person_Move:

                    myTransform.position += myTransform.forward * movespeed * Time.deltaTime;
                    if (!anim.IsPlaying(animationCharapter[1].name) && !anim.IsPlaying(animationCharapter[2].name))
                    {
                        anim.Play(animationCharapter[0].name);
                    }

                    break;


                case Person.Person_Find:
                    if (attack == true || target == null)
                    {
                        for (int i = 0; i < targetList.Count; i++)
                        {
                            if (targetList[i] == null)
                            {
                                targetList.Remove(targetList[i]);
                            }
                            if (!targetList[i].GetComponent<MainAI>().Death)
                            {
                                dist = targetList[i].transform.position - myTransform.position;
                            }
                            if (dist.magnitude <= distancemove)
                            {
                                target = targetList[i];
                            }
                            distancemove = dist.magnitude;
                        }
                    }
                    break;
            }
        if (!photonView.isMine)
        {
            fraction = fraction + Time.deltaTime * 9;
            transform.position = Vector3.Lerp(onUpdatePos, latestCorrectPos, fraction);
        }
    }
 

Пробовал их сначала разделять, но результат тот же
Аватара пользователя
akter23
UNITрон
 
Сообщения: 191
Зарегистрирован: 21 фев 2014, 08:11

Re: Не работает сериализация/интерполяция

Сообщение akter23 15 июн 2017, 12:03

Ну так что?
Аватара пользователя
akter23
UNITрон
 
Сообщения: 191
Зарегистрирован: 21 фев 2014, 08:11

Re: Не работает сериализация/интерполяция

Сообщение Aleksey 18 июн 2017, 05:13

akter23 писал(а):Ну так что?

Проверь работает ли нормально у тебя навмеш передвижения без передачи по сети .
А так ,я не знаю где твоя проблема. У тебя скрипт ссылается на другие скрипты . И я не знаю что в них. И я не хочу тратить на это много времени узнавая твои другие скрипты " Person" и бигератакер и т.д. Извини.
Ну и советую тебе разделять получше игровую логику в скрипте по разными скриптам. Поведение например я бы на твоем месте вынес в другой скрипт. Я это например делаю еще из-за того что передавать данные по сети сложнее чем делать сингл и если это перемешивается то намного сложней понять где косяк в передачи сетевых данных(как например у тебя). Я часто стараюсь в своих проектах отделять всю сетевую логику передачи поведения от простой поведенческой обрабатывающей логики
Продукты на тему онлайна в Ассет Сторе
_https://www.assetstore.unity3d.com/en/# ... sher:21589
Аватара пользователя
Aleksey
UNIт
 
Сообщения: 56
Зарегистрирован: 17 фев 2015, 16:09

Re: Не работает сериализация/интерполяция

Сообщение akter23 18 июн 2017, 12:02

Aleksey писал(а):
akter23 писал(а):Ну так что?

Проверь работает ли нормально у тебя навмеш передвижения без передачи по сети .
А так ,я не знаю где твоя проблема. У тебя скрипт ссылается на другие скрипты . И я не знаю что в них. И я не хочу тратить на это много времени узнавая твои другие скрипты " Person" и бигератакер и т.д. Извини.
Ну и советую тебе разделять получше игровую логику в скрипте по разными скриптам. Поведение например я бы на твоем месте вынес в другой скрипт. Я это например делаю еще из-за того что передавать данные по сети сложнее чем делать сингл и если это перемешивается то намного сложней понять где косяк в передачи сетевых данных(как например у тебя). Я часто стараюсь в своих проектах отделять всю сетевую логику передачи поведения от простой поведенческой обрабатывающей логики

Я понял, спасибо за ответ. Я изначально задумывал проект под сингл и даже не думал, что буду пилить мультиплеер, т.к обладал очень малым опытом работы с кодом. По мере создания проекта получал опыт написания кода, его архитектуры и т.д. Сейчас, значит, начну отделять сетевые от сингл скриптов.
Аватара пользователя
akter23
UNITрон
 
Сообщения: 191
Зарегистрирован: 21 фев 2014, 08:11

След.

Вернуться в Photon

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

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