游戏开发技术问题:如何引用GameObject的左侧与右侧?
实现物体在目标物体上来回移动的方案
要获取目标物体的左右边缘位置,核心是基于目标物体的Transform组件结合尺寸信息计算,下面是具体思路和实现代码:
一、计算目标物体的左右边界
有两种常用方式获取左右位置:
基于Collider组件(推荐):如果目标物体挂载了
BoxCollider(3D)或BoxCollider2D(2D),可以直接通过其边界数据计算:// 3D场景示例 Bounds targetBounds = targetObject.GetComponent<BoxCollider>().bounds; float leftEdgeX = targetBounds.min.x; // 左侧边缘X坐标 float rightEdgeX = targetBounds.max.x; // 右侧边缘X坐标2D场景只需把
BoxCollider替换为BoxCollider2D即可,边界计算逻辑完全一致。基于Renderer组件或自定义偏移:如果目标物体没有Collider,可通过
Renderer的边界获取尺寸,或手动设置偏移量:// 用Renderer获取半宽,计算左右位置 float halfWidth = targetObject.GetComponent<Renderer>().bounds.extents.x; float leftEdgeX = targetObject.transform.position.x - halfWidth; float rightEdgeX = targetObject.transform.position.x + halfWidth;
二、完整移动实现代码(C#)
下面是基于MoveTowards的来回移动脚本,直接挂载到需要移动的物体上即可:
using UnityEngine; public class BackAndForthMovement : MonoBehaviour { public GameObject targetObject; // 拖拽绑定目标物体 public float moveSpeed = 3f; private Vector3 _currentTargetPos; private float _leftEdgeX; private float _rightEdgeX; void Start() { // 初始化目标物体的左右边界(这里用3D BoxCollider为例) Bounds targetBounds = targetObject.GetComponent<BoxCollider>().bounds; _leftEdgeX = targetBounds.min.x; _rightEdgeX = targetBounds.max.x; // 初始移动目标设为右侧边缘 _currentTargetPos = new Vector3(_rightEdgeX, transform.position.y, transform.position.z); } void Update() { // 向当前目标位置移动 transform.position = Vector3.MoveTowards(transform.position, _currentTargetPos, moveSpeed * Time.deltaTime); // 到达目标后切换方向(用小阈值避免精度问题导致频繁切换) if (Vector3.Distance(transform.position, _currentTargetPos) < 0.1f) { _currentTargetPos = _currentTargetPos.x == _rightEdgeX ? new Vector3(_leftEdgeX, transform.position.y, transform.position.z) : new Vector3(_rightEdgeX, transform.position.y, transform.position.z); } } }
注意事项
- 2D场景适配:将代码中的
BoxCollider替换为BoxCollider2D,Vector3替换为Vector2,transform.position对应调整为二维坐标。 - 阈值调整:
0.1f的距离阈值可根据物体大小和移动速度灵活修改,避免因浮点精度问题导致的异常切换。
内容的提问来源于stack exchange,提问作者RunningPath
相关产品推荐
相关产品推荐

