gpt4 book ai didi

c# - 在添加新力之前从 Rigidbody 移除先前的力

转载 作者:太空宇宙 更新时间:2023-11-03 22:50:48 26 4
gpt4 key购买 nike

我在对池化对象应用相对力时遇到问题。

我有一个对象池,里面有我所有的项目符号都可以重复使用。子弹在不使用时被禁用。

当玩家射击他的武器时,从对象池中拉出一颗子弹,并按以下顺序对子弹执行以下操作:

  • 设置有效(真)
  • transform.position = bulletSpawnPosition
  • transform.rotation = 枪支/枪管的旋转
  • RigidBody.AddRelativeForce(Vector3.forward * speed, ForceMode.Impulse)

这只适用于一名玩家。当我有另一个玩家也从对象池中拉子弹时,子弹似乎保持了前一个玩家的旋转,所以力的方向是错误的。

我可以/可以做的一件事是等待下一帧,在设置旋转和应用相对力之间,但感觉不对。我错过了什么吗?下面的代码略有修改,但缩小了范围。

function Shoot() {
GameObject poolObject = GetObjectFromPool();
poolObject.SetActive(true);
poolObject.transform.position = transform.position;
poolObject .transform.rotation = transform.rotation;

if (poolObject != null)
{
//add force
Rigidbody rBody = poolObject.GetComponent<Rigidbody>();
rBody.AddRelativeForce(Vector3.forward * ProjectileSpeed.Value, ForceMode.Impulse);
}
}

最佳答案

在再次使用之前总是从池中重置项目。为池中的每种类型的对象设置一个函数,您可以轻松调用该函数来重置它们。由于子弹附有一个 Rigidbody 并且当您从池中取出它时它仍在移动,只需重置 velocityangularVelocity以防万一它还在旋转。为此,您可以将它们设置为 Vector3(0, 0, 0);Vector3.zero 属性是 new Vector3(0, 0, 0); 的快捷方式,应在此处使用。

应该这样做:

public void resetPool(Rigidbody rg)
{
rg.velocity = Vector3.zero;
rg.angularVelocity = Vector3.zero;
}

关于c# - 在添加新力之前从 Rigidbody 移除先前的力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47414286/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com