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
)。
我的场景中有 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
)。