You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中如何避免生成的摆荡点重复出现在同一位置?

解决2D钩索游戏摆荡点重叠问题的方案

核心思路:跟踪已生成位置,确保新点间距达标

你之前的问题在于生成时未校验新点与已有位置的距离,直接随机生成必然会出现重叠。以下是几种可行的修改方案:

方案1:基础位置校验法(适合小数量点)

直接记录所有已生成的点坐标,每次生成新点时,检查它与所有已有点的距离是否大于设定的最小间距(比如摆荡点碰撞体半径的2倍),若不符合则重新生成,直到找到合法位置。

修改后的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MapGenerator : MonoBehaviour
{
    public Transform Endpositin;
    public int NumOfSwingablePoints;
    public GameObject SwingablePoint;
    public int MinX, MaxX;
    public int MinY, MaxY;
    // 可在Inspector面板调整的最小间距参数
    public float MinDistanceBetweenPoints = 2f;

    private List<Vector2> generatedPoints = new List<Vector2>();

    void Start()
    {
        for (int i = 0; i < NumOfSwingablePoints; i++)
        {
            Vector2 newPoint;
            bool isPointValid;
            do
            {
                // 生成随机坐标
                int xPos = Random.Range(MinX, MaxX);
                int yPos = Random.Range(MinY, MaxY);
                newPoint = new Vector2(xPos, yPos);
                // 校验新点是否与已有位置间距过小
                isPointValid = true;
                foreach (var point in generatedPoints)
                {
                    if (Vector2.Distance(newPoint, point) < MinDistanceBetweenPoints)
                    {
                        isPointValid = false;
                        break;
                    }
                }
            } while (!isPointValid);

            // 记录合法位置并生成摆荡点
            generatedPoints.Add(newPoint);
            Instantiate(SwingablePoint, newPoint, Quaternion.identity);
        }
    }
}

关键修正说明:

  • 修正了变量名拼写错误(NumOfSwwingablePoints→NumOfSwingablePoints,SwinggablePoint→SwingablePoint)
  • 循环条件从<=改为<,避免多生成一个点
  • 新增MinDistanceBetweenPoints参数,可根据摆荡点实际大小灵活调整

方案2:空间划分优化(适合大量点)

如果需要生成数百上千个点,方案1的遍历校验会变慢。可采用空间划分思路:将生成区域划分为若干格子,每个格子仅允许存在一个点,生成时先寻找空格子,再在格子内随机生成坐标,能大幅减少校验次数。

你之前方法无效的原因

  • 增大数值:仅扩大了生成范围,但无法避免随机到重复坐标,不能从根源解决重叠问题
  • 碰撞体检测:Instantiate后碰撞体需要一帧时间激活,在Start中直接检测会失效;且生成后再销毁重叠点,存在性能浪费,不如提前校验位置高效
  • Update生成:未添加终止条件,导致每帧持续生成,同时仍未解决重叠问题

内容的提问来源于stack exchange,提问作者GreenDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:20:31