Unity 两点之间随机曲线动画

最近遇到一个功能就是导弹到目标点要有随机曲线表现,重点要到目标点那里

实现思路

用根据时间流逝用sin函数来处理来回曲线的功能(坐标偏移),加个衰减距离(计算坐标偏移大小)

先上图,最下方有工程下载地址

主要实现代码如下

using UnityEngine;
using Random = UnityEngine.Random;


public enum RandomMoveCoordinates
{
    None,
    XY,
    XZ,
    YZ,
    XYZ
}

public class EffectRandomMove : MonoBehaviour
{
    /// <summary>
    /// 随机偏移半径
    /// </summary>
    public float RandomMoveRadius;

    /// <summary>
    /// 随机偏移移动速度,根据时间累加通过sin算出弧线
    /// </summary>
    public float RandomMoveSpeed;

    /// <summary>
    /// 同上
    /// </summary>
    public float RandomRange;

    /// <summary>
    /// 衰减距离
    /// </summary>
    public float ReduceDistance = 1;

    /// <summary>
    /// 随机模式
    /// </summary>
    public 
### Unity 中实现照片随机显示与滑动效果 要在 Unity 中实现照片的随机显示以及滑动效果,可以结合 UGUI 的 `ScrollRect` 和脚本逻辑来完成。以下是详细的解决方案: #### 1. 随机显示照片 为了实现照片的随机显示功能,可以通过创建一个数组存储所有可能的照片路径或 Sprite 对象,在运行时通过脚本随机选取其中的一个并赋值给 UI 图像组件。 ```csharp using UnityEngine; using System.Collections.Generic; public class RandomPhotoDisplay : MonoBehaviour { public List<Sprite> photoSprites; // 存储所有可用的照片 Sprite private int currentPhotoIndex = -1; // 当前显示的照片索引 private Image imageComponent; // 获取图像组件 void Start() { imageComponent = GetComponent<Image>(); ShowRandomPhoto(); } public void ShowRandomPhoto() { if (photoSprites.Count == 0) return; do { currentPhotoIndex = Random.Range(0, photoSprites.Count); } while (currentPhotoIndex == -1 || !IsValidSprite(photoSprites[currentPhotoIndex])); imageComponent.sprite = photoSprites[currentPhotoIndex]; } bool IsValidSprite(Sprite sprite) { return sprite != null && sprite.texture.width > 0 && sprite.texture.height > 0; } } ``` 此代码片段实现了从列表中随机选择一张照片并将其设置为当前图像的功能[^1]。 --- #### 2. 滑动效果 对于滑动效果,可以利用 `ScrollRect` 组件配合自定义脚本来增强用户体验。例如,当用户拖拽内容时触发平滑过渡动画或者循环滚动效果。 ##### 使用 DOTween 插件优化滑动体验 DOTween 是一款强大的补间动画工具,能够轻松实现复杂的运动曲线和平滑过渡效果。安装方法可通过 Asset Store 下载并导入项目。 下面是一个简单的例子展示如何让图片容器在一定范围内水平滑动: ```csharp using DG.Tweening; using UnityEngine.UI; public class PhotoScroller : MonoBehaviour { public ScrollRect scrollRect; // 关联 ScrollRect 组件 public float snapDuration = 0.5f; // 动画持续时间 private RectTransform contentRectTransform; void Awake() { contentRectTransform = scrollRect.content as RectTransform; } public void SnapToNearestCell() { Vector2 targetPosition = GetClosestSnapPoint(contentRectTransform.anchoredPosition); contentRectTransform.DOAnchorPos(targetPosition, snapDuration).SetEase(Ease.OutQuad); } Vector2 GetClosestSnapPoint(Vector2 currentPosition) { float cellWidth = ContentSizeFitter.fittedSize.x / NumberOfCells(); // 假设每张图宽度相等 int index = Mathf.RoundToInt(currentPosition.x / cellWidth); // 计算最近单元格索引 return new Vector2(index * cellWidth, 0); } int NumberOfCells() { LayoutGroup layoutGroup = scrollRect.content.GetComponent<LayoutGroup>(); if (layoutGroup is HorizontalOrVerticalLayoutGroup hvg) { return hvg.childCount; } return 0; } } ``` 上述代码展示了基于当前位置计算最接近的目标点,并调用 DOTween 方法执行锚点位移操作[^4]。 --- #### 3. 结合两者 最终可将以上两部分结合起来形成完整的交互流程:每隔一段时间更换新的随机图片;允许玩家手动触碰屏幕进行翻页查看其他选项的同时支持惯性滑动返回指定位置等功能[^3]。 注意调整 Canvas Render Mode 及其属性以适配具体需求场景下的表现形式[^2]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值