Анимация в сети.

Сеть в Unity3D

Анимация в сети.

Сообщение elf01 07 янв 2018, 15:34

Ребят, проблема такая, что анимация не отображается у других игроков когда один из них, к примеру, двигается.
Вот скажем я выполняю в коде анимацию.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class PlayerController : NetworkBehaviour  {

    private Animator animator;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    void Update()
    {

        animator.SetBool("move", false);
        if (Input.GetKey(KeyCode.W))
        {
            animator.SetBool("move", true);
        }
 


на персонажа конечно добавил компонент NetworkAnimator и поставил галочки на свою анимацию. Но не не отображается анимацию у других.

читал разные доки и так искал, находил что надо вставить такой код
Синтаксис:
Используется csharp
   
    public override void OnStartLocalPlayer()
    {
        NetworkAnimator netAnim = GetComponent<NetworkAnimator>();
       
        netAnim.SetParameterAutoSend(0, true);
    }

    public override void PreStartClient()
    {
        NetworkAnimator netAnim = GetComponent<NetworkAnimator>();
        netAnim.SetParameterAutoSend(0, true);
    }


Я конечно пробовал вставлять эту часть кода в скрипт, но не помогло.
elf01
UNIверсал
 
Сообщения: 370
Зарегистрирован: 07 июл 2013, 08:59

Re: Анимация в сети.

Сообщение [COAD] H00JAMBRA 07 янв 2018, 16:07

Я бы написал свой аналог networkanimator, к примеру у нас есть лист анимации и каждой анимации присвоен свой уникальный индекс, далее просто игрок сообщает серверу у меня проигрывается анимка с индексом X, сервер этот же индекс передает другим игрокам и она проигрывается у них. А так думаю стоит поискать в YouTube думаю там полно уроков по синхронизации анимации в сети.
Аватара пользователя
[COAD] H00JAMBRA
UNец
 
Сообщения: 46
Зарегистрирован: 09 июл 2017, 13:51

Re: Анимация в сети.

Сообщение elf01 07 янв 2018, 16:54

Я у китайцев посмотрел, и понял что не передаю клиентам никак. Я дописал.

Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class PlayerController : NetworkBehaviour  {

    private Animator animator;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    void Update()
    {

        animator.SetBool("move", false);
        if (Input.GetKey(KeyCode.W))
        {
            CmdMove();
        }
   }

[Command]
    void CmdMove()
    {
        animator.SetBool("move", true);
        RpcMove();
    }

    [ClientRpc]
    void RpcMove()
    {
        animator.SetBool("move", true);
    }
 


Но теперь анимация работает только у хоста, а у других нет, ну и так же не отображается у других.
elf01
UNIверсал
 
Сообщения: 370
Зарегистрирован: 07 июл 2013, 08:59

Re: Анимация в сети.

Сообщение [COAD] H00JAMBRA 07 янв 2018, 17:39

https://www.youtube.com/watch?v=vUFwSXlBv6M

вот серия уроков думаю то что тебе нужно
Аватара пользователя
[COAD] H00JAMBRA
UNец
 
Сообщения: 46
Зарегистрирован: 09 июл 2017, 13:51

Re: Анимация в сети.

Сообщение elf01 07 янв 2018, 18:09

[COAD] H00JAMBRA писал(а):https://www.youtube.com/watch?v=vUFwSXlBv6M

вот серия уроков думаю то что тебе нужно


Я смотрел это, похоже, но не то. у него вопервых все анимации через float, у меня же bool. Так же у него привязано к движению камеры. ну короче, то все понятно и разобрать что тебе, надо, но это не то.
elf01
UNIверсал
 
Сообщения: 370
Зарегистрирован: 07 июл 2013, 08:59

Re: Анимация в сети.

Сообщение [COAD] H00JAMBRA 07 янв 2018, 21:45

elf01 писал(а):Я смотрел это, похоже, но не то. у него вопервых все анимации через float, у меня же bool. Так же у него привязано к движению камеры. ну короче, то все понятно и разобрать что тебе, надо, но это не то.


ты bool значение не сможешь передать, нужно как то преобразовать в int или как у него float
сделай просто animator.SetFloat("move", 1); где 1 это будет тру, а 0 - фолс
Аватара пользователя
[COAD] H00JAMBRA
UNец
 
Сообщения: 46
Зарегистрирован: 09 июл 2017, 13:51

Re: Анимация в сети.

Сообщение elf01 07 янв 2018, 22:27

[COAD] H00JAMBRA писал(а):
elf01 писал(а):Я смотрел это, похоже, но не то. у него вопервых все анимации через float, у меня же bool. Так же у него привязано к движению камеры. ну короче, то все понятно и разобрать что тебе, надо, но это не то.


ты bool значение не сможешь передать, нужно как то преобразовать в int или как у него float
сделай просто animator.SetFloat("move", 1); где 1 это будет тру, а 0 - фолс


хорошо это сделаю. а что весь остальной код оставлять так же или что-то надо изменить?
elf01
UNIверсал
 
Сообщения: 370
Зарегистрирован: 07 июл 2013, 08:59

Re: Анимация в сети.

Сообщение [COAD] H00JAMBRA 07 янв 2018, 22:59

Вроде ок все, только в апдейте не нужно вызывать каждый кадр строку где мув делаешь фолс, запихни ее в отдельную функцию и вызывай когда нужно либо сделай проверку какую то чтоб раз проверило и все, например:
Синтаксис:
Используется csharp
if (Input.GetKey(KeyCode.W))
{
      animator.SetInteger("move", 1);
}else
{
        if (animator.GetCurrentAnimatorStateInfo(0).IsName("move")) // точно не помню но вроде так проверять если текущая анимация
             animator.SetInteger("move", 0);
}
 
Аватара пользователя
[COAD] H00JAMBRA
UNец
 
Сообщения: 46
Зарегистрирован: 09 июл 2017, 13:51

Re: Анимация в сети.

Сообщение elf01 08 янв 2018, 09:32

[COAD] H00JAMBRA писал(а):Вроде ок все, только в апдейте не нужно вызывать каждый кадр строку где мув делаешь фолс, запихни ее в отдельную функцию и вызывай когда нужно либо сделай проверку какую то чтоб раз проверило и все, например:


Ну я скажем сделал так, но всеравно не отображает у других игроков. Если что NetworkAnimator удалил с персонажей, я думаю он не нужен если так передавать пытаемся.

Синтаксис:
Используется csharp
sing System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class PlayerController : NetworkBehaviour  {

    private Animator animator;
    private int _move0 = 0;
    private int _attack0 = 0;

    void Start()
    {
        animator = GetComponent<Animator>();
        _move0 = 1;
        if (isLocalPlayer)
        {
            CmdMove();
        }
    }

    void Update()
    {
         if (Input.GetKey(KeyCode.W))
        {
            _move0 = 0;
            if (isLocalPlayer) {
            CmdMove();
            }
        }

        if (Input.GetKeyUp(KeyCode.W))
        {
            _move0 = 1;
            if (isLocalPlayer)
            {
                CmdMove();
            }
        }
   }

[Command]
    void CmdMove()
    {
        animator.SetInteger("move0", _move0);
        RpcMove();
    }

    [ClientRpc]
    void RpcMove()
    {
        animator.SetInteger("move0", _move0);
    }
 
elf01
UNIверсал
 
Сообщения: 370
Зарегистрирован: 07 июл 2013, 08:59

Re: Анимация в сети.

Сообщение elf01 08 янв 2018, 11:32

подсмотрел на одном форуме и попробовал так, но всеравно не передает, так еще теперь и все время одна анимация играет, хотя значения меняются. По этому вернулся к предыдущему коду, но все же выложу этот вариант, вдруг он почти правильный.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class PlayerController : NetworkBehaviour  {

    private Animator animator;
    private int _move0 = 0;
    private int _attack0 = 0;

    void Start()
    {
        animator = GetComponent<Animator>();
        _move0 = 1;
         CmdMove();
    }

    void Update()
    {
         if (Input.GetKey(KeyCode.W))
        {
            _move0 = 0;
            CmdMove(_move0);
        }

        if (Input.GetKeyUp(KeyCode.W))
        {
            _move0 = 1;
            CmdMove(_move0);
        }
   }

[Command]
    void CmdMove(int anim)
    {
        RpcMove(anim);
    }

    [ClientRpc]
    void RpcMove(int anim)
    {
        if (!isLocalPlayer) {
            animator.SetInteger("move0", anim);
        }
    }
 
 
elf01
UNIверсал
 
Сообщения: 370
Зарегистрирован: 07 июл 2013, 08:59

Re: Анимация в сети.

Сообщение [COAD] H00JAMBRA 08 янв 2018, 16:11

Вроде как все правильно, единственное вместо "move0" - твое название анимации и в апдейте лучше сделать так:
Синтаксис:
Используется csharp
if (Input.GetKeyUp(KeyCode.W)) // если отпускаем кнопку анимации останавливается
{
     // ниже можно не приравнивать  к нулю а передать другую анимацию..
     _move0 = 0;
     CmdMove(_move0);
}

if (Input.GetKeyDown(KeyCode.W)) // если зажата клавиша
{
     if(_move0 != 1){
          _move0 = 1;
          CmdMove(_move0);
     }
}
 
Аватара пользователя
[COAD] H00JAMBRA
UNец
 
Сообщения: 46
Зарегистрирован: 09 июл 2017, 13:51

Re: Анимация в сети.

Сообщение [COAD] H00JAMBRA 08 янв 2018, 16:29

Я бы сделал примерно так:

Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class PlayerController : NetworkBehaviour  {

    private Animator animator;
    private int animationID = 0; // это айди анимации к примеру 0-idle, 1-move, 2-jump и т.д.

    void Start()
    {
        animator = GetComponent<Animator>();
        animationID = 0; // при старте игры к примеру играем анимацию спокойствия
        CmdAnimationPlay(animationID); // 0-id анимации
    }

    void Update()
    {
         if (Input.GetKeyDown(KeyCode.W))
        {
            if(animationID != 1)
            {
                  animationID = 1; // бег
                  CmdAnimationPlay(animationID);
            }
        }

        if (Input.GetKeyUp(KeyCode.W))
        {
            if(animationID == 1)
            {
                  animationID = 0;
                  CmdAnimationPlay(animationID);
            }
        }
   }

[Command]
    void CmdAnimationPlay(int anim)
    {
        RpcAnimation(anim);
    }

    [ClientRpc]
    void RpcAnimation(int anim)
    {
        if (!isLocalPlayer) {
            switch(anim){
                case 0:
                      animator.SetInteger("idle", true);
                 break;
                 case 1:
                      animator.SetInteger("move", true);
                 break;
                 case 2:
                      animator.SetInteger("jump", true);
                 break;
                 default:
                      animator.SetInteger("idle", true);
                 break;
            }
        }
    }
 
 
 


как то так.. на работоспособность не проверял, но думаю разберешься.. так же в RpcAnimation если нужно можно отключать все остальные анимации кроме текущей.
Аватара пользователя
[COAD] H00JAMBRA
UNец
 
Сообщения: 46
Зарегистрирован: 09 июл 2017, 13:51


Вернуться в Сеть

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

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