网格位置上的 Unity3d Raycast
Unity3d Raycast on mesh position
我想用光线投射击中网格并获取击中发生位置的 mouse/screen 坐标。
public class GetCoordinates: MonoBehaviour {
private GameObject _objectToHit;
private RaycastHit hit;
private Collider coll;
private Ray ray;
private float hitDistance = 200f;
void Start()
{
coll = GetComponent<Collider>();
_objectToHit = GameObject.Find("Street");
}
void Update()
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (coll.Raycast(ray, out hit, hitDistance))
{
Debug.Log(hit.point);
}
}
}
我也不确定在哪里添加脚本,是添加到被击中的对象还是添加到相机?
您想使用Camera.WorldToScreenPoint将世界生命值位置转换为屏幕位置。
此外,您的游戏中只需要一个此脚本的实例,否则您将有多个光线投射。在选择放置此脚本的位置之前,您应该考虑这一点。如果没有更多关于它的用途、多少对象等信息,我们无法帮助您做出选择
编辑脚本使用:
有一件事是肯定的:光线投射脚本必须有一个唯一的实例。如果你想通过这个脚本与其他对象交互,你应该在 hit.collider.gameobject 上使用 GameObject.GetComponent 函数来访问将执行你想要的操作的脚本。
例如,如果您的街道上有一个门,单击它会调用门对象上 GateBehaviour 脚本中包含的 toggleOpen() 函数,如下所示:
if (coll.Raycast(ray, out hit, hitDistance))
{
if(hit.collider.tag == "Gate")
{
GateBehaviour gate = hit.collider.gameobject.GetComponent<GateBehaviour>()
if(gate)
gate.toggleOpen();
}
Debug.Log(hit.point);
}
理想情况下,您应该拥有类似 class 的东西,称为 Interractable,它可以为街上所有可交互的对象提供独特的界面。街道本身也可以继承自这个接口。
我想用光线投射击中网格并获取击中发生位置的 mouse/screen 坐标。
public class GetCoordinates: MonoBehaviour {
private GameObject _objectToHit;
private RaycastHit hit;
private Collider coll;
private Ray ray;
private float hitDistance = 200f;
void Start()
{
coll = GetComponent<Collider>();
_objectToHit = GameObject.Find("Street");
}
void Update()
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (coll.Raycast(ray, out hit, hitDistance))
{
Debug.Log(hit.point);
}
}
}
我也不确定在哪里添加脚本,是添加到被击中的对象还是添加到相机?
您想使用Camera.WorldToScreenPoint将世界生命值位置转换为屏幕位置。 此外,您的游戏中只需要一个此脚本的实例,否则您将有多个光线投射。在选择放置此脚本的位置之前,您应该考虑这一点。如果没有更多关于它的用途、多少对象等信息,我们无法帮助您做出选择
编辑脚本使用:
有一件事是肯定的:光线投射脚本必须有一个唯一的实例。如果你想通过这个脚本与其他对象交互,你应该在 hit.collider.gameobject 上使用 GameObject.GetComponent 函数来访问将执行你想要的操作的脚本。
例如,如果您的街道上有一个门,单击它会调用门对象上 GateBehaviour 脚本中包含的 toggleOpen() 函数,如下所示:
if (coll.Raycast(ray, out hit, hitDistance))
{
if(hit.collider.tag == "Gate")
{
GateBehaviour gate = hit.collider.gameobject.GetComponent<GateBehaviour>()
if(gate)
gate.toggleOpen();
}
Debug.Log(hit.point);
}
理想情况下,您应该拥有类似 class 的东西,称为 Interractable,它可以为街上所有可交互的对象提供独特的界面。街道本身也可以继承自这个接口。