c# - 如何使用 Vector3.MoveTowards Unity 制作对象曲线?
问题描述
我目前正在尝试使对象曲线稍微弯曲,而不仅仅是直接移动到目的地,我将如何做到这一点Vector3.MoveTowards
?
现在我只有这个物体向另一个叫做“gotocoin”的物体移动;它只是直接移动,感谢您的帮助!
void Update()
{
if (going == true)
{
transform.position = Vector3.MoveTowards(transform.position, gotocoin.transform.position, 3 * Time.deltaTime);
}
}
解决方案
正如评论中提到的,您可以使用贝塞尔曲线来解决您的问题。我写了一个简单的代码来演示。它首先计算初始位置和目标位置之间的所有点,然后将脚本附加到的对象移动到每个点。更改 control1 和 control2 将改变曲线的形状。Gizmos 方法用于调试,可以删除。
[SerializeField] private Transform target;//the destination
[SerializeField] private Vector3 offset = new Vector3(4.58f, 4.52f, 0);//determines arch of the curve
private const float DistanceToTarget = 1;
private Vector3 _initialPosition;
private List<Vector3> _allPositions;
private int _counter;
private void Start()
{
_initialPosition = transform.position;
_allPositions = new List<Vector3>(100);
for (var i = 0; i < 100; i++)
{
var newPosition = CubicCurve(_initialPosition, _initialPosition + offset, _initialPosition + offset,
target.position, (float)i / 100);
_allPositions.Add(newPosition);
}
}
private void Update()
{
if (_counter < _allPositions.Count)
{
transform.position = Vector3.MoveTowards(transform.position, _allPositions[_counter], Time.deltaTime);
if (Vector3.Distance(transform.position, _allPositions[_counter]) < DistanceToTarget) _counter++;
}
}
private Vector3 CubicCurve(Vector3 start, Vector3 control1, Vector3 control2, Vector3 end, float t)
{
return (((-start + 3 * (control1 - control2) + end) * t + (3 * (start + control2) - 6 * control1)) * t +
3 * (control1 - start)) * t + start;
}
//since _initialPosition is set on start, the drawn curve is from (0,0,0) if the code is not executed
private void OnDrawGizmos()
{
for (var i = 0; i < 100; i++)
{
var newPosition = CubicCurve(_initialPosition, _initialPosition + offset, _initialPosition + offset,
target.position, (float)i / 100);
Gizmos.DrawSphere(newPosition, 1f);
}
}
推荐阅读
- cuda - 在 Ubuntu 18.04 下无法将 cuda 示例与 clang++-9 链接
- python - 在熊猫中进行逆多热编码的最快方法是什么?
- python-3.x - 每次会话更改名称的 Selenium Select 输入框
- python - 我正在尝试访问“Energy Indicator.xls”
- ios - SwiftUI - 将 Firbase 数据库输出分配给数据模型
- java - @Inject on field 在 Guice 中给出 NullPointerException
- python - 当我在 exec() 函数中只插入字符串时,为什么突然出现类型错误?
- dynamics-crm - CRM365 & KingswaySoft - 如果 IsNew 为假(更新实体的情况),如何获取插入记录的 entityid?
- python - 使用 location_once_scrolled_into_view 并希望居中
- java - Struts 2(在 jsp 的迭代器之外使用 Select 会导致逗号附加在选择值上而不是重置它)