一.如何将插件中的世界轴变为本地轴向
1.首先找到抽象类Gizmo 添加一个参数 和一个方法
private bool _localTransform;
public bool LocalTransform
{
get { return _localTransform; }
set
{
_localTransform = value;
}
}
public void SetGizmoLocalAxes(bool Islocal)
{
List<GameObject> topParents = GetParentsFromControlledObjects(true);
if (Islocal&&topParents.Count > 0)
{
_gizmoTransform.right = topParents[0].transform.right;
_gizmoTransform.up = topParents[0].transform.up;
_gizmoTransform.forward = topParents[0].transform.forward;
}
else
{
_gizmoTransform.right = Vector3.right;
_gizmoTransform.up = Vector3.up;
_gizmoTransform.forward = Vector3.forward;
}
}
2.找到TranslationGizmoInspectorGUI类添加gui显示项,让它能够在面板显示出来
newBoolValue = EditorGUILayout.ToggleLeft("LocalTransform", _translationGizmo.LocalTransform);
if (newBoolValue != _translationGizmo.LocalTransform)
{
UnityEditorUndoHelper.RecordObjectForInspectorPropertyChange(_translationGizmo);
_translationGizmo.LocalTransform = newBoolValue;
}
3.最后一步 还是在Gizmo 类中找到 protected int[] GetSortedGizmoAxesIndices()这个方法,
把上面刚刚写的SetGizmoLocalAxes方法引用到这个方法里,写在第一行
protected int[] GetSortedGizmoAxesIndices()
{
SetGizmoLocalAxes(_localTransform);
//下面代码不变
}
这样就ok了
二. 点击ui能够选中物体
一般场景ui脚本绑定一个物体,需要点击ui自动选中物体,包括插件的轴和框选范围shader,
(1)第一种方法
使用插件给的固有方法
//先清除再增加
FindObjectOfType<EditorObjectSelection>().ClearSelection(true);
FindObjectOfType<EditorObjectSelection>().AddObjectToSelection(gameObject, true);
(2)第二种方法
我们只需要修改EditorObjectSelection场景中 OnInputDeviceFirstButtonDown方法
//增加一个参数就可以了 ,私有变公有
public void OnInputDeviceFirstButtonDown(GameObject AddSelect=null)
{
}
最后试一试吧,在UI里调用这个函数
//成功了就给我点个赞吧
FindObjectOfType<EditorObjectSelection().OnInputDeviceFirstButtonDown(gameObject);
三 物体的移动旋转 缩放变化
继承IRTEditorEventListener接口实现
四 监听撤销/重做操作
如果开启撤销/重做功能,想要监听时继承IMessageListener接口
//重做
MessageListenerDatabase.Instance.RegisterListenerForMessage(MessageType.GizmoTransformOperationWasRedone, this);
//撤销
MessageListenerDatabase.Instance.RegisterListenerForMessage(MessageType.GizmoTransformOperationWasUndone, this);
五 轴的开始,持续和结束拖拽阶段 事件
public class NodeGeneration : MonoBehaviour{
public virtual void GizmoTransformDragStart(Gizmo gizmo)
{
}
public virtual void GizmoTransforDragUpdate(Gizmo gizmo)
{
}
public virtual void GizmoTransformDragEnd(Gizmo gizmo)
{
}
public virtual void GizmoRotateDragStart(Gizmo gizmo)
{
}
public virtual void GizmoRotateDragUpdate(Gizmo gizmo)
{
}
public virtual void GizmoRotateDragEnd(Gizmo gizmo)
{
}
}
private List<NodeGeneration> modelSelectEvents = new List<NodeGeneration>();
public TranslationGizmo translationGizmo;
public RotationGizmo rotateGizmo;
void Start()
{
FindObjectOfType<EditorObjectSelection>().SelectionChanged += (tr) => {
if (tr.SelectedObjects.Count == 0)
{
}
else
{
for (int i = 0; i < modelSelectEvents.Count; i++)
{
translationGizmo.GizmoDragStart -= modelSelectEvents[i].GizmoTransformDragStart;
translationGizmo.GizmoDragUpdate -= modelSelectEvents[i].GizmoTransforDragUpdate;
translationGizmo.GizmoDragEnd -= modelSelectEvents[i].GizmoTransformDragEnd;
rotateGizmo.GizmoDragStart -= modelSelectEvents[i].GizmoRotateDragStart;
rotateGizmo.GizmoDragUpdate -= modelSelectEvents[i].GizmoRotateDragUpdate;
rotateGizmo.GizmoDragEnd -= modelSelectEvents[i].GizmoRotateDragEnd;
}
modelSelectEvents.Clear();
var selelist = FindObjectOfType<EditorObjectSelection>().SelectedGameObjects;
foreach (var sele in selelist)
{
var iteml = sele.GetComponent<NodeGeneration>();
if (iteml && translationGizmo && rotateGizmo)
{
translationGizmo.GizmoDragStart += iteml.GizmoTransformDragStart;
translationGizmo.GizmoDragUpdate += iteml.GizmoTransforDragUpdate;
translationGizmo.GizmoDragEnd += iteml.GizmoTransformDragEnd;
rotateGizmo.GizmoDragStart += iteml.GizmoRotateDragStart;
rotateGizmo.GizmoDragUpdate += iteml.GizmoRotateDragUpdate;
rotateGizmo.GizmoDragEnd += iteml.GizmoRotateDragEnd;
modelSelectEvents.Add(iteml);
}
}
}
};
}
六 物体选中事件
FindObjectOfType<EditorObjectSelection>().SelectionChanged +=(tr)=>{}
七 改变轴类型 Translate rotation scale…
FindObjectOfType<EditorGizmoSystem>().ChangeActiveGizmo(GizmoType.Rotation);
FindObjectOfType<EditorGizmoSystem>().ChangeActiveGizmo(GizmoType.Translation);