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
相关产品推荐
相关产品推荐

