Оптимизация поведения Ragdoll в Unity - PullRequest
2 голосов
/ 16 октября 2019

Я пытаюсь сделать реалистичный переход между анимацией ходьбы и процессом падения с помощью тряпичной куклы. По сути, при вызове функции «DoRagdoll» я добавляю предыдущую силу из анимации ходьбы ко всем компонентам жесткого тела в отношении их масс. Затем я деактивирую компонент аниматора и включаю гравитацию для всех твердых тел. Это работает, но все равно выглядит странно. Я уже много пробовал, как на сайте документации Unity, по поводу проблем с ragdolls, а также я поиграл с соединениями различных частей тела. Я использовал систему buildin для создания ragdoll. Любые идеи о том, как улучшить переход или как создать более реалистичный рэгдолл?

void Awake()
{
    rbs = GetComponentsInChildren<Rigidbody>();
    DoRagdoll(false);
    foreach (Rigidbody rb in rbs)
    {
        rb.useGravity = false;
        //rb.isKinematic = true;
    }
}

public void DoRagdoll (bool isRagdoll)
{
    if (isRagdoll)
    {
        foreach (Rigidbody rb in rbs)
        {
            rb.AddForce(rb.mass * rb.velocity, ForceMode.Impulse);
        }
    }
    GetComponent<Animator>().enabled = !isRagdoll;
    if (isRagdoll)
    {
        foreach (Rigidbody rb in rbs)
        {
            rb.maxDepenetrationVelocity = 0.01f;
            rb.useGravity = true;
            //rb.isKinematic = false;
        }
        NavMeshAgent agent = GetComponent<NavMeshAgent>();
        //GameObject.FindGameObjectWithTag("pelvis").GetComponent<PelvisPush>().PushPelvis();
        rbSlowdown = true;
        ragdollOn = true;
    }
    else
    {
        GetComponent<NavMeshAgent>().speed = GameObject.FindGameObjectWithTag("root").GetComponent<OldmanMovement>().movSpeed;
        foreach (Rigidbody rb in rbs)
        {
            rb.useGravity = false;
            //rb.isKinematic = true;
        }
        ragdollOn = false;
    }
}
...