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

首先我们需要设置一个最大偏移量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则自动记录成1if (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则自动记录成1if (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】简单的物体漂浮算法相关推荐

  1. android+Unity3D游戏开发之简单的物体运动

    android+Unity3D游戏开发之简单的物体运动 其实这篇也是转载的,真的感觉对于我们初学者来说很不错的,不信你看看嘛;原创链接:http://bbs.9ria.com/thread-98192 ...

  2. 中科院张士峰:基于深度学习的通用物体检测算法对比探索

    https://www.toutiao.com/a6674792954369933838/ 人工智能论坛如今浩如烟海,有硬货.有干货的讲座却百里挑一.由中国科学院大学主办,中国科学院大学学生会承办,读 ...

  3. 一种简单的抗锯齿算法

    在LCD等显示器上逐点绘制几何图像的时候, 往往对几何体的边缘采样不足, 这就会导致出现锯齿状不平滑的边缘. 为了尽量减弱这种现象,需要在斜线或物体边缘进行更密集的采样,然后根据一定的权重比例将色彩/ ...

  4. 视频物体分割算法:如何提升复杂场景的分割精度?

    在此文章中,阿里巴巴资深算法专家为我们介绍了视频物体分割的三个研究方向,然后结合阿里文娱摩酷实验室的探索,分享了他们在视频领域的最新应用. 视频物体分割(Video Object Segmentati ...

  5. 计算机图形学+简单算法实现,《计算机图形学》课程设计-简单几何体的消隐算法实现.doc...

    PAGE PAGE 18 PAGE 18 课程名称:<计算机图形学> 论文题目:简单几何体的消隐算法实现 教学部: 年 级: 班 级: 学 号: 姓 名: 简单几何体的消隐算法实现 摘 要 ...

  6. 自动驾驶感知——激光雷达物体检测算法

    文章目录 1. 基于激光雷达的物体检测 1.1 物体检测的输入与输出 1.2 点云数据库 1.3 激光雷达物体检测算法 1.3.1 点视图 1.3.1.1 PointNet 1.3.1.2 Point ...

  7. 简单的理解EKF算法1

    简单的理解EKF算法 经典的EKF公式 简化版的EKF公式 参考资料 经典的EKF公式 来我们先来看一下第一眼看上去不知道在讲啥的公式 1 x k − = A x k − 1 + B u k − 1 ...

  8. python数据标注工具_python实现简单图片物体标注工具

    本文实例为大家分享了python实现简单图片物体标注工具的具体代码,供大家参考,具体内容如下 # coding: utf-8 """ 物体检测标注小工具 基本思路: 对要 ...

  9. 碎片2:大白话讲解Mask R-CNN及常见物体检测算法

    文章目录 MASK R-CNN调研报告 1.Introduction 1.1 MASK R-CNN简介 1.2 直觉理解MASK R-CNN 2.Algorithm 2.1已有物体检测算法概述 2.1 ...

最新文章

  1. 如何才能识别市场趋势?[转]
  2. 时间相减得到小时数 java_【高中数学】错位相减公式求差比数列的和
  3. [html] 你喜欢哪种布局风格?说说你的理由
  4. mysql远程访问 linux_Linux中开启mysql远程访问功能
  5. OpenCV Mat主要用法(1)
  6. 2021高考成绩查询截图,科目四2021模拟考试成绩截图
  7. 一个批量转换文件编码的python脚本
  8. 可靠性标准: TL9000
  9. 为老电脑装linux系统
  10. python计算时间_python计算时间
  11. Niushop 分销推广员管理
  12. 360度全方位解析死链接
  13. CNN网络实现手写数字(MNIST)识别 代码分析
  14. qt中ui的 使用介绍
  15. 100个有趣的网站,快来看看吧
  16. iam是什么意思中文_iam是什么意思
  17. 标题: 连接到服务器 ------------------------------ 无法连接到 .。 ------------------------------ 其他信息: 在与 SQL Se
  18. 华为发布鸿蒙现场直播,首发鸿蒙 2.0!华为全屋智能及智慧屏新品发布会直播...
  19. 判定一个数组矩阵的对称性
  20. 新零售决战,2019年或将迎来变数

热门文章

  1. win10下安装cuda和cudnn
  2. H5游戏开发:决胜三分球
  3. 1.Arduino入门项目1-超声波测距仪(附项目源码、库文件、电路图、材料清单等资料)
  4. Java基础 DAY06
  5. Java基础 DAY04
  6. unix linux tecn,对高级 Linux 用户有用的 20 个下令
  7. 2-9课:树和图的现实意义、区别与联系
  8. k8s集群安装过程中的相关问题和解决
  9. mysql宕机日志查询_Mysql容器异常宕机
  10. matlab emi滤波器设计,基于Matlab-GUI的EMI滤波器设计