我有一个GameObject
放置在摄像机前面,所以每当玩家拿起一个物品,它将被放置在GameObject
的位置。但是,每当我在拿起物品时移动,物品会抖动。如何防止这种情况发生?
private void FixedUpdate()
{
if (currentlyPickedUpObject != null)
{
currentDist = Vector3.Distance(PickupParent.position, pickupRB.position);
currentSpeed = Mathf.SmoothStep(minSpeed, maxSpeed, currentDist / maxDistance);
currentSpeed *= Time.fixedDeltaTime;
pickupRB.transform.position = PickupParent.position;
Vector3 direction = PickupParent.position - pickupRB.position;
pickupRB.velocity = direction.normalized * currentSpeed;
}
}
if (PickingUp)
{
if (currentlyPickedUpObject == null)
{
if (lookObject != null)
{
PickupObject();
if (lookObject.CompareTag("TargetObj") && !targetObjectsList.Contains(lookObject.gameObject))
{
if (aSource)
{
aSource.Play();
}
targetObjectsList.Add(lookObject.gameObject);
if (targetObjectsList.Count == targetObjects.Length)
{
winUI.SetActive(true);
Time.timeScale = 0f;
//SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
//Time.timeScale = 1f;
}
}
}
}
else
{
// pickupRB.transform.position = PickupParent.position;
BreakConnection();
HoldingItemIcon.SetActive(false);
InteractIcon.SetActive(false);
}
}
PickingUp = false;
public void BreakConnection()
{
pickupRB.constraints = RigidbodyConstraints.None;
currentlyPickedUpObject = null;
lookObject = null;
physicsObject.pickedUp = false;
currentDist = 0;
pickupRB.useGravity = true;
}
public void PickupObject()
{
physicsObject = lookObject.GetComponentInChildren<PhysicsObjects>();
currentlyPickedUpObject = lookObject;
pickupRB = currentlyPickedUpObject.GetComponent<Rigidbody>();
pickupRB.constraints = RigidbodyConstraints.FreezeRotation;
physicsObject.playerInteractions = this;
pickupRB.isKinematic = true;
// pickupRB.transform.position = PickupParent.position;
pickupRB.transform.parent = PickupParent.transform;
//StartCoroutine(physicsObject.PickUp());
}
这是附加到可选对象的代码:
public class PhysicsObjects : MonoBehaviour
{
public float waitOnPickup = 0.1f;
public float breakForce = 35f;
[HideInInspector] public bool pickedUp = false;
[HideInInspector] public ThePlayerInteractions playerInteractions;
private void OnCollisionEnter(Collision collision)
{
if (pickedUp)
{
if (collision.relativeVelocity.magnitude > breakForce)
{
playerInteractions.BreakConnection();
}
}
}
//this is used to prevent the connection from breaking when you just picked up the object as it sometimes fires a collision with the ground or whatever it is touching
public IEnumerator PickUp()
{
yield return new WaitForSecondsRealtime(waitOnPickup);
pickedUp = true;
}
}
除了震动之外,被拿起来的物体因某种原因失去了它们的碰撞器,它们会穿过任何撞到的物体。当物体被持有时,避免这些问题的最佳方法是什么?
pickupRB.transform.SetParent(PickupParent.transform)
,然后移除在固定更新中更新其位置的代码行。它可能会晃动,因为你只在固定更新期间更新了它的位置,而普通更新则运行得更加频繁。 - HumanWrites