TyeUnityToolsResourcesCS.cs
using System;
using System.Collections;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
public class TyeUnityToolsResourcesCS : MonoBehaviour
{
///-- 1.1 场景加载: 异步带进度条
///StartCoroutine(yeSceneLoad("SceneMain", eSlider));
public static IEnumerator yeSceneLoad(string eStrSceneName, Slider eSlider)
{
//int eIndex = SceneManager.GetActiveScene().buildIndex; //可获取当前场景序号:
//SceneManager.LoadScene(eIndex+1); //直接同步加载到下一个序号的场景(也可用场景名来加载);
float eProgress = 0; // 场景加载进度;
eSlider.value = eProgress;
AsyncOperation eOperation = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(eStrSceneName);
eOperation.allowSceneActivation = false;//false:加载完不跳转场景, 默认true:加载完自动跳转;
/// eOperation.allowSceneActivation = true;// 加载完自动跳转场景;
while (!eOperation.isDone)//isDone:是否完成;
{
eProgress = eOperation.progress;
eSlider.value = eProgress;
//Debug.Log($"---场景加载进度条的更新:{eProgress}--");
if (eOperation.progress >= 0.9f)//如果进度条已经到达90%
{
eProgress = 1; //那就让进度条的值编变成1 (体验会较好,其他的10%在进入新场景时会加载完)
eSlider.value = eProgress;
eOperation.allowSceneActivation = true;//跳转场景
//if (Input.anyKey)//点击了任意按键才跳转 (PC端有效)
//{
// eOperation.allowSceneActivation = true;//跳转场景
//}
}
yield return null;
}
}
///-- 1.2 预制体的加载:
public static IEnumerator yeLoadPrefab(GameObject eObjFather, string eStrPrefabName = "Test/TyePrefab", string eStrDisName = "TyeShowName")
{ // Assets --> Resources --> Test/TyePrefab
//GameObject eObjFather = GameObject.Find("Main Canvas");
GameObject eObj = Instantiate(Resources.Load<GameObject>(eStrPrefabName)); // 实例化预制体;
eObj.transform.parent = eObjFather.transform; //加到父类中;
eObj.transform.localPosition = Vector3.zero; //位置,Position(0,0,0);
eObj.transform.localScale = Vector3.one; //大小, Scale(1,1,1)
eObj.name = eStrDisName; // 在场景中显示的名称;
//yield return null;
yield break;
//Destroy(eObj); //删除;
}
///-- 2.1 从 内部文件夹中(Assets-->Resources) 获取 泛型(eg: 图片) 资源:
//Sprite eSprite = TyeUnityToolsResourcesCS.yeGetDataForPathResources<Sprite>("Tye/ImgTye");
public static T yeGetDataForPathResources<T>(string eStrPath, T eT = null, Image eImg = null, bool isAsync = true) where T : UnityEngine.Object
{ // Assets --> Resources --> Tye/ImgTye.png
try
{
//Texture2D eTexture2D = Resources.LoadAsync<Texture2D>(eStrPath).asset as Texture2D; // 异步加载;
//Sprite eSprite = Sprite.Create(eTexture2D, new Rect(0, 0, eTexture2D.width, eTexture2D.height), Vector2.zero);
//eImg.sprite = eSprite;
//Resources.UnloadAsset(eTexture2D); //释放资源;
T eLoadT;
if (isAsync)
{
eLoadT = Resources.LoadAsync<T>(eStrPath).asset as T; // 异步加载;
} else {
eLoadT = Resources.Load<T>(eStrPath); // 同步;
}
if (null != eImg && (eLoadT.GetType() == eImg.sprite.GetType()))
{ // 当eT 为 Sprite时:
//TyeUnityToolsResourcesCS.yeDeleteSpriteForImage(eImg); // 不用删除, 也不能删除;
eImg.sprite = eLoadT as Sprite;
}
if (null != eT)
{
eT = eLoadT;
}
//Resources.UnloadAsset(eLoadT); //释放资源;
Resources.UnloadUnusedAssets(); //释放 所有 未使用的资源;
return eLoadT;
} catch (System.Exception e) {
Debug.Log($"---yeImgFromPath,异常:{e}--");
return null;
}
}
///-- 2.2 【只在编译器模式下有效】UnityEditor; 从Assets文件夹下去数据, eStrPath = "Assets/Tye/Tye.png", using UnityEditor;
// !!! 【 不要用此方法 UnityEditor.AssetDatabase, 打包移动端时会报错 】
public static void yeGetDataForAssetsUnityEditor<T>(string eStrPath, T eT = null, Image eImg = null, bool IsAsync=true) where T : UnityEngine.Object
{ //eStrPath = "Assets/Tye/Tye.png"
T eLoadT = UnityEditor.AssetDatabase.LoadAssetAtPath<T>(eStrPath);
if (null != eImg && (eLoadT.GetType() == eImg.sprite.GetType())) {
eImg.sprite = eLoadT as Sprite;
Resources.UnloadAsset(eLoadT);
} else{
Debug.Log($"---获得的数据名:{eLoadT.name}--");
}
if (null != eT)
{
eT = eLoadT;
}
//UnityEditor.AssetDatabase.Refresh();
}
///-- 2.2 从 外部 文件夹中获取 图片资源: UnityWebRequestTexture, (eg: 数据持久化路径 PersistentDataPath)
public static IEnumerator yeGetImageForUnityWebRequest(string ePathImg, Image eImg = null)
{ // string ePathImg = $"file://{ePathImages}{eStrImgID}.png";
//【UnityWebRequest加载本地文件地址头用 file:// , 加载网络文件地址头用 http:// 】
UnityWebRequest eRequest = UnityWebRequestTexture.GetTexture(ePathImg);
yield return eRequest.SendWebRequest();
if (eRequest.isNetworkError || eRequest.isHttpError)
{
Debug.Log($"--- 加载资源错误:{eRequest.error}--");
} else {
//TyeUnityToolsResourcesCS.yeDeleteSpriteForImage(eImg);
Texture2D eTexture2D = DownloadHandlerTexture.GetContent(eRequest);
eImg.sprite = Sprite.Create(eTexture2D, new Rect(0, 0, eTexture2D.width, eTexture2D.height), Vector2.zero);
eRequest.Dispose(); //释放请求;
//Resources.UnloadAsset(eTexture2D); //释放资源;
Resources.UnloadUnusedAssets(); //释放 所有 未使用的资源;
yield return null;
}
}
///==
public static void yeDeleteSpriteForImage(Image eImg)
{
if (null != eImg.sprite)
{
if (eImg.sprite.texture)
{
DestroyImmediate(eImg.sprite.texture);
}
Destroy(eImg.sprite);
}
if (null != eImg.sprite)
{
UnityEngine.U2D.SpriteAtlas.Destroy(eImg.sprite);
}
}
///-- 释放资源:
public static void yeResourcesUnLoading<T>(T t) where T : UnityEngine.Object
{
//ResourcesUnLoading<T>(t);
//Resources.UnloadAsset(eTexture2D); //释放资源;
Resources.UnloadUnusedAssets(); //释放 所有 未使用的资源;
}
//--- 资源加载
//public virtual void ResourcesLoading<T>(T t, string path, bool IsAsync) where T : UnityEngine.Object
//{
// throw new NotImplementedException();
//}
public void yeSaveConfigForPlayerPrefs()
{
//---1.存数据
PlayerPrefs.SetString("name", "中文");
PlayerPrefs.SetInt("age", 15);
PlayerPrefs.SetInt("sex", 1);
PlayerPrefs.SetFloat("hight", 1.62f);
PlayerPrefs.Save(); //立即保存;
//---2.取数据
Debug.Log(PlayerPrefs.GetString("name"));
Debug.Log(PlayerPrefs.GetInt("age"));
Debug.Log(PlayerPrefs.GetInt("sex"));
Debug.Log(PlayerPrefs.GetFloat("hight"));
//---3.查找删除
if (PlayerPrefs.HasKey("name")) // 检测是否有此 key;
{
Debug.Log("Has the key");//第一次输出这个
PlayerPrefs.DeleteKey("name"); // 删除;
} else {
Debug.Log("ELSE NOT FOUND");//第二次输出这个(被第一次删除了,找不到了)
}
//--- 4.
string eStrName = PlayerPrefs.GetString("name");
if (string.IsNullOrEmpty(eStrName))
{
Debug.Log("--- String 为空! --");
}
}
// 系列化:
public static byte[] yeObject2Bytes(object obj)
{
byte[] buff;
using (MemoryStream ms = new MemoryStream())
{
IFormatter iFormatter = new BinaryFormatter();
iFormatter.Serialize(ms, obj);
buff = ms.GetBuffer();
}
return buff;
}
// 反系列化:
public static object yeBytes2Object(byte[] buff)
{
object obj;
using (MemoryStream ms = new MemoryStream(buff))
{
IFormatter iFormatter = new BinaryFormatter();
obj = iFormatter.Deserialize(ms);
}
return obj;
}
}