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
有几种方法可以解决您的问题.
Raycast()
如果射线在其内部开始,将忽略对撞机.让我们说你的玩家是位置(0,0,0)的立方体,比例为(1,1,1).来自(0,0,0)方向(1,0,0)的光线,即沿x轴的光线,不会击中播放器.如果将光线的起始位置移动到(-2,0,0),光线将会击中播放器.
如果您的播放器由多个对撞机组成并且您想要将光线投射到不同的方向,这可能会变得复杂.你可以在脚下射击自己(头部开始射线):)
您可以将游戏对象分配给不同的图层.然后,您可以指定图层蒙版并告知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)
通过使用,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)
小智 8
我最近有这个问题.弄清楚这是一个痛苦,但它是一个简单的解决方案.
我发现如果你去编辑 - >项目设置 - > Physics2d并取消选中"Raycasts Start In Colliders"框,它就解决了这个问题.
这使得你不必处理图层(我发现图层是一种非常不切实际的选择性光线投射方式).它只是忽略了投射光线的游戏对象上的对撞机,所以你可以有多个玩家/敌人的预制件投射光线并相互击打,但不是自己.
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
实际上被命名为“玩家”。