我的右侧 Vive 控制器上有一个触发对撞机,可以检测带有“ Enemy
”标签的游戏对象何时在抓取范围内。为了创建一个“抓取”,我将一个FixedJoint
组件添加到控制器,其中 Enemy 游戏对象作为connectedBody
. 松开握把后,我设置connectedBody = null
和Destroy(joint)
(其中关节是固定关节)。每当我释放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;
}
}