gpt4 book ai didi

c# - Raycast 但忽略它被调用的游戏对象的对撞机

转载 作者:太空狗 更新时间:2023-10-29 20:44:00 30 4
gpt4 key购买 nike

我想发送光线转换但不让它与我的播放器发生碰撞。

我该怎么做?

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

最佳答案

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

1) 将你的光线转换到播放器中

Raycast()如果射线从内部开始,将忽略对撞机。假设您的玩家是一个位置为 (0,0,0) 且比例为 (1,1,1) 的立方体。来自 (0,0,0) 且方向为 (1,0,0) 的射线,即沿 x 轴的射线,不会击中玩家。如果将射线的起始位置移动到 (-2,0,0),则射线将击中玩家。

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

2) 使用图层

您可以将游戏对象分配到不同的层。然后你可以指定一个图层蒙版并告诉Raycast()您想要击中的图层。

可以在 manual 中找到创建和分配图层的分步教程。 .如果您按照这些步骤将第 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
}

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"
}
}

关于c# - Raycast 但忽略它被调用的游戏对象的对撞机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24563085/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com