DOTween是一个轻量级的动画引擎,它提供了一个简单易用的API,允许开发者快速实现复杂的动画效果。Unity的UI系统(UGUI)提供了一套丰富的组件来构建用户界面,包括按钮、滑块、滚动视图等。通过结合使用DOTween和UGUI,我们可以创建出既美观又流畅的UI动画。


![]()
💯 演示效果

![]()
💯 完整代码
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class MyTest : MonoBehaviour {
public RectTransform prefab;
int row = 10; // 行
int column = 20; // 列
int startXPos = 60;
int startZPos = -100;
float distanceRandomMinX = 55;
float distanceRandomMaxX = 65;
float distanceRandomMinY = 60;
float distanceRandomMaxY = 60;
float initMoveDistance = 1200;
float enlargeSize = 5;
float radiateSize = 220;
List<List<RectTransform>> goList;
Dictionary<RectTransform, Vector2> itemPosDict;
List<RectTransform> changedItemList;
// Use this for initialization
void Start () {
goList = new List<List<RectTransform>>();
itemPosDict = new Dictionary<RectTransform, Vector2>();
changedItemList = new List<RectTransform>();
CreateGos();
}
void CreateGos()
{
// 生成所有物体,并添加到字典
for (int i = 0; i < row; i++)
{
List<RectTransform> gos = new List<RectTransform>();
goList.Add(gos);
float lastPosX = 0;
for (int j = 0; j < column; j++)
{
RectTransform item = (Instantiate(prefab.gameObject) as GameObject).GetComponent<RectTransform>();
item.name = i + " " + j;
item.transform.SetParent(transform);
Vector2 startPos = new Vector3(Random.Range(distanceRandomMinX, distanceRandomMaxX) + lastPosX, startZPos - i * Random.Range(distanceRandomMinY, distanceRandomMaxY));
item.anchoredPosition = startPos;
Vector2 endPos = new Vector3(startPos.x - initMoveDistance, startZPos - i * Random.Range(distanceRandomMinY, distanceRandomMaxY));
Tweener tweener = item.DOAnchorPosX(endPos.x, Random.Range(1.8f, 2f)); // 缓动到目标位置
tweener.SetDelay(j * 0.1f + (row - i) * 0.1f); // 延时
tweener.SetEase(Ease.InSine); // 缓动效果
item.gameObject.SetActive(true);
gos.Add(item);
itemPosDict.Add(item, endPos);
lastPosX = item.anchoredPosition.x;
}
}
}
public void OnMousePointEnter(RectTransform item)
{
// 缓动改变中心物体尺寸
item.DOScale(enlargeSize, 0.5f);
Vector2 pos = itemPosDict[item];
changedItemList = new List<RectTransform>();
// 添加扩散物体到集合
foreach (KeyValuePair<RectTransform, Vector2> i in itemPosDict)
{
if(Vector2.Distance(i.Value, pos) < radiateSize)
{
changedItemList.Add(i.Key);
}
}
// 缓动来解决扩散物体的动画
for (int i = 0; i < changedItemList.Count; i++)
{
Vector2 targetPos = itemPosDict[item] + (itemPosDict[changedItemList[i]] - itemPosDict[item]).normalized * radiateSize;
changedItemList[i].DOAnchorPos(targetPos, 0.8f);
}
}
public void OnMousePointExit(RectTransform go)
{
// 缓动恢复中心物体尺寸
go.DOScale(1, 1);
// 缓动将扩散物体恢复到初始位置
for (int i = 0; i < changedItemList.Count; i++)
{
changedItemList[i].DOAnchorPos(itemPosDict[changedItemList[i]], 0.8f);
}
}
}
![]()
💯 DOTween Pro 下载地址


🍉🍉🍉 如果觉得这篇文对你有帮助的话,请点个赞👍、收藏⭐️下吧,非常感谢! 💕💕💕
【博主简介】:10年以上软件开发经验,精通C语言、C++、C#、Java等开发语言,开发过大型 Android 项目,现主要自主开发经营 休闲益智类小游戏。
【粉丝福利】:博主收藏了大量游戏开发资源和素材。这些资源经过博主多年整理沉淀,现筛选一批精品资源,分享给大家学习研究。
Unity打怪军团 广招天下勇士加入 Unity学习互助小组 有意进群的同学联系我,互3互推也请联系我…



2846






