我创建了一个系统,系统会在一段时间内不断生成立方体,这些立方体上有一个脚本,当玩家在一定半径内,正对着立方体,按下"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方法可能会导致立方体无法被删除。

总之,这个问题可能是由于脚本中使用的方法存在问题导致的。需要仔细检查脚本代码并尝试解决这些问题。