基本上在我的地图上,我试图使用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();
}
}
播放器没有刚体:
如果你的玩家没有刚体,你可以在每个人身上放一堆名为";区域活化剂";。此版本的重要说明:
- 你的玩家必须有一个对撞机和一个唯一的标签
- 在每个分区上添加一个刚体
- 确保detectCollisions为false
- 请确保useGravity为false
- 这个区域探测器应该有它的对撞机作为触发器;(你不想让这东西动!(
您现在可以创建一个在每个区域上运行的脚本:
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();
}
}
}
}