Unity3D中如何通过C#脚本实现物体从当前位置沿指定半径做圆弧/圆周运动
Unity C# 圆周运动实现方案
原有代码问题说明
- 默认以世界坐标原点(0,0,0)为圆心,运行后物体会直接跳转至原点附近的圆周点
- 未计算初始角度,默认从角度0(对应圆周右侧点)开始运动,和物体初始位置不匹配,无法自定义起始角度
完整实现代码
将以下脚本挂载到需要运动的物体上即可:
using UnityEngine; public class CircularMotion : MonoBehaviour { [Header("运动参数配置")] [Tooltip("圆周运动半径")] public float radius = 2f; [Tooltip("运动角速度,单位弧度/秒,负值可反向运动")] public float speed = 1f; [Tooltip("圆周运动的圆心坐标,不填则默认以物体初始位置左侧半径距离处为圆心")] public Vector3 customCenter; [Tooltip("是否在XZ平面运动,关闭则在XY平面运动")] public bool moveOnXZPlane = true; private float _timeCounter; private float _startAngle; private Vector3 _circularCenter; void Start() { // 初始化圆心 _circularCenter = customCenter == Vector3.zero ? transform.position + new Vector3(-radius, 0, 0) : customCenter; // 计算物体初始位置相对于圆心的起始角度,保证从当前位置开始运动 Vector3 initOffset = transform.position - _circularCenter; _startAngle = moveOnXZPlane ? Mathf.Atan2(initOffset.z, initOffset.x) : Mathf.Atan2(initOffset.y, initOffset.x); _timeCounter = 0; } void Update() { _timeCounter += Time.deltaTime * speed; float currentAngle = _startAngle + _timeCounter; float axisX = Mathf.Cos(currentAngle) * radius; float axisSecond = Mathf.Sin(currentAngle) * radius; if (moveOnXZPlane) { transform.position = _circularCenter + new Vector3(axisX, transform.position.y, axisSecond); } else { transform.position = _circularCenter + new Vector3(axisX, axisSecond, transform.position.z); } } }
使用说明
- 半径可通过
radius参数直接调整,数值越大圆周运动的范围越大 - 如需自定义圆心,直接在Inspector面板修改
customCenter参数即可,脚本会自动适配起始角度,物体不会出现跳转 - 调整
speed参数可修改运动速度,设置为负值可以实现反向圆周运动
内容的提问来源于stack exchange,提问作者Arthas Cheng
相关产品推荐
相关产品推荐

