使用预制体动态创建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;
}
这样,在打包后,就可以动态创建组件,并且加载磁盘上的文件了。
打包后的运行效果

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

使用预制体从文件夹中加载图片并显示
浙公网安备 33010602011771号