Твердое тело SteamVR GameObject высвобождается из захвата с нулевой скоростью

У меня есть триггерный коллайдер на правом контроллере Vive, который определяет, когда игровой объект с тегом «Enemy» находится в пределах досягаемости. Чтобы создать «захват», я добавляю компонент FixedJoint в контроллер с игровым объектом Enemy в качестве компонента connectedBody. После отпускания рукоятки я устанавливаю connectedBody = null и Destroy(joint) (где соединение — это FixedJoint). Всякий раз, когда я отпускаю selectedObj, он падает на землю с нулевой скоростью. Что дает?

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

public class Grab : MonoBehaviour {
    private GameObject selectedObj;
    private GameObject grabbableEnemy;
    public Transform gripTransform;
    private SteamVR_TrackedObject trackedObject;
    private SteamVR_Controller.Device _controllerDevice;
    private SteamVR_TrackedController _controller;

    private Vector3[] positions = new Vector3[2]; // positions[0] last frame, positions[1] this frame;
    private Vector3 releasedVelocity;

    void Awake()
    {
        trackedObject = GetComponent<SteamVR_TrackedObject>();
    }

    // Use this for initialization
    void Start () {
        _controllerDevice = SteamVR_Controller.Input((int)trackedObject.index);
        _controller = GetComponent<SteamVR_TrackedController>();
        positions[0] = Vector3.zero;
        positions[1] = Vector3.zero;
        releasedVelocity = new Vector3(-99,-99,-99);

        selectedObj = null;
        grabbableEnemy = null;
    }

    // Update is called once per frame
    void FixedUpdate () {
        if (selectedObj)
        {
            Debug.Log("Updating velocity");
            positions[0] = positions[1];
            positions[1] = selectedObj.transform.position;
            Debug.Log("Selected obj velocity: " + selectedObj.GetComponent<Rigidbody>().velocity);
        }
        if (_controllerDevice.GetPressDown(SteamVR_Controller.ButtonMask.Grip))
        {
            Debug.Log("Gripped");
            if (grabbableEnemy)
            {
                Debug.Log("Grab sequence begins");
                selectedObj = grabbableEnemy;
                Debug.Log(selectedObj.name);
                selectedObj.transform.position = gripTransform.position;
                var joint = gameObject.AddComponent<FixedJoint>();
                joint.connectedBody = selectedObj.GetComponent<Rigidbody>();
            }
        }
        if (_controllerDevice.GetPressUp(SteamVR_Controller.ButtonMask.Grip))
        {
            Debug.Log("Ungripped");
            if (gameObject.GetComponent<FixedJoint>() && selectedObj)
            {
                Debug.Log("Launch sequence begins");
                // currently unused velocity value
                releasedVelocity = (positions[1] - positions[0]) / Time.deltaTime;

                foreach (FixedJoint joint in gameObject.GetComponents<FixedJoint>()) {
                    joint.connectedBody = null;
                    Destroy(joint);
                }
                selectedObj.GetComponent<Rigidbody>().velocity = gameObject.GetComponent<Rigidbody>().velocity;
                selectedObj.GetComponent<Rigidbody>().angularVelocity = gameObject.GetComponent<Rigidbody>().angularVelocity;

                Debug.Log("Released @ release: " + selectedObj.GetComponent<Rigidbody>().velocity);

                // For garbage collection?
                selectedObj = null;      
            }
        }
    }

    private void OnTriggerStay(Collider other)
    {
        Debug.Log("Triggered");
        if (other.gameObject.tag == "Enemy")
        {
            grabbableEnemy = other.gameObject;
        }
    }

    private void OnTriggerExit(Collider other)
    {
        grabbableEnemy = null;
    }
}

person AlleyOOP    schedule 06.07.2017    source источник
comment
Кстати, selectedObj = null; не помогает с GC. Объект все еще существует. Но это все равно нормально, так как скрипт должен забыть о брошенном объекте. Но =null никак не влияет на память. Однако, если бы это была локальная переменная, она все равно была бы GC.   -  person Draco18s no longer trusts SE    schedule 06.07.2017


Ответы (1)


Вы вычисляете releasedVelocity, но ничего не устанавливаете для использования его значения.

У тебя есть:

selectedObj.GetComponent<Rigidbody>().velocity = gameObject.GetComponent<Rigidbody>().velocity;

но это только установит скорость на скорость GameObject, к которой прикреплен ваш скрипт. Я предполагаю, что вы хотели сделать:

selectedObj.GetComponent<Rigidbody>().velocity = releasedVelocity;
person Foggzie    schedule 06.07.2017