Unity3D
GameDev.ru / Сообщества / Unity3D / Форум / Capsule Collider не следует за анимацией

Capsule Collider не следует за анимацией

nuke_birdПользовательwww3 янв. 201821:25#0
Я новичок в юнити, потихоньку вникаю в суть

Друг сделал для меня тестовую модель и набор анимаций к ней
Как сделать так, чтобы капсула следила за анимацией героя?

На ролике показана суть проблемы (проблема особенно заметна, когда проигрывается Jump анимация):

nuke_birdПользовательwww3 янв. 201821:49#1
Ну и вообще хотелось бы узнать как правильно добавлять collision volume'ы для кастомных мешей
MadwareПостоялецwww4 янв. 20189:37#2
А как персонаж движется? Через Root Motion или нет?
nuke_birdПользовательwww4 янв. 201812:29#3
Madware
> А как персонаж движется? Через Root Motion или нет?
через кастомный скрипт
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerAI : MonoBehaviour
{
    public float rotation_speed = 90;
    Animator animator;
    Rigidbody rb;
    int speed_hash = Animator.StringToHash("Speed");
    int jump_hash = Animator.StringToHash("Jump");
    int jump_state_hash = Animator.StringToHash("Base Layer.Jump");

  // Use this for initialization
  void Start ()
    {
        animator = GetComponent<Animator>();
        rb = GetComponent<Rigidbody>();
  }
  
  // Update is called once per frame
  void Update ()
    {
        float speed = Input.GetAxis("Vertical");

        animator.SetFloat(speed_hash, speed);

        var info = animator.GetAnimatorTransitionInfo(0);

        if (Input.GetKeyDown(KeyCode.Space) && 
            info.nameHash != jump_state_hash)
        { 
            animator.SetTrigger(jump_hash);
        }
        float rotation = Input.GetAxis("Horizontal") * rotation_speed;
        
        rb.transform.Rotate(Vector3.up, rotation * Time.smoothDeltaTime);
        rb.transform.Translate(new Vector3(-speed * 3.5f * Time.smoothDeltaTime, 0, 0));
    }
}
+ Показать

Мне больше всего хочется научиться программировать скрипты для юнити, вот потихоньку изучаю вопрос методом тыка и чтением документации. Есть опыт работы с С++, переучиваю себя на С#

Правка: 4 янв. 2018 12:30

MadwareПостоялецwww6 янв. 20181:00#4
>rb.transform.Translate(new Vector3(-speed * 3.5f * Time.smoothDeltaTime, 0, 0));

Так делать не стоит. Двигайте через MovePosition(правда это вам не поможет определить как прыгает персонаж, для этого нужно использовать root motion, либо убрать из анимации сам прыжок и анимировать его вручную через код)

Правка: 6 янв. 2018 1:01

MadwareПостоялецwww6 янв. 20182:25#5
а можно раскрыть иерархию у armature полностью и показать скриншот?

Правка: 6 янв. 2018 2:27

nuke_birdПользовательwww6 янв. 201816:03#6
Madware
> а можно раскрыть иерархию у armature полностью и показать скриншот?
+ Показать

Madware
> Так делать не стоит. Двигайте через MovePosition
А есть какая-то существенная разница? (кроме читабельности)

Madware
> нужно использовать root motion

+ Показать

Я тоже думал что это может помочь, но галочка "Apply root motion" как будто ни на что не влияет. Хотя, конечно, скорее всего я чего-то не понимаю

P.S.: вы можете скачать проект здесь https://github.com/NukeBird/DummyUnityProject

MadwareПостоялецwww7 янв. 201810:20#7
nuke_bird
> А есть какая-то существенная разница? (кроме читабельности)

Физику нужно двигать через физику.

The reason why it is recommended to use MovePosition is because when the rigid body is NOT kinematic, an extra step is taken into account when calculating how the rigid body reacts to physics. Since the transform has nothing to do with physics, it is just the coordinate information of the NON physics based components of the Game Object, this causes variation between the two bodies.

Now MovePosition takes this into effect and more properly handles your transform information along with your rigid body information.

When you think about it, when translating the transform and not the rigid body itself in the case of NON-kinematic bodies, the rigid body information is thus calculated at the end of the physics step frame, causing a slight difference in the two positions of each body. It's pretty much the same thing if you translate the position of the rigid body using

rigidbody.position
or anything of the like. MovePosition was made specifically to deal with this oscillation of the two bodies in conjunction with active physics. CPU overhead is negligible in this case, since MovePosition was made specifically for this purpose.

MadwareПостоялецwww7 янв. 201811:16#8
Посмотрел ваш проект. Судя по всему, вам нужно попросить друга поменять анимацию прыжка, так чтобы в действительности позиция персонажа в ней не менялась, и анимировать прыжок вручную через код. В данном случае это будет самым правильным решением

/ Форум / Unity3D / Общее

2001—2018 © GameDev.ru — Разработка игр