我已经编写了一个控制器脚本,用于在TopDown-Shooter中打开门。
我围绕其本地 Y 轴旋转枢轴点以打开门对象。门应该保持打开状态,所以我不再需要控制器和控制器对象。我想在完成它的工作后摧毁它。
我的脚本如下所示:
public class DoorController : MonoBehaviour
{
public Transform pivotLeftTransform; // the left pivot point
public Transform pivotRightTransform; // the right pivot point
int openAngle = 90; // how far should the door open up?
bool startOpen = false; // start opening?
float smooth = 2; // smooth rotation
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Player")
{
startOpen = true; // when the Player triggers, start opening
}
}
void Update()
{
if (startOpen)
{
OpenDoor(pivotLeftTransform, openAngle);
OpenDoor(pivotRightTransform, -openAngle);
if (pivotLeftTransform.localRotation.y == openAngle && pivotRightTransform.localRotation.y == -openAngle) // when the doors are rotated, destroy this object
{
Destroy(gameObject);
}
}
}
private void OpenDoor(Transform pivotTransform, int rotationAngle)
{
Quaternion doorRotationOpen = Quaternion.Euler(0, rotationAngle, 0); // desired door rotation
pivotTransform.localRotation = Quaternion.Slerp(pivotTransform.localRotation, doorRotationOpen, smooth * Time.deltaTime); // rotate the door to the desired rotation
}
}
我的问题是,我怎样才能摧毁这个物体。我的代码
if (pivotLeftTransform.localRotation.y == openAngle && pivotRightTransform.localRotation.y == -openAngle)
似乎不起作用。将枢轴点旋转到 90 度或 -90 度后,语句仍然保持 false。我也试过
pivotTransform.rotation.y
但它也不起作用。我需要传入哪个旋转?
谢谢。
代码中有两点错误:
1.比较浮点数
2.使用transform.localRotation
或transform.rotation
检查角度。
您可以使用 eulerAngles
或 localEulerAngles
来解决此问题。同样为了比较浮点数,请使用>=
而不是=
因为这可能永远不会正确。
取代
if (pivotLeftTransform.localRotation.y == openAngle && pivotRightTransform.localRotation.y == -openAngle)
{
Destroy(gameObject);
}
跟
if (pivotLeftTransform.localEulerAngles.y >= openAngle && pivotRightTransform.localRotation.y >= -openAngle)
{
Destroy(gameObject);
}
如果您对上面的答案有疑问,则必须一一排除故障。分离&&
,看看哪一个像这样失败:
if (pivotLeftTransform.localEulerAngles.y >= openAngle)
{
Debug.Log("pivotLeftTransform");
}
if (pivotRightTransform.localRotation.y >= -openAngle)
{
Debug.Log("pivotRightTransform");
}
正确的架构方法是添加一个小的容差值:
if (pivotLeftTransform.localEulerAngles.y >= openAngle - 0.1f && pivotRightTransform.localEulerAngles.y <= 360 - openAngle + 0.1f)
这可能不是代码干净的,但它目前有效:)