利用Unity ScriptableObject储存,先生成一个asset文件
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//为什么创建一个类?
//因为List<xx[]>不能序列化,创建一个类管理,类加上[System.Serializable]标签
[System.Serializable]
public class MyMaterial
{
public Material[] materials;
public MyMaterial(Material[] materials)
{
this.materials = materials;
}
}
[CreateAssetMenu(menuName = "CreatEditOrigialMats")]
public class EditOriginalMaterial : ScriptableObject
{
public static EditOriginalMaterial Get()
{
return Resources.Load<EditOriginalMaterial>("EditOriginalMaterial");
}
public List<string> nameArr = new List<string>();
public List<MyMaterial> materials = new List<MyMaterial>();
}
使用方法:在Poject面板右键Creat->CreatEditOrigialMats,新生成的文件放到Resources文件夹下,名字为EditOriginalMaterial
测试代码:
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
using UnityEditor;
using UnityEngine;
public class Use : MonoBehaviour
{
public static EditOriginalMaterial EditOriginalMaterialInfo;
private void Awake()
{
EditOriginalMaterialInfo = EditOriginalMaterial.Get();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.R))
{
foreach (var item in EditOriginalMaterialInfo.materials)
{
Debug.Log(item);
}
}
}
[MenuItem("test/on")]
public static void On()
{
EditOriginalMaterialInfo = EditOriginalMaterial.Get();
EditOriginalMaterialInfo.nameArr.Clear();
EditOriginalMaterialInfo.materials.Clear();
Renderer[] renderers = FindObjectsOfType<Renderer>();
foreach (var item in renderers)
{
EditOriginalMaterialInfo.nameArr.Add(item.gameObject.name);
EditOriginalMaterialInfo.materials.Add(new MyMaterial(item.sharedMaterials));
Debug.Log(item.material.name);
}
}
}