【问题标题】:Raycasting only to a particular object仅对特定对象进行光线投射
【发布时间】:2015-08-10 23:52:49
【问题描述】:

我使用以下方法来检测我的头像前面是否有东西:

void Start()
{
    Vector3 fwd = transform.TransformDirection(Vector3.forward);

    if (Physics.Raycast(transform.position, fwd, 10))
        Debug.Log("Something in front");
}

现在,我试图找出只有一个特定对象在前面,例如层次结构中另一个名为Police的头像:

public class CharAnim : MonoBehaviour
{

  police = GameObject.Find("Police");

  void Start()
  {
      Vector3 fwd = transform.TransformDirection(Vector3.forward);

      if (Physics.Raycast(transform.position, fwd, 10))
          Debug.Log("Something in front");
  }

}

但是,从文档中,我看不出是否可以使用这个police 变量通过光线投射、测量到它的距离等来检测它...

我该如何实现?

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    最后一个答案没有考虑到事物实际上会阻止光线投射甚至到达您想要的对象。

    你必须先给你要检测的对象一个自定义的layer

    然后你必须拍摄一个光线投射,它将穿透忽略除所需层之外的所有层,如下所示:

    请注意:此示例假设您使用了自定义层 #9

    float distance = 10;
    int layer = 9;
    int layerMask = 1<<layer;
    
    if (Physics.Raycast(transform.position, fwd, distance, layerMask))
          Debug.Log("Something in front");
    

    除非答案确实解决了问题,否则您真的不应该将答案标记为已接受,因为答案标记为已接受的问题受到的关注要少得多,否则他们可能会为您解决问题。

    【讨论】:

    • 谢谢安德鲁。你确实是对的。在我不小心移除了两个对象之间的一张桌子后,我发现了这一点,阻止了光线投射到达我想要的物品。如果我有任何问题,我会尝试这个并再次发表评论。干杯
    • @maksymiuk:你能解释一下为什么1&lt;&lt;9改变射线只与9碰撞吗?因为当你在 Raycast 中只使用“9”时,第 9 层将被排除,而“1
    • 因为层不是作为整数读取,而是作为二进制读取。所以9 实际上是00001001,它实际上排除了除第 1 层和第 4 层之外的所有内容,因为从右到左启用了第一个和第四个标志。 int i = 1&lt;&lt;9; 只是一种以二进制形式显示第 9 个标志的人类可读方式,尽管它也可以写为 int i = 256;int i = 0x100;
    【解决方案2】:
    RaycastHit hit;
    
    if (Physics.Raycast(transform.position, fwd, hit,10) && hit.collider.gameObject.tag == "police" )
    {
    // do stuff here
    }
    

    请注意,您需要从编辑器中设置游戏对象的标签。你也可以使用 gameObject.name 。

    【讨论】:

    • 非常感谢 Uri。我将以下内容放在我的Start 函数中,但它不会检测到任何内容:RaycastHit hit; Vector3 fwd = transform.TransformDirection(Vector3.forward); if (Physics.Raycast(transform.position, fwd, out hit, 10) &amp;&amp; (hit.collider.gameObject.name == "Police")) {Debug.Log("yey!");} 然后将其全部放在Update 中,看看是否启动和唤醒可能是问题,但仍然不会...我的Police头像是在运行时激活的,所以这个游戏对象肯定存在...
    • 头像有碰撞器吗?另一种可能是光线投射的方向是错误的。
    • 是的,化身有一个胶囊对撞机。我怎样才能覆盖一个范围,而不仅仅是一个向前的方向?这可能吗?
    • 阅读此链接 :docs.unity3d.com/ScriptReference/Physics.html 可能会有所帮助,这些都是物理类中的所有演员类型。另一件事可能是我们正在做的 Raycast 的距离,也许 10 还不够?
    • 我会考虑所有这些。非常感谢 Uri。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2019-05-09
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多