Editor下的脚本资源都不会打包。
优先级相隔11就有有中线分割,每一个菜单栏的priority优先级默认为1000
=>扩展在脚本上点击右键执行修改脚本属性的方法
[MenuItem("CONTEXT/PlayerHealth/InitHealthAndSpeed")]// CONTEXT 组件名 按钮名
static void InitHealthAndSpeed(MenuCommand cmd)//menucommand是当前正在操作的组件
{
//Debug.Log(cmd.context.GetType().FullName);
CompleteProject.PlayerHealth health = cmd.context as CompleteProject.PlayerHealth;
health.startingHealth = 200;
health.flashSpeed = 10;
Debug.Log("Init");
}
学习使用selection获取选择的游戏物体,制作删除功能(可以撤销的)删除操作
[MenuItem("GameObject/my delete", false, 11)]
static void Mydelete()
{
foreach (Object o in Selection.objects)
{
//GameObject.DestroyImmediate(o);
Undo.DestroyObjectImmediate(o);//利用Undo进行的删除操作 是可以撤销的
}
//需要把删除操作注册到 操作记录里面
}
给菜单项添加快捷键:
//%=ctrl #=shift &=alt
[MenuItem("Tools/test2 %q",false,100)]
static void Test2()
{
Debug.Log("Test2");
}
[MenuItem("Tools/test3 %t",false,0)]
static void Test3()
{
Debug.Log("Test3");
}
==》》控制菜单项是否启用的功能
[MenuItem("GameObject/my delete", true, 11)]
static bool MyDeleteValidate()
{
if (Selection.objects.Length > 0)
return true;
else
return false;
}
[MenuItem("GameObject/my delete", false, 11)]
static void Mydelete()
{
foreach (Object o in Selection.objects)
{
//GameObject.DestroyImmediate(o);
Undo.DestroyObjectImmediate(o);//利用Undo进行的删除操作 是可以撤销的
}
//需要把删除操作注册到 操作记录里面
}
[MenuItem("Assets/PackageTools/SetCastShadowsOff", priority = 506)]
static void SetCastShadowsOff()
{
Debug.Log("SetCastShadowsOff");
var select = Selection.activeObject;
if (!select)
{
return;
}
var folderPath = AssetDatabase.GetAssetPath(select);
if (Directory.Exists(folderPath))
{
var fbxs = Directory.GetFiles(folderPath, "*.FBX", SearchOption.AllDirectories);
foreach (var item in fbxs)
{
Transform fbx = AssetDatabase.LoadAssetAtPath<Transform>(item);
///下面代码有点鬼畜,.On正常,.Off就只能在本级目录
var renderers = fbx.GetComponentsInChildren<SkinnedMeshRenderer>();
foreach (var one in renderers)
{
string lowerChildName = one.transform.name.ToLower();
if (lowerChildName.Contains("head") || lowerChildName.Contains("face") || lowerChildName.Contains("lian"))
{
Debug.Log(fbx.name);
Debug.Log(lowerChildName);
one.shadowCastingMode = ShadowCastingMode.Off;
Debug.Log(one.shadowCastingMode);
}
}
AssetDatabase.SaveAssets();
}
var prefabs = Directory.GetFiles(folderPath, "*.prefab", SearchOption.AllDirectories);
foreach (var item in prefabs)
{
Transform prefab = AssetDatabase.LoadAssetAtPath<Transform>(item);
var renderers = prefab.GetComponentsInChildren<SkinnedMeshRenderer>();
foreach (var one in renderers)
{
string lowerChildName = one.transform.name.ToLower();
if (lowerChildName.Contains("head") || lowerChildName.Contains("face") || lowerChildName.Contains("lian"))
{
one.shadowCastingMode = ShadowCastingMode.Off;
}
}
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
}
}
[MenuItem("Assets/PackageTools/FindIncorrectShader", priority = 507)]
static void FindIncorrectShader()
{
Debug.Log("FindIncorrectShader");
var select = Selection.activeObject;
if (!select)
{
return;
}
var folderPath = AssetDatabase.GetAssetPath(select);
if (Directory.Exists(folderPath))
{
var mats = Directory.GetFiles(folderPath, "*.mat", SearchOption.AllDirectories);
foreach (var item in mats)
{
Material material = AssetDatabase.LoadAssetAtPath<Material>(item);
if (material.shader.ToString().IndexOf("PJAQ/Character/ToonV5")==-1)
{
Debug.Log(item.ToString());//
}
}
}
}