Raycast 问题,当场景 unity3d 中有很多对象时

Raycast problem, when you have many objects in the scene unity3d

我的场景中有 15 个物体,当使用光线投射时,它会拍摄相机附近的第一个物体,即使你喜欢最后一个物体,它也会破坏第一个物体。 这是我的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;


public class SecondD : MonoBehaviour
{
    Ray _ray;
    RaycastHit _raycastHit;
    Camera _camera;
    // Start is called before the first frame update
    void Start()
    {
        _camera = Camera.main;
    }

    // Update is called once per frame
    void Update()
    {

        if(Input.GetMouseButtonDown(0))
        {
            ShootRay();
        }
    }
    private void ShootRay()
    {
        _ray = _camera.ScreenPointToRay(Input.mousePosition);
        if(Physics.Raycast(_ray, out _raycastHit))
        {
            Destroy(GameObject.FindWithTag("Objects"));
        }
    }
}

您正在使用 FindWithTag,它将 return 场景中首先遇到的具有给定标签的任何对象。

您更想实际使用您用光线投射击中的对象:

private void ShootRay()
{
    var ray = _camera.ScreenPointToRay(Input.mousePosition);
    if(Physics.Raycast(_ray, out var raycastHit))
    {
        if(raycastHit.transform.CompareTag("Objects"))
        {
            Destroy(raycastHit.transform.gameObject);
        }
    }
}

一般来说,为了这个目的而不是标签,你应该使用 Layers 并让你的光线投射只命中那个特定的层(这是你不能用标签做的)。

// Adjust via the Inspector
[SerializeField] private LayerMask hitLayer;

...

    if(Physics.Raycast(_ray, out var raycastHit, float.PositiveInfinity, hitLayer))
    {
        Destroy(raycastHit.transform.gameObject);
    }

如果您还想同时击中多个对象,您宁愿使用 Physics.RaycastAll 并对结果进行迭代 (foreach)。