【DOTween Pro最新版 免费下载地址】
完整代码
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;
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);
}
}
}