Пятница, 29 Марта 2024, 11:49

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Интерполяция анимации (Или как сгладить анимацию?)
Интерполяция анимации
ZekkinДата: Воскресенье, 24 Апреля 2016, 01:20 | Сообщение # 1
частый гость
Сейчас нет на сайте
Доброе время суток.
Сделал синхронизацию анимации между игроками, но образовалось большое но - анимации всех других игроков, кроме подконтрольного, дергаются, будто пропускают кадры. Сразу подумалось что тут должно быть что-то вроде интерполяции, но гугл молчит - интерполяции анимации не находит sad Может быть это как-то по-другому называется?
Собственно сам код синхронизации:

Код
using UnityEngine;
using System.Collections;

public class AnimatePlayer : MonoBehaviour {
    public Animation anim;
    //=====
    public AnimationClip walk;
    public AnimationClip stay1;
    public AnimationClip walkL;
    public AnimationClip walkR;
    public AnimationClip walkB;
    public AnimationClip Shoot;
    //====
    public void Start ()
    {
  anim.Stop();
    }

    void StayAnimation() {      
  GetComponent<NetworkView> ().RPC("SyncAnimation", RPCMode.All, 0);
    }
    
    void RunAnimation() {    
  GetComponent<NetworkView> ().RPC("SyncAnimation", RPCMode.All, 1);
    }

    void RunLAnimation() {    
  GetComponent<NetworkView> ().RPC("SyncAnimation", RPCMode.All, 2);
    }

    void RunRAnimation() {    
  GetComponent<NetworkView> ().RPC("SyncAnimation", RPCMode.All, 3);
    }

    void RunBAnimation() {    
  GetComponent<NetworkView> ().RPC("SyncAnimation", RPCMode.All, 4);
    }

    void ShootAnimation() {    
  GetComponent<NetworkView> ().RPC("SyncAnimation", RPCMode.All, 5);
    }

    [RPC]
    void SyncAnimation(int index) {
  if(index == 0) {
   anim.Play(stay1.name);
  } else if
  (index == 1) {
   anim.Play(walk.name);    
  }
  else if (index == 2)
  {
   anim.Play(walkL.name);
  }
  else if (index == 3)
  {
   anim.Play(walkR.name);
  }
  else if (index == 4)
  {
   anim.Play(walkB.name);
  }
  else if (index == 5)
  {
   anim.Play(Shoot.name);
  }
    }
    
    public void Update () {
  if (GetComponent<NetworkView> ().isMine) {
   {
    if (Input.GetKey (KeyCode.W)) {
     RunAnimation();
     anim ["Run"].speed = 1f;
     //anim.Play ("Run");  
    } else if (Input.GetKey (KeyCode.S)) {
     RunBAnimation();
     anim ["RunBack"].speed = 0.3f;
     //anim.Play ("RunBack");   
    } else if (Input.GetKey (KeyCode.D)) {
     RunRAnimation();
     anim ["RunRight"].speed = 0.4f;
     //anim.Play ("RunRight");
    } else if (Input.GetKey (KeyCode.A)) {
     RunLAnimation();
     anim ["RunLeft"].speed = 0.4f;
     //anim.Play ("RunLeft");  
    } else {
     StayAnimation();
     anim ["Breath"].speed = 0.5f;
     //anim.Play ("Breath");
    }

   }
  }
    }   
}


Делал по нарытому в интернетах и понятому из разных исходников.
Почему-то кажется что все должно быть просто, вроде интерполяции для перемещения объектов, но вот найти ничего не могу. Если по синхронизации анимаций гугл еще что-то находил, то по интерполяции оных - нуль.
Спасибо.
LertmindДата: Воскресенье, 24 Апреля 2016, 04:35 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Во-первых, тебе стоит перейти на новую сетевую систему, эта устарела и не желательна. Судя по описанию RPC ты вызываешь эту функцию у всех, то есть если у тебя три компонента на сцене где есть функция помеченная [RPC] и имеет одинаковое имя, то все три вызовутся. При трёх получается что на каждого накладывается по две анимации. Попробуй отключать у клонов эти компоненты.
Вообще я посмотрел пример со старой сетью, там для синхронизации анимации используется OnSerializeNetworkView, а не RPC. Если интересно он здесь в архиве (его удалили со страницы Unity).
ZekkinДата: Воскресенье, 24 Апреля 2016, 12:55 | Сообщение # 3
частый гость
Сейчас нет на сайте
Благодарю за ссылочку =)
По поводу устаревшей системы - я так и не нашел отличия старой системы от того же UNET, разве что последний лобби и мастер-сервер от себя предоставляет. Попробую на стандартном нетворке сделать, если все будет так уж страшно - перейду на UNET.

Добавлено (24 апреля 2016, 12:55)
---------------------------------------------
Все синхронизировалось, красота!) Единственное но - чуть-чуть дергаются анимации если слишком сильно замедлять их в скрипте таким макаром:

Код
anim ["RunRight"].speed = 0.4f;

Но в целом все очень даже неплохо =)
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Интерполяция анимации (Или как сгладить анимацию?)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг