我的右Vive控制器上有一个触发器对撞机,用于检测" Enemy
"标记的游戏对象何时在抓取范围内。要创建一个“抓取”,'我向控制器添加了一个FixedJoint
组件,其中Enemy gameobject为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;
}
}
答案 0 :(得分:1)
您正在计算releasedVelocity
,但从未设置任何使用其值的内容。
你有:
selectedObj.GetComponent<Rigidbody>().velocity = gameObject.GetComponent<Rigidbody>().velocity;
但这只会将速度设置为您的脚本所附加的GameObject
的速度。我猜你想做:
selectedObj.GetComponent<Rigidbody>().velocity = releasedVelocity;