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

Unity开发问题:无法在玩家处克隆物体,地板生成偏离玩家位置

问题修复方案

核心问题分析

  1. 地板远离玩家:生成位置用了xi * -times和zi * times,且xi/zi是基于玩家坐标向上取整后的值,直接导致区块位置和玩家实际位置脱节、偏离。
  2. 无法在玩家位置克隆+重复生成:id列表从未添加过已生成的区块ID,每次Update都会重复生成;transform.Find("floor")的判断逻辑完全错误,浮点数直接比较相等存在精度问题,且&应该用逻辑与&&。
  3. 区块ID精度问题:用float存区块ID容易出现精度误差,应该用整数坐标标识区块。

修正后的代码

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

public class Generate : MonoBehaviour
{
    public GameObject player;
    public GameObject floorPrefab; // 简化为单个预制体,无需数组
    private HashSet<Vector2Int> generatedChunks = new HashSet<Vector2Int>(); // 用HashSet存区块坐标,查询更高效
    public int chunkRange = 5; // 围绕玩家生成的区块范围
    public float chunkSize = 6f; // 每个区块的尺寸
    public float yOffset = 1f; // Y轴偏移量

    void Update()
    {
        // 计算玩家所在的区块坐标(将玩家坐标转换为区块网格的整数坐标)
        Vector2Int playerChunk = new Vector2Int(
            Mathf.RoundToInt(player.transform.position.x / chunkSize),
            Mathf.RoundToInt(player.transform.position.z / chunkSize)
        );

        // 遍历玩家周围的区块
        for (int x = playerChunk.x - chunkRange; x <= playerChunk.x + chunkRange; x++)
        {
            for (int z = playerChunk.y - chunkRange; z <= playerChunk.y + chunkRange; z++)
            {
                Vector2Int currentChunk = new Vector2Int(x, z);
                // 该区块未生成过则执行生成
                if (!generatedChunks.Contains(currentChunk))
                {
                    // 计算区块生成位置:区块坐标 × 区块尺寸,Y轴贴合玩家位置下方
                    Vector3 spawnPos = new Vector3(
                        x * chunkSize,
                        Mathf.Floor(player.transform.position.y) - yOffset,
                        z * chunkSize
                    );
                    // 生成区块并设置为当前物体的子物体,方便管理
                    GameObject newFloor = Instantiate(floorPrefab, spawnPos, floorPrefab.transform.rotation);
                    newFloor.transform.parent = transform;
                    // 标记该区块已生成
                    generatedChunks.Add(currentChunk);
                }
            }
        }
    }
}

修改说明

  • 用Vector2Int和HashSet管理区块ID,避免浮点数精度问题,查询效率更高。
  • 先计算玩家所在的区块坐标,再围绕该坐标生成周围区块,确保区块始终围绕玩家生成。
  • 生成位置直接用区块坐标乘以区块尺寸,保证区块与玩家位置对齐。
  • 移除错误的transform.Find判断,改用HashSet记录已生成区块,彻底避免重复生成。
  • 简化变量命名,提升代码可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 07:24:19