使用unity动态切割图片 然后重新组合

//把这个脚本挂到画布下面的一个空节点就可以

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));
    }
}




  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity中可以使用AssetBundle来动态加载图集中的图片。 首先,需要将图集创建为一个AssetBundle,可以使用Unity的打包工具将图集打包成一个AssetBundle文件。另外,也可以使用代码动态加载图集中的图片。 首先创建一个空的GameObject,并挂载一个脚本。在脚本中使用AssetBundle.LoadFromFile或者AssetBundle.LoadFromMemoryAsync方法来加载AssetBundle文件。加载完成后,可以通过AssetBundle.LoadAsset来获取图集的引用。 接下来,使用Sprite.Create方法来创建一个Sprite对象,然后将图集中的图片赋值给这个Sprite对象。最后,将这个Sprite对象设置到需要显示的图片元素上,比如一个Image组件。 具体的代码示例如下: ```csharp using UnityEngine; using UnityEngine.UI; public class LoadAtlas : MonoBehaviour { public string assetBundlePath; public string assetName; public Image image; void Start() { StartCoroutine(LoadImageFromAtlas()); } IEnumerator LoadImageFromAtlas() { // 加载AssetBundle AssetBundle assetBundle = AssetBundle.LoadFromFile(assetBundlePath); if (assetBundle == null) { Debug.LogError("Failed to load AssetBundle!"); yield break; } // 加载图集 AssetBundleRequest request = assetBundle.LoadAssetAsync<Sprite>(assetName); yield return request; Sprite sprite = request.asset as Sprite; if (sprite) { // 创建Sprite并设置给image组件 image.sprite = sprite; } else { Debug.LogError("Failed to load Sprite!"); } // 卸载AssetBundle assetBundle.Unload(false); } } ``` 在上述代码中,assetBundlePath是AssetBundle文件的路径,assetName是图集在AssetBundle文件中的名称,image是需要显示图片的Image组件。 通过以上步骤,就可以在运行时动态加载图集中的图片,并将其显示到对应的UI元素中去。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值