今天在做期末作业的时候想让一个法杖悬浮在空中发现自己写的算法漂浮的很奇怪没有连贯性于是就上网查看了一个漂浮算法这篇文章加上自己的一些理解:
原文出自:https://blog.csdn.net/dark00800/article/details/77327511
整个代码结构我贴出来
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Float : MonoBehaviour
{
public Vector3 offset; //最大的偏移量
public float frequency; //振动频率
private Vector3 originPosition; //记录物体的原始坐标
private float tick; // 用于计算当前时间量(可以理解成函数坐标轴x轴)
private float amplitude; //物体的振幅
public bool animate; //用于控制物体漂浮动画的animate值
private void Awake()
{
//如果没有设置频率或者设置频率为0则自动记录成1
if (Mathf.Approximately(frequency, 0))
frequency = 1f;
originPosition = transform.localPosition;
tick = Random.Range(0f, 2f * Mathf.PI);
//计算振幅
amplitude = 2 * Mathf.PI / frequency;
animate = true ;
}
public void Play()
{
transform.localPosition = originPosition;
animate = true;
}
public void Stop()
{
transform.localPosition = originPosition;
animate = false;
}
private void FixedUpdate()
{
if (animate)
{
//计算下一个时间量
tick = tick + Time.fixedDeltaTime * amplitude;
//计算下一个偏移量
var amp = new Vector3(Mathf.Cos(tick) * offset.x, Mathf.Sin(tick) * offset.y, 0);
// 更新坐标
transform.localPosition = originPosition + amp;
}
}
}
这篇文章使用的的是sin cos函数实现的浮动 让时间作为一个增量这样就能实现随着时间的改变绕原点做一个函数轨迹的飘动;
简单来说算法的核心 物体的坐标 = (sin(有关时间的变量) ,cos(有关时间的变量) , 0);
我画了一张图方便理解;