一.工具类
[ContexMenu]
[ContextMenu("ChangeStencil")]
public void ChangeStencil() {
ChangeMatStencil(transform);
}
void ChangeMatStencil(Transform tra)
{
if (tra.GetComponent<Renderer>() != null)
{
tra.GetComponent<Renderer>().material.SetFloat("_StencilComp", 0);
}
for (int i = 0; i < tra.childCount; i++)
{
ChangeMatStencil(tra.GetChild(i));
}
}
在物体上挂上此脚本,右键菜单就有此方法可用。此方法用于改变材质球某条属性。
[MenuItem]
这里直接上传一个打AB包的脚本好了。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
public class AssetBundlesTool : EditorWindow {
static string Abpath; //资源路径
static string ext;//后缀名变量
static string outPath;//输出路径
static BuildTarget platform;//平台
static PackageData data;
[MenuItem("Plugins/资源包打包工具")]
static void Init()
{
AssetBundlesTool abt = EditorWindow.GetWindow<AssetBundlesTool>();
abt.Show();
}
private void OnGUI()
{
//UGUI 横向布局 纵向布局
GUILayout.BeginVertical();//开始纵向布局
GUILayout.Label("打包资源路径" + Abpath);//文本框
if (GUILayout.Button("选择资源路径"))//按钮
{
Abpath = EditorUtility.OpenFolderPanel("选择要打包的资源路径", "", "");
}
GUILayout.Label("资源包放置路径" + outPath);//文本框
if (GUILayout.Button("选择输出路径"))//按钮
{
outPath = EditorUtility.OpenFolderPanel("选择输出路径", "", "");
}
GUILayout.BeginHorizontal();
GUILayout.Label("资源包后缀名");//文本框
ext = GUILayout.TextField(ext);//输入框
GUILayout.EndHorizontal();
platform = (BuildTarget)EditorGUILayout.EnumPopup(platform); //针对枚举类型的下拉菜单
GUILayout.BeginHorizontal();
if (GUILayout.Button("资源包命名"))//按钮
{
SetABNames(Abpath);
}
if (GUILayout.Button("资源包打包 "))//按钮
{
CreateAB();
}
GUILayout.EndHorizontal();
data = (PackageData)EditorGUILayout.ObjectField(data, typeof(PackageData));
GUILayout.BeginHorizontal();
if (GUILayout.Button("保存资源配置"))//按钮
{
Save();
}
if (GUILayout.Button("读取资源配置"))//按钮
{
Load();
}
GUILayout.EndHorizontal();
if(GUILayout.Button("选择设置ab包名")){
string[] strs = Selection.assetGUIDs;
foreach(var pat in strs){
string pre = Application.dataPath.Replace("Assets",AssetDatabase.GUIDToAssetPath(pat));
SelectSetAb(pre);
}
}
GUILayout.EndVertical();
}
static void SetABNames(string path)
{
///获取指定绝对路径下方的所有子文件夹路径
string[] dirpaths = Directory.GetDirectories(path);
foreach (var dirpath in dirpaths)
{
SetABNames(dirpath);//dirpath 当前文件夹路径下的所有文件夹路径 不停地递归直到没有文件夹可以查到
}
string[] files = Directory.GetFiles(path);//获取当前文件夹下的所有文件绝对路径
foreach (var fileName in files)
{
if (fileName.Contains(".meta"))
continue;
///对当前找到的文件进行资源包命名修改 修改规则基于自己错处的文件夹名 为ab包名
///把资源路径传入AssetImporter对象,然后通过AssetImporter这个工具修改制定资源的资源名
///
string temp = fileName.Replace(@"\", "/");//替换斜杠 规则一致
temp = "Assets/" + temp.Replace(Application.dataPath + "/", "");
AssetImporter asset = AssetImporter.GetAtPath(temp);//传入相对路径 以Assets文件夹为根节点
string assetName = fileName.Replace(@"\", "/");
assetName = assetName.Replace(Abpath + "/", "");//掐头
assetName = assetName.Remove(assetName.LastIndexOf("/"));//去尾
asset.assetBundleName = assetName + ext;//修改资源名 得到资源路径名 + 后缀名
}
}
static void SelectSetAb(string path){
///获取指定绝对路径下方的所有子文件夹路径
string[] dirpaths = Directory.GetDirectories(path);
foreach (var dirpath in dirpaths)
{
SetABNames(dirpath);//dirpath 当前文件夹路径下的所有文件夹路径 不停地递归知道没有文件夹可以查到
}
string[] files = Directory.GetFiles(path);//获取当前文件夹下的所有文件绝对路径
foreach (var fileName in files)
{
if (fileName.Contains(".meta"))
continue;
///对当前找到的文件进行资源包命名修改 修改规则基于自己错处的文件夹名 为ab包名
///把资源路径传入AssetImporter对象,然后通过AssetImporter这个工具修改制定资源的资源名
///
string temp = fileName.Replace(@"\", "/");//替换斜杠 规则一致
temp = "Assets/" + temp.Replace(Application.dataPath + "/", "");
AssetImporter asset = AssetImporter.GetAtPath(temp);//传入相对路径 以Assets文件夹为根节点
string assetName = fileName.Replace(@"\", "/");
assetName = assetName.Replace(Abpath + "/", "");//掐头
assetName = assetName.Remove(assetName.LastIndexOf("/"));//去尾
asset.assetBundleName = assetName + ext;//修改资源名 得到资源路径名 + 后缀名
}
}
static void CreateAB()
{
///创建管线.打资源包
///outPath 打到哪
///
BuildPipeline.BuildAssetBundles(outPath, BuildAssetBundleOptions.None, platform);
}
static void Save()
{
PackageData pd = CreateInstance<PackageData>();
pd.Abpath = Abpath;
pd.outPath = outPath;
pd.ext = ext;
pd.platform = platform;
AssetDatabase.CreateAsset(pd,"Assets/save.asset");
}
static void Load() {
Abpath = data.Abpath;
outPath = data.outPath;
ext = data.ext;
platform = data.platform;
}
}
二.File与FileInfo类
异同
区别:File是静态类,因此不需要实例化对象,对单个对象操作时效率较高,每次调用方法前进行安全检查,即使是同一个文件,因此对多个文件或者同一个文件多次操作建议使用FileInfo实例化一个对象来操作。
相似:都可对文件进行复制、移动、删除、打开、创建、重命名、追加等。
API
1、File.Create(@"D:\Test\Debug1\测试.txt")新建一个空白文本文件
2、File.Open(@"D:\Test\Debug1\测试.txt",FileMode.Append)打开文本文件
3、File.AppendAllText(@"D:\Test\Debug1\测试.txt","哈哈");在文件后追加一个字符串
4、 File.Copy(@"g:\vs2\223.txt", @"g:\网页设计\223.txt");将文件拷贝,拷贝到位置不可覆盖同名文件
5、 File.Move(@"g:\123.txt", @"g:\vs2\223.txt");移动文件
6、File.Delete(@"G:\456.txt");删除文件
7、File.WriteAllText(@"g:\text1.txt", "asfjksa");写入文件
FileInfo的API可实例化后查看,跟File类很像。
三.Directory和DirectoryInfo类
类似于File与FileInfo,对象是文件夹。
四.文件读写
FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方法,但经常使用StreamReader或StreamWriter执行这些功能。这是因为FileStream类操作的是字节和字节数组,而Stream类操作的是字符数据。字符数据易于使用,但是有些操作,比如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行。
五.动画控制(Animator)
实现动画的加速、缓速、正放、倒放