我对Physics.CheckBox的理解有误吗



基本上在我的地图上,我试图使用Physics.CheckBox检测玩家何时在某些区域,以确定我的敌人将在哪里产卵。我使用层掩码来检测它何时与玩家和Gizmo碰撞,以在编辑器中可视化此框。我遇到的问题是,即使球员不在禁区内,它也会变成真的。我已经验证了其他每一个游戏项目都没有玩家层掩码,当它击中其他东西时会返回true。关键是Physics.CheckSphere工作得很好,除了我的地图是正方形而不是圆形,所以我不能使用check sphere,因为我不能覆盖所有需要覆盖的区域。

两者的代码如下,请注意,这两行都不在我的脚本中,同时我交替使用它们进行测试:

atNeighborhood = Physics.CheckSphere(spawnAreas[0].transform.position, neighborhoodRange, playerLayer); 
atNeighborhood = Physics.CheckBox(spawnAreas[0].transform.position, neighborhoodRange, Quaternion.identity, playerLayer);

为什么CheckBox在与不在层掩码中的项目碰撞时会返回true,但CheckSpere工作得很好,只有在与玩家碰撞时才会返回true?有人知道吗?

如果评论中有任何问题或错误,请告诉我。谢谢

好的。复选框有时会让人感到困惑。我会建议其他的。

你可以使用带有碰撞器的空游戏对象,并将它们放在你想要的地方IsTrigger必须设置为true。把这些想象成";区域";,只要你踏入其中,就会发生一些事情。

您所要做的就是为每个区域设置一个特定标签来激活不同的东西。

注意:播放器不需要刚体,但如果你需要的话,它会减少很多混乱。

如果你的玩家确实有刚体,这里有一个脚本(把这个脚本放在你的玩家身上(:

void OnTriggerEnter(Collider obj)
{
if (obj.gameObject.CompareTag("Zone 1"))
{
SpawnZombies();
}
}

播放器没有刚体:

如果你的玩家没有刚体,你可以在每个人身上放一堆名为";区域活化剂";。此版本的重要说明:

  1. 你的玩家必须有一个对撞机和一个唯一的标签
  2. 在每个分区上添加一个刚体
  3. 确保detectCollisions为false
  4. 请确保useGravity为false
  5. 这个区域探测器应该有它的对撞机作为触发器;(你不想让这东西动!(

您现在可以创建一个在每个区域上运行的脚本:

public string message;
public bool inZone;
void OnTriggerEnter(Collider obj)
{
if (obj.gameObject.CompareTag("player"))
//Or set it to whatever tag the player has
{
inZone = true;
}
}
void OnTriggerExit(Collider obj)
{
if (obj.gameObject.CompareTag("player"))
//Or set it to whatever tag the player has
{
inZone = false;
}
}

然后你必须在玩家的脚本中引用这个

public ZoneDetector[] allZones;
void Update()
{
//.....
foreach (ZoneDetector zone in allZones)
{
if (zone.inZone == true)
{
if (zone.message == "zone 1")
{
DoZone1();
}
if (zone.message == "zone 2")
{
DoZone2();
}
}
}
}

最新更新