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

Unity实现玩家靠近时水体自生成相邻克隆的代码问题求助

问题根源
  • 错误的Transform引用赋值
    你写的Transform newTrans = trans;是引用传递,并没有创建新的Transform实例,后续修改newTrans.position等价于直接修改你绑定的trans(原水体对象)的位置,这是原水体无故远离玩家的核心原因。
  • Instantiate重载使用错误
    Instantiate(gameObject, newTrans)这个重载的作用是生成克隆体并将父对象设为newTrans,克隆体位置采用相对于父对象的本地坐标,并非你预期的将克隆体放在newTrans的世界坐标位置。
  • 位置计算逻辑错误
    transform.position - new Vector3(-15.72f, 0f, 0f)等价于transform.position + new Vector3(15.72f, 0f, 0f),负负得正导致你预期的左移生成变成了右移,位置完全不符合需求。
修复代码

你不需要额外声明trans变量,直接计算生成位置后传入Instantiate即可,修复后的代码如下:

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

public class Paralax : MonoBehaviour
{
    // 玩家对象引用
    public Transform player;
    // 触发克隆的玩家距离阈值
    public float distanceToSpawn = 30f;
    // 水体宽度,往左侧克隆直接填正数即可,方便后续调整
    public float waterWidth = 15.72f;

    bool alreadySpawned;

    private void Update()
    {
        if(!alreadySpawned)
        {
            float dst = Mathf.Abs(player.position.x - transform.position.x);
            if (dst < distanceToSpawn)
            {
                // 计算克隆体目标位置:X轴左移一个水体宽度,Y、Z轴和原水体一致
                Vector3 spawnPosition = new Vector3(transform.position.x - waterWidth, transform.position.y, transform.position.z);
                // 生成克隆体,使用计算好的世界坐标,旋转和原水体保持一致
                Instantiate(gameObject, spawnPosition, transform.rotation);
                alreadySpawned = true;
            }
        }
    }
}
可选优化

如果不需要克隆出来的水体继续触发克隆逻辑,可以在生成时直接禁用克隆体的脚本,修改Instantiate行即可:

Instantiate(gameObject, spawnPosition, transform.rotation).GetComponent<Paralax>().enabled = false;

如果需要实现无限延伸的水体效果,可以取消alreadySpawned标记,改为根据玩家位置动态判断生成/销毁远处的水体即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:45:04