枚举检视器面板显示
代码:
public enum Profession
{
Warrior=0,
Wizard
}
public Profession Pro; //在类中声明
小齿轮增加回调函数
点击控制台输出:
代码:
[ContextMenu("输出攻防比")]
public void PrintADProportion()
{
Debug.Log("当前角色的攻防比:"+(Num.Atk / Num.Def));
} //Num的声明参考前文代码,其中Atk及Def类型更改为float
为某个成员变量添加右键菜单
点击控制台输出:
代码:
//给一个成员变量添加右键菜单
//第一个参数是菜单的名称
//第二个参数是右键点击的回调函数
[ContextMenuItem("输出国家", "OutCountry")]
[Tooltip("右键看看")]
public string Country;
public void OutCountry()
{
Debug.Log(Country);
}
[RequireComponent(typeof(BoxCollider))]
//关于类型和类名
//BoxCollider:是类名,适用于函数提供泛型方法
//typeof(BoxCollider):System.Type,C#的类型,适用于函数需要System.Type参数
//当前组件依赖于盒子碰撞体
//当前组件挂载在对象上时,盒子碰撞体会一起被添加上去
//当Player(当前脚本的名字)组件没有被移除时,盒子碰撞体不能被删除
[RequireComponent(typeof(BoxCollider))]
[ExecuteInEditMode]
//使生命周期函数,在编辑器状态下可以执行,游戏中也可以正常使用
[ExecuteInEditMode]
public class Player : MonoBehaviour
{
void Update()
{
Debug.Log("Update");
}
}
[AddComponentMenu("paramsName",intNum)]
代码:
//将Player(指定脚本的名字)组件添加到AddComponent上
//第一个参数:分类名/组件名
//第二个参数:列表中显示的顺序
[AddComponentMenu("自定义控制器/玩家控制器",1)]
检视器高级修改(外挂式编程)
项目中建立Editor目录
Editor目录下建立外挂式开发脚本
将编辑器脚本与原始脚本关联
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//步骤1:引入编辑器的命名空间,检视器属于编辑器开发
using UnityEditor;
[CustomEditor(typeof(Player))]//步骤3:将编辑器开发脚本与需要编辑的组件脚本建立外挂关联关系
//外挂脚本因为存储在Editor目录下,所以不会被打入最终的游戏包
//不继承自Mono,而是继承自Editor
public class PlayerEditor : Editor //步骤2:继承Editor类,使用编辑器相关的成员变量和生命周期函数
{
}
创建菜单
参考TestMenu脚本
创建窗口
TestWindow脚本
编辑器工具实现分析
场景布置,Tool场景
点击点预制体制作
脚本挂载Plane,存储点击点,Update绘制点位增加时的两个点之间的线
组件扩展类NodeManagerEditor
OnInspectorGUI绘制列表和按钮
OnSceneGUI实现点击场景后,位置点生成
位置点由HandleUtility.GUIPointToWorldRay发出射线计算问题,创建新的对象后,编辑状态会被取消,原因,新创建的对象,会占据Inspector面板,此问题有弹窗的Update,一直选中对象。
删除按钮实现NodeManager下List内数据删除
Destroy会等当前帧执行完后,删除GameObject
DestroyImmediate会直接删除对象,不安全,有可能后续有代码处理逻辑编辑器下,对象没有脚本,生命周期函数不会运行,可以直接使用第二个API删除对象和列表中的数据
NodeWindow窗口实现
创建窗口时,需要将Plane对象传递过来,保证Update可以一直选中Plane,Update()实现一直选中Plane物体。
异或位运算
相同为零,不同为一
A与B异或得到C,那么
B与C异或,可再次获得A
A与C异或,可再次获得B
所以如果A是明文,B是密钥,C就是密文,使用异或实现的算法,可以将C密文利用B密钥,解出A即原始文字。
该系列专栏为网课课程笔记,仅用于学习参考。