【Unity3d】简单的物体漂浮算法

之前左右游戏的时候有需要实现模拟物体漂浮的功能的,所以写了一个简单的物体漂浮的算法,使用正弦函数和余弦函数去控制物体的偏移量,这样就能实现物体绕着原点漂浮的感觉。

首先我们需要设置一个最大偏移量offset和振动频率frequency。

public Vector3 offset;
public float frequency;

然后我们还需要记录物体的原始坐标即原点originPosition,用于计算当前时间量的tick值(可以理解成函数坐标轴的x值),物体的振幅(根据我们设定的frequency计算)和用于控制物体漂浮动画的animate值。

private Vector3 originPosition;
private float tick;
private float amplitude;
private bool animate;

在Awake方法中对各个属性进行赋值,然后在FixedUpdate方法中进行计算:

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 = false;
}

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;
    }
}

由于需求是针对UI的,所以Z轴上不需要做位移,这里可以根据需求进行修改。我们还可以设置一个是否自动播放的变量,并在Awake方法中将其赋值给animate:

public bool playAwake;

void Awake()
{
    animate = playAwake;
}

最后写两个简单的播放和停止的方法:

public void Play()
{
    transform.localPosition = originPosition;
    animate = true;
}

public void Stop()
{
    transform.localPosition = originPosition;
    animate = false;
}

这里直接在停止时将物体移动到原点,如果需要更顺畅的动画的话,我们可以在停止时在停止的位置点和原点之间做一个插值动画来让物体慢慢飘回原点。

将脚本挂载到物体上后进行编辑:
脚本编辑
设置不同的合适的偏移量和频率还可以达到远近景的效果。

运行效果:
运行效果

完整代码:
FloatingObj.cs:

using UnityEngine;

public class FloatingObj : MonoBehaviour
{
    public Vector3 offset;
    public float frequency;
    public bool playAwake;

    private Vector3 originPosition;
    private float tick;
    private float amplitude;
    private bool animate;

    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 = playAwake;
    }

    public void Play()
    {
        transform.localPosition = originPosition;
        animate = true;
    }

    public void Stop()
    {
        transform.localPosition = originPosition;
        animate = false;
    }

    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;
        }
    }
}

By: 蒋志杰

要实现Unity3D物体的悬浮效果,可以使用脚本来控制物体的上下浮动。可以参考以下代码实现悬浮效果: ```csharp using UnityEngine; public class Floating : MonoBehaviour { float radian = 0; // 弧度 float perRadian = 0.03f; // 每次变化的弧度 float radius = 0.8f; // 半径 Vector3 oldPos; // 开始时候的坐标 void Start() { oldPos = transform.position; // 将最初的位置保存到oldPos } void Update() { radian += perRadian; // 弧度每次加0.03 float dy = Mathf.Cos(radian) * radius; // dy定义的是针对y轴的变量,也可以使用sin,找到一个适合的值就可以 transform.position = oldPos + new Vector3(0, dy, 0); } } ``` 这段代码会让物体在上下浮动,可以根据需要调整浮动的幅度和速度。将该脚本挂载到需要悬浮的物体上即可实现悬浮效果。\[1\] 希望对你有所帮助! #### 引用[.reference_title] - *1* [【UnityUnity物体上下反复漂浮效果](https://blog.csdn.net/sinat_20559947/article/details/47999659)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Unity3d游戏开发中3D物体的点击获取和悬浮获取](https://blog.csdn.net/xpala/article/details/89414227)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Unity3D Button 鼠标悬浮进入与鼠标悬浮退出按钮事件](https://blog.csdn.net/qq_40732959/article/details/126030091)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值