【问题标题】:Unity3d Raycast on mesh position网格位置上的 Unity3d Raycast
【发布时间】:2016-01-20 01:41:49
【问题描述】:

我想用光线投射击中网格并获取击中位置的鼠标/屏幕坐标。

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);
        }
    }
}

我也不确定将脚本添加到被击中的对象还是相机的位置?

【问题讨论】:

  • 我不知道你从哪里得到那个脚本,但它看起来不错,你为什么不尝试将它添加到对象或相机中? (我知道你应该将它添加到哪一个,但我认为你应该尝试自己弄清楚,因为你已经有了脚本)
  • 我投票决定将此问题作为题外话结束,因为这需要在主题中提供极其基本的教程(例如“我不知道将脚本放在哪里”),而不是而不是一个实际的问答。除了长篇教程之外,这里没有“答案”。
  • 您可能正在寻找RAYCASTALL。您可以很容易地找到大量关于此的 QA 和教程。
  • 嗨@silentace,你在吗?

标签: c# unity3d coordinates mesh


【解决方案1】:

您想使用Camera.WorldToScreenPoint 将世界命中点位置转换为屏幕位置。 此外,您的游戏中只需要此脚本的一个实例,否则您将有多个射线投射。在选择放置此脚本的位置之前,您应该考虑这一点。如果没有关于它的用途、对象数量等更多信息,我们无法帮助您做出此选择。

编辑脚本使用:

有一点是肯定的:光线投射脚本必须有一个唯一的实例。如果您想通过此脚本与其他对象进行交互,您应该使用 hit.collider.gameobject 上的GameObject.GetComponent 函数来访问将执行您想要的操作的脚本。

例如,如果您的街道上有一个门,单击它将调用 Gate 对象上 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);
}

理想情况下,您应该拥有一个名为 Interractable 的类,它可以为街道上的所有可交互对象提供一个独特的接口。街道本身也可以从这个接口继承。

【讨论】:

  • 我有多个对象要使用光线投射命中,并获取它们的命中位置。仅将脚本附加到相机将是最有效的。但我还需要突出显示这些对象,所以我不太确定在哪里添加脚本。如果我有 30 个游戏对象会发生什么。我是否将脚本单独添加到所有脚本?
  • 你能描述一下你想做什么吗?如果你想在命中时显示一个特效,你只能在相机上拥有一个脚本。如果您想对被击中的对象执行某些操作(例如对其施加力),则需要编写另一个脚本并将其附加到每个对象。
  • 我有一个街道网格,应该是一个生成点。只要在街道上,点击位置并不重要。街道上还有多个对象,如立方体、球体等。最重要的是街道上被点击的位置,当我将鼠标悬停在其他对象上时,相同的脚本也应该突出显示其他对象。我计划稍后添加与对象的其他交互,这仍然是相同的东西获得他们的命中位置,只是在那个对象上。
  • 快速打字并查看脚本。我的错。当您在街道上单击生成点时,坐标很重要。
  • 嗨@stud 虽然你的回答很好地解释了一个概念,但你真的应该投票结束这个问题。该问题现在包括至少 7 个完全独立的问题(所有这些问题都非常容易搜索)。 OP 这个网站欢迎您提出问题,但它们必须是带有一个答案的实际问题。你可以找到这类事情的很棒的初学者教程
猜你喜欢
  • 2019-08-23
  • 1970-01-01
  • 2013-05-21
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-29
相关资源
最近更新 更多