我创建了一个系统,系统会在一段时间内不断生成立方体,这些立方体上有一个脚本,当玩家在一定半径内,正对着立方体,按下"E"键时,立方体会被删除。然而,偶尔会出现问题,立方体不会被删除。当这种情况发生时,通常只有等待1到10秒之间的时间,然后再试一次,或者点击立方体顶部的位置才能删除它。 我将立方体本身设置在一个交互层上,而空白物体(有触发碰撞盒)设置在另一个"忽略射线检测"层上。以下是交互代码:
using UnityEngine;
using TMPro;
public class TextOnProximity : MonoBehaviour
{
public TextMeshProUGUI shownText;
public KeyCode interactKey = KeyCode.E;
public bool playerInFixRange = false;
[SerializeField] private int InteractionDistance = 5;
[SerializeField] private LayerMask interactableMask;
bool IsPlayerLookingAtMe()
{
Camera cam = Camera.main;
Ray ray = new Ray(cam.transform.position, cam.transform.forward);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, interactableMask))
{
return hit.collider.transform.root == transform.root;
}
return false;
}
private void Start()
{
shownText.gameObject.SetActive(false);
}
private void Update()
{
if (playerInFixRange && Input.GetKeyDown(interactKey) && IsPlayerLookingAtMe())
{
Destroy(gameObject);
}
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
shownText.gameObject.SetActive(true);
playerInFixRange = true;
}
}
private void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
shownText.gameObject.SetActive(false);
playerInFixRange = false;
}
}
public void PlayerEntered()
{
playerInFixRange = true;
if (shownText != null)
shownText.gameObject.SetActive(true);
}
public void PlayerExited()
{
playerInFixRange = false;
if (shownText != null)
shownText.gameObject.SetActive(false);
}
}
//以下是空白物体的脚本:
using UnityEngine;
public class ProximityRelay : MonoBehaviour
{
public TextOnProximity parentScript;
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
parentScript.PlayerEntered();
}
private void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
parentScript.PlayerExited();
}
}
这个问题可能是由于脚本中使用的Physics.Raycast方法存在问题导致的。这个方法会返回一个RaycastHit对象,如果检测到碰撞并且该碰撞的物体是目标物体的子物体,则返回true,否则返回false。然而,在这个脚本中,IsPlayerLookingAtMe方法中使用了Physics.Raycast方法,可能会导致该方法返回false,从而导致立方体无法被删除。
另一个可能的原因是脚本中使用的Input.GetKeyDown方法存在问题。这个方法会返回true如果玩家在当前帧按下了指定的键,否则返回false。然而,在这个脚本中,Update方法中使用了Input.GetKeyDown方法,可能会导致该方法返回false,从而导致立方体无法被删除。
最后一个可能的原因是脚本中使用的Destroy方法存在问题。这个方法会销毁指定的物体,然而在这个脚本中,Destroy方法可能会导致立方体无法被删除。
总之,这个问题可能是由于脚本中使用的方法存在问题导致的。需要仔细检查脚本代码并尝试解决这些问题。
评论 (0)