C# 但是不要理你自己
我想发送一个光线投射,但不能让它与我的播放器冲突 我该怎么做C# 但是不要理你自己,c#,unity3d,C#,Unity3d,我想发送一个光线投射,但不能让它与我的播放器冲突 我该怎么做 using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { void Update() { Vector3 fwd = transform.TransformDirection(Vector3.forward); if (Physics.Raycast(transform.po
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
}
}
从Unity示例中获取此信息。() 然后你需要做的就是给你的玩家一个“玩家”标签
希望这对您有所帮助您可以使用以下方式发射光线投射:
if(Physics.Raycast(ray, out hit, distance))
if(!hit.transform.name.equals("Player"))
// Do your stuff.
确保玩家
GameObject
实际上是名为Player的玩家 有几种方法可以解决您的问题
1) 将你的光线投射到播放器内部
如果光线从碰撞器内部开始,将忽略碰撞器。假设您的玩家是一个位于(0,0,0)位置的立方体,比例为(1,1,1)。来自(0,0,0)且方向为(1,0,0)的光线(即沿x轴)不会击中玩家。如果将射线的起始位置移动到(-2,0,0),射线将击中玩家
如果您的播放器由多个对撞机组成,并且希望将光线投射到不同的方向,则这可能会变得复杂。你可以直接射中自己的脚(光线从头部开始):)
2) 使用图层
您可以将游戏对象指定给不同的层。然后,您可以指定一个图层蒙版,并告知要点击的图层
可以在中找到创建和指定图层的分步教程。如果按照步骤将第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
}
我最近有这个问题。这是一个痛苦的想法,但这是一个简单的解决办法 我发现,如果您转到编辑->项目设置->Physics2d并取消选中“光线投射在碰撞器中开始”的框,则可以解决此问题。
这使得您不必处理层(我发现层是一种非常不切实际的选择性光线投射方法)。它只是忽略了投射光线的游戏对象上的碰撞器,因此你可以让多个玩家/敌人预设投射光线并相互撞击,但不是他们自己。因为某种原因,你可以用比你评论的代表更低的代表来“回答”,我将在这里发布这篇文章,以帮助其他人,而不是像@Stefan Hoffmann给出的答案中那样的评论 这是他选项列表中#1的扩展。。。在玩家对撞机中从中投射光线 关闭时,您将遇到层不起作用的情况,例如,您的玩家可以“控制”各种对象和不同的时间,您只想让您的演员忽略当前控制的对象,例如,层交换有问题,您需要您的光线仅在某些时间忽略某些对象 在这种情况下,您可以简单地像平常一样投射光线,然后测试它是否击中“玩家”对象。。。测试方法取决于您的游戏,可以测试刚体,也可以测试碰撞器上的其他参考,以确定它是否属于玩家对象 如果有,只需将您的ray.orgin更新为ray.point+[您的投射方向]*一些小偏移 您在这里所做的是从玩家的碰撞器中沿着前一条光线所走的相同路径投射第二条光线,因此此光线投射将忽略此碰撞器 如果您的玩家有多个/复合碰撞器,则可以多次执行此操作。请记住,这会增加总施法的成本,因为你基本上是逐点施法,直到你越过玩家对象。然而,这种方法确实解决了无法依赖于层的问题,而需要通过一些碰撞器投射光线 有用提示:这也可以作为一种较慢但“排序”的方式,沿一条光线获取多个碰撞器,例如,在每个碰撞点,只需向前推一条新光线,使其足以进入先前找到的碰撞器内。
同样缓慢,请记住这一点,但它工作得很好,如果在简单的结构上节省使用,它不会比重建游戏的物理结构来适应有时需要通过一些对撞机投射的需求花费更多。第3号是一个糟糕的主意。不要增加数组的额外复杂性,这是不必要的。@FunctionR好吧,如果你想要所有与光线相交的碰撞器,你没有选择的余地。如果您不想使用层,而解决方案1不起作用,那么解决方案3是一种有效的方法。当然不那么复杂,但它解决了另一个问题。嗨,这个答案应该是公认的。方法2中有一个小错误。你得到了
layerMask=~layerMask代码>错误。这实际上排除了第9层,没关系。问题的标题是排除图层+你的答案不正确。你的光线投射仍然会击中玩家,因此不会击中玩家身后的任何物体。很有趣,但问题是“忽略你自己”。因此,这是正确的。我想我们可以讨论语义,但它似乎有助于OP。它还提到“不要让它与我的播放器冲突”。你问我为什么被否决,我给了你一个。虽然我自己没有投你反对票,但我想其他人也同意我的观点。我想这个设置可能已经改为“在碰撞器中开始查询”(Unity 5.5.1)。谢谢。这确实使解决方案变得非常复杂。对于最基本的用例,这应该完全做到。
// 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
}
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"
}
}