gpt4 book ai didi

c# - Unity - 连接水管的游戏。检查管道对象是否连接到中央源的问题

转载 作者:行者123 更新时间:2023-11-30 17:27:21 27 4
gpt4 key购买 nike

我正在尝试制作一款益智游戏,向玩家展示带有一个水源的管道网格。玩家必须旋转管道才能将它们全部连接起来,当然还要连接到水源。

我遇到的问题是:

第一步:

enter image description here

第 2 步:

enter image description here

第 3 步:

enter image description here

如图所示,当我旋转连接到一组其他管道的管道时,剩余组中与水的连接没有断开,它只在一个相邻的管道中起作用。

发生这种情况是因为我在管道的每个导出使用一组碰撞器进行连接,如下图所示。

碰撞器 - 场景:

enter image description here

碰撞器 - 层次结构:

enter image description here

如果碰撞对象连接到水(通过 bool 值),它将碰撞对象添加到列表中。如果列表大于 0,则激活蓝色 Sprite 。如果列表为空,则停用蓝色 Sprite 。如下面的代码示例所示。

检查对象是否连接到水的触发器:

private void OnTriggerEnter2D(Collider2D other) {
if (other.GetComponent<FlipPipes2>() != null) {
isFlowingWater = other.GetComponent<FlipPipes2>().flowingWater;
}
if (other.CompareTag("WaterPipe")) {
if (other.name == "Filled_Cross" || isFlowingWater) {
myFlipPipes.flowingWater = true;
}
TestingScoreStatic.connectedPipes++;
}
}

private void OnTriggerStay2D(Collider2D other) {
if (!inList) {
myFlipPipes.collidedObjectsList.Add(other.gameObject);
inList = true;
}
if (other.name == "Filled_Cross" || isFlowingWater) {
myFlipPipes.flowingWater = true;
}
}

private void OnTriggerExit2D(Collider2D other) {
if (other.CompareTag("WaterPipe")) {
myFlipPipes.collidedObjectsList.Remove(other.gameObject);
myFlipPipes.flowingWater = false;
isConnectedToWater = false;
TestingScoreStatic.connectedPipes--;
inList = false;
}
}

Sprite 实际变化的代码示例:

private void Update() {
if (collidedObjectsList.Count > 0) {
filledPipe.SetActive(true);
} else {
filledPipe.SetActive(false);
}
}

即使连接到水源的瓦片失去连接,其他瓦片也不会,因为它们仍然连接到水瓦片。

如何检查是否存在通往水源的有效路径?或者任何其他方式来做我需要的?

以下是一些可能有帮助的其他代码示例:

创建图板的方法:

private void SetUp() {
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
Vector2 tempPosition = new Vector2(i, j);
int tempIndex = levelManager.levelOne[pipeIndex];
GameObject pipe = Instantiate(pipes[tempIndex], tempPosition, Quaternion.identity);
pipe.transform.parent = transform;
allPipes[i, j] = pipe;
if (!pipe.CompareTag("WaterPipe")) {
shuffleSpawnedPipes.pipes.Add(pipe);
}
pipeIndex++;
}
}
shuffleSpawnedPipes.ShufflePipes();
}

(糟糕)尝试用双 for 循环检查每个管道:

void IsConnectedToWater() {
if (column > 0 && column < board.width - 1) {
GameObject leftPipe1 = board.allPipes[column - 1, row];
GameObject rightPipe1 = board.allPipes[column + 1, row];
if (leftPipe1.tag == this.gameObject.tag && rightPipe1.tag == this.gameObject.tag) {
leftPipe1.GetComponent<Pipe>().connectedToWater = true;
rightPipe1.GetComponent<Pipe>().connectedToWater = true;
connectedToWater = true;
}
}
}

当然这是行不通的,因为它没有检查当前对象是否发生碰撞。即使进行了碰撞检查,结果也是一样的。我正在循环进行许多不同的尝试,结果都是一样的。

最佳答案

您需要的是寻路算法。

创建一个递归函数来检查您的水源路径。不要检查每个元素是否连接到水,而是检查您的水源对象是否在该已检查管道的连接对象列表中。如果它没有将该管道对象保存到 checkedObjects 列表中并转到下一个连接的对象,请重复直到检查了所有相互连接的管道对象。如果连接对象列表中没有对象有您的水源,则意味着 checkedObjects 路径中的所有对象都未连接到水,您可以禁用所有对象的水 Sprite 。

关于c# - Unity - 连接水管的游戏。检查管道对象是否连接到中央源的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55222754/

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