//把这个脚本挂到画布下面的一个空节点就可以
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
public class ImageCropping : MonoBehaviour {
[SerializeField]
private Texture2D MainTexture; //要裁切的原图
private Image MainImage;
private float Image_w; //图片的宽
private float Image_h; //图片的高
private List<Sprite> Sprlist; //存储切出来的图片
public GameObject ImagePrefab; //Image的预制体
private int Count_h = 10; //纵向要切多少
private int Count_w = 10; //横向要切多少
private RectTransform Cnavas; //画布必须要 要用画布计算图片的摆放图片的宽和高
public Action OffsetEvent; //图片偏移 绑定图片身上的偏移方法
public Action AssemblageEvent; //绑定图片身上的组合方法
private void Start()
{
Cnavas = GameObject.Find("Canvas").GetComponent<RectTransform>();
Sprlist = new List<Sprite>();
MainImage = GetComponent<Image>();
Image_w = MainTexture.width / Count_w;
Image_h = MainTexture.height / Count_h;
CutTheFigure();
}
//裁切图片
private void CutTheFigure()
{
for (int x = 0; x < Count_h; x++)
{
for (int y = 0; y < Count_w; y++)
{
//图片的坐标是OpenGl坐标 要裁切的图片 图片的矩形 锚点 我把锚点放在图片的左上角
Sprite cc_spr = Sprite.Create(MainTexture, new Rect(y * Image_w, MainTexture.height - x * Image_h - Image_h, Image_w, Image_h), new Vector2(0, 1));
Sprlist.Add(cc_spr);
}
}
AddImage();
}
private void AddImage()
{
int index = 0;
Image_w = Cnavas.rect.width / Count_w; //给实例化之后的图片重新计算宽高
Image_h = Cnavas.rect.height / Count_h;
for (int x = 0; x < Count_h; x++)
{
for (int y = 0; y < Count_w; y++)
{
GameObject _image = Instantiate(ImagePrefab);
_image.transform.SetParent(transform);
_image.GetComponent<RectTransform>().sizeDelta = new Vector2(Image_w, Image_h); //设置实例化之后的图片的宽高
_image.GetComponent<RectTransform>().pivot = new Vector2(0, 1); //设置锚点
_image.transform.position = new Vector3(y * Image_w, Cnavas.rect.height - x * Image_h, 0); //设置坐标
_image.GetComponent<ImageEvent>().Pos = _image.transform.position;
OffsetEvent += _image.GetComponent<ImageEvent>().OffsetPos; //把图片身上的偏移方法注册进去
AssemblageEvent += _image.GetComponent<ImageEvent>().Assemblage; //把图片身上的组合方法注册进去
_image.GetComponent<Image>().sprite = Sprlist[index++];
}
}
if (OffsetEvent != null) { OffsetEvent();
if (AssemblageEvent != null) { AssemblageEvent(); }
}
}
}
//把下面这个脚本挂到图片的预制体身上 这是那个组合的动画
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class ImageEvent : MonoBehaviour
{
public Vector3 Pos;
public void OffsetPos()
{
gameObject.SetActive(false);
transform.position += new Vector3(Random.Range(-500, 500), Random.Range(-500, 500), 0);
transform.eulerAngles = new Vector3(Random.Range(0, 360), Random.Range(0, 360), Random.Range(0, 360));
transform.DOScale(0, 0);
}
public void Assemblage()
{
gameObject.SetActive(true);
transform.DOMove(Pos, Random.Range(2, 3));
transform.DORotate(Vector3.zero, Random.Range(3, 4));
transform.DOScale(1, Random.Range(1.5f, 2.5f));
}
}