使用预制体动态创建Image并动态加载资源图片

 

创建一个UI Image,并设置Source Image为精灵02

把Image02拖到Assets中,使它成为预制体,并改名为myPrefab

创建脚本CreateGameObject

这个脚本的作用是:

1、引用这个预制体(怎么称呼这个不确定)

2、从资源文件夹加载图片,生成纹理,然后转成精灵Sprite

3、创建一个新游戏对象,添加Image组件

4、设置Image组件的sprite属性,也可以同时设置大小和位置等

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

public class CreateGameObject : MonoBehaviour
{
    // 要创建的GameObject的预制体
    public GameObject myPrefab;

    // 引用Canvas组件
    public Canvas canvas;

    void Start()
    {
        Test();
    }

    /// <summary>
    /// 成功
    /// </summary>
    private void Test()
    {
        // 从资源文件夹加载图片(即纹理)
        byte[] imgBuff = File.ReadAllBytes("Assets/Resources/Images/01.jpg");
        Texture2D texture2D = new Texture2D(1, 1);//默认尺寸是多少都无所谓
        texture2D.LoadImage(imgBuff);

        //通过缓存中的文件创建精灵
        Sprite sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f));


        // 创建一个新的GameObject
        GameObject newObj = new GameObject("NewObject");

        // 添加Image组件
        Image imageComponent = newObj.AddComponent<Image>();

        // 设置Image的属性
        imageComponent.sprite = sprite;//新的Image组件的图片赋值
        //imageComponent.sprite = Resources.Load<Sprite>("09"); // 设置图片资源
        //imageComponent.color = Color.red; // 设置颜色
        imageComponent.rectTransform.sizeDelta = new Vector2(300, 300); // 设置大小

        // 设置父子关系
        newObj.transform.SetParent(transform);
    }
}

  

创建空游戏对象,并添加脚本CreateGameObject

空游戏对象,使用默认名称GameObject即可,当然也可以随便改名,这个不影响执行效果

运行项目

运行成功后,在空游戏对象(挂载了脚本的那个)下动态生成了一个新的游戏对象,同时场景中增加了一个图片显示。

这个图片就是Assets/Resources/01.jpg,注意这个01.jpg不是Sprite

 打包后运行

这个方法在设计器里运行正常,但是打包后就不能动态显示图片文件了,原因是打包后没有这个Resource/Images/01.jpg了,要用resource.load读,不过现在不熟练,不会改写了。换下面的方法就可以了。
在项目下创建目录,Assets\StreamingAssets\Resources\Images\01.jpg

 

脚本里的图片路径要修改一下

/// <summary>
    /// 成功
    /// </summary>
    private void Test3()
    {
        Debug.Log("获取StreamingAssets文件夹的路径 = " + Application.streamingAssetsPath);
//获取StreamingAssets文件夹的路径 = D:/test/test_unity/AutoCreateImage/Assets/StreamingAssets string streamingAssetsPath = Application.streamingAssetsPath;//获取StreamingAssets文件夹的路径 // 从资源文件夹加载图片(即纹理) byte[] imgBuff = File.ReadAllBytes(streamingAssetsPath + "/Resources/Images/1.jpg"); Texture2D texture2D = new Texture2D(1, 1);//默认尺寸是多少都无所谓 texture2D.LoadImage(imgBuff); //通过缓存中的文件创建精灵 Sprite sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(0.5f, 0.5f)); // 创建一个新的GameObject GameObject newObj = new GameObject("NewObject"); newObj.transform.position = new Vector3(0, 0, 0); // 添加Image组件 Image imageComponent = newObj.AddComponent<Image>(); // 设置Image的属性 imageComponent.sprite = sprite;//新的Image组件的图片赋值 //imageComponent.sprite = Resources.Load<Sprite>("09"); // 设置图片资源 //imageComponent.color = Color.red; // 设置颜色 imageComponent.rectTransform.sizeDelta = new Vector2(300, 300); // 设置大小 // 设置父子关系 newObj.transform.SetParent(transform); // 获取父对象的位置 Vector3 parentPosition = this.gameObject.transform.position; // 设置newObj相对于父对象的偏移量 Vector3 offset = new Vector3(1, 0, 0); // 假设偏移量为(1, 0, 0) // 设置newObj的位置为父对象位置加上偏移量 newObj.transform.position = parentPosition + offset; }

  

这样,在打包后,就可以动态创建组件,并且加载磁盘上的文件了。

打包后的运行效果

 

资料

关于为什么加这个文件夹,在官方文档中有说明,见 流媒体资源

 

posted @ 2023-07-14 10:00  牛大胆V5  阅读(393)  评论(1)    收藏  举报