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

#unity3d #rotation

#unity3d #вращение

Вопрос:

Привет, итак, я создаю сценарий отдачи для своего шутера от первого лица. У меня пистолет работает довольно хорошо. Вот мой скрипт:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GunRecoil : MonoBehaviour
{

    public Vector3 beforeRecoilRotation, rightBeforeRecoilRotation, leftBeforeRecoilRotation;
   //I have a separate script controlling maxRecoilX and recoil
    public float maxRecoilX = -0, recoilSpeed = 10, recoil = 0;
    [SerializeField]
    GameObject leftControl, rightControl, weapon;
    public bool once = false;

    // Start is called before the first frame update

    void Recoiling()
    {
        //if recoil is present
        if (recoil > 0)
        {

            //make amount of recoil
            var maxRecoil = Quaternion.Euler(maxRecoilX, 0, 0);
            //move gun's rotation, according to recoil
            weapon.transform.localRotation = Quaternion.Slerp(weapon.transform.localRotation, maxRecoil, Time.deltaTime * recoilSpeed);
            

            //subtract recoil by time.
            recoil -= Time.deltaTime;
        }
        else
        {
            //make sure recoil is now zero
            recoil = 0;

            //make min recoil, based on starting position
            Quaternion minRecoil = Quaternion.Euler(beforeRecoilRotation);
            Quaternion minRecoilHandRight = Quaternion.Euler(0, 0, 0);
            weapon.transform.localRotation = Quaternion.Slerp(weapon.transform.localRotation, minRecoil, Time.deltaTime * recoilSpeed / 2);
            // rightControl.transform.localRotation = Quaternion.Slerp(rightControl.transform.localRotation, minRecoilHandRight, Time.deltaTime * recoilSpeed / 2);

            maxRecoilX = 0;

        }
    }
    // Update is called once per frame
    void Update()
    {
        //constantly run Recoiling

        Recoiling();
    

}




}
  

У меня также есть руки для моего пистолета. Я хочу, чтобы они следовали за вращением пистолета, за вращением моего пистолета.
Сначала я попробовал просто применить отдачу к руке. Результаты были близки, но недостаточно близки. Я использовал что-то вроде

 var maxRecoilRight = Quaternion.Euler(maxRecoilX *5f, 0, 0);  

rightControl.transform.localRotation = Quaternion.Slerp(weapon.transform.localRotation, maxRecoilRight, Time.deltaTime * recoilSpeed);
  

Вот результаты:
отдача один

Я также пробовал использовать Fast IK: https://assetstore.unity.com/packages/tools/animation/fast-ik-139972#reviews . Это не сработало, поскольку я использую части руки в анимации, я также не могу привязать руки к пистолету, поскольку мне придется заменять анимации, и это может сломать мою общую установку.

Какую математику я мог бы использовать, чтобы переместить мои руки к моему пистолету в Unity? Пожалуйста, оставьте для меня какие-либо предложения. Спасибо вам и хорошего дня / вечера.

Ответ №1:

Вы могли бы отключить анимацию рук, пока продолжается отдача, и использовать IK-решение на это время. Затем, когда отдача закончится, вы можете снова включить ее.

Комментарии:

1. Хорошо. Знаете ли вы что-нибудь, что может работать с универсальной установкой?

2. Вы могли бы попробовать смешать деревья, чтобы анимировать свои руки в зависимости от некоторого параметра отдачи пистолета.