首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将物体移向目标,但在正弦波中

将物体移向目标,但在正弦波中
EN

Stack Overflow用户
提问于 2022-05-12 14:12:19
回答 2查看 236关注 0票数 1

unity2d,我指的是宇宙飞船。所以我有我的飞船,我想移动到一个特定的目标,但我希望它在一个罪恶的浪潮中,所以它上下跳,我看了很多youtube教程,但我仍然不知道如何将它集成到我的代码中。

代码语言:javascript
复制
transform.position = Vector2.MoveTowards(transform.position, shipTarget, Time.deltaTime * shipSpeed) ;
EN

回答 2

Stack Overflow用户

发布于 2022-05-12 15:10:21

假设飞船正向transform.position - shipTarget方向移动,且在垂直于sine波的直线运动方向上振荡,则飞船的position必须在两个方向上更新。

让我们给出宇宙飞船的速度的一些变量,它转化成一条直线,sine波的振幅频率,最后是飞船的方向。

代码语言:javascript
复制
private float speed = 1f;
private float amplitude = 1f;
private float frequency = 1f;
private Vector2 straightDirection = (transform.position - shipTarget).normalized; // magnitude = 1
private Vector2 perpendicularDirection = GetPerpendicularDirection(straightDirection);

代码语言:javascript
复制
Vector2 GetPerpendicularDirection(Vector2 direction) {
    return new Vector2(-direction.y, direction.x);
}

玩家向目标移动:

代码语言:javascript
复制
Vector2 horizontal = straightDirection * speed * Time.deltaTime;

播放器垂直方向运动

代码语言:javascript
复制
Vector2 vertical = perpendicularDirection * Mathf.Sin(frequency * Time.time) * amplitude;

Mathf.Sin(float)对其做了一点解释,以弧度表示浮点值(在本例中为自脚本的start,即Time.time)以来所用的总时间。将其乘以频率,会影响sine波在两个连续的峰之间的距离,低谷频率越高,连续两个低谷之间的距离越小。Mathf.Sin(float)达到1的最大值。同样,Mathf.Sin(float) * amplitude达到amplitude的最大值。

总结起来,通过在Update()函数中调用宇宙飞船的transform来更新transform

代码语言:javascript
复制
private void Update() {
    transform.position = horizontal + vertical;
}
票数 0
EN

Stack Overflow用户

发布于 2022-05-12 22:38:04

这个脚本解决了这个问题。Mathf.Sin函数在02 * pi之间的-11之间旋转一个具有角运动的变量。将此方法添加到原始位置是关键。只需将其添加到对象中并在检查器中选择目标即可。你可以移动目标并看到结果。

代码语言:javascript
复制
public class SinusMove : MonoBehaviour
{
    private float cycle; // This variable increases with time and allows the sine to produce numbers between -1 and 1.
    private Vector3 basePosition; // This variable maintains the location of the object without applying sine changes

    public Transform target;
    
    public float waveSpeed = 1f; // Higher make the wave faster
    public float bonusHeight = 1f; // Set higher if you want more wave intensity
    public float speed = 1f; // more value going faster to target
   
    public void Start() => basePosition = transform.position;

    void Update()
    {
        cycle += Time.deltaTime*waveSpeed;
    
        transform.position = basePosition + (Vector3.up*bonusHeight) * Mathf.Sin(cycle);
    
        if (target) basePosition = Vector3.MoveTowards(basePosition, target.position, Time.deltaTime * speed);
    }
}

请记住,脚本名和文件匹配,如果有问题也要注释。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72217207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档