Raycast却忽视了自己

use*_*475 6 c# unity-game-engine

我想发送一个光线投射,但不要让它与我的播放器发生碰撞.

我怎样才能做到这一点?

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
    void Update() {
        Vector3 fwd = transform.TransformDirection(Vector3.forward);
        if (Physics.Raycast(transform.position, fwd, 10))
            //hit something            
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ann 28

有几种方法可以解决您的问题.

1)将你的光线投射到播放器内

Raycast()如果射线在其内部开始,将忽略对撞机.让我们说你的玩家是位置(0,0,0)的立方体,比例为(1,1,1).来自(0,0,0)方向(1,0,0)的光线,即沿x轴的光线,不会击中播放器.如果将光线的起始位置移动到(-2,0,0),光线将会击中播放器.

如果您的播放器由多个对撞机组成并且您想要将光线投射到不同的方向,这可能会变得复杂.你可以在脚下射击自己(头部开始射线):)

2)使用图层

您可以将游戏对象分配给不同的图层.然后,您可以指定图层蒙版并告知Raycast()要击中的图层.

可以在手册中找到创建和分配图层的分步教程.如果您按照步骤操作并将第8层设置为播放器图层,则以下代码将忽略播放器图层中的所有对象.

// Bit shift the index of the layer (8) to get a bit mask
int layerMask = 1 << 8;

// This would cast rays only against colliders in layer 8, so we just inverse the mask.
layerMask = ~layerMask;

if (Physics.Raycast(transform.position, fwd, 10, layerMask)) {
    // hit something not in the player layer
}
Run Code Online (Sandbox Code Playgroud)

3)获取与射线相交的所有碰撞器

通过使用,RaycastAll()您可以获得与光线相交的所有碰撞器的数组.然后你可以理清你不想要的那些.

RaycastHit[] allHits;
allHits = Physics.RaycastAll(transform.position, fwd, 10);
foreach (var hit in allHits)
{
    // now filter by tag or name
    if (!hit.transform.tag.equals("Player")) {
        // yeah, we didn't hit something tagged as "Player"
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @FunctionR嗯,如果你想要所有与光线相交的碰撞器你没有选择.如果您不想使用图层并且解决方案#1不起作用,那么解决方案#3是一种有效的方法.当然[你的解决方案](http://stackoverflow.com/a/24563965/3517635)不太复杂,但它解决了另一个问题 (4认同)

小智 8

我最近有这个问题.弄清楚这是一个痛苦,但它是一个简单的解决方案.

我发现如果你去编辑 - >项目设置 - > Physics2d并取消选中"Raycasts Start In Colliders"框,它就解决了这个问题.

这使得你不必处理图层(我发现图层是一种非常不切实际的选择性光线投射方式).它只是忽略了投射光线的游戏对象上的对撞机,所以你可以有多个玩家/敌人的预制件投射光线并相互击打,但不是自己.

  • 我认为此设置可能已更改为"在碰撞器中查询开始"(在Unity 5.5.1中). (3认同)

Fun*_*onR -9

您可以使用以下方式发射光线投射:

 if(Physics.Raycast(ray, out hit, distance))
    if(!hit.transform.name.equals("Player"))
       // Do your stuff.
Run Code Online (Sandbox Code Playgroud)

确保该玩家GameObject实际上被命名为“玩家”。

  • 你的答案不正确。您的光线投射仍会击中玩家,因此不会击中玩家后面的任何物体。 (7认同)
  • 它也指“不要让它与我的玩家发生碰撞”。你问了为什么你被否决的原因,我给了你一个。虽然我自己并没有对你投反对票,但我想其他人也同意我的观点。 (2认同)