unity3d Runtime Transform Gizmos 插件使用

一.如何将插件中的世界轴变为本地轴向

在这里插入图片描述
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);
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
runtime transform gizmos1.3.2unitypackage是一个运行时变换图形工具包。它是为Unity游戏引擎设计的,用于在运行时修改和显示游戏对象的位置、旋转和缩放。这个工具包提供了一些程序化的API接口和用户界面,使开发者可以在运行时动态地改变游戏对象的变换属性,从而实现一些复杂的交互效果。 这个工具包提供了一些常见的变换图形工具,比如平移工具、旋转工具和缩放工具。开发者可以将这些工具放置在游戏场景中,然后通过调用相应的API接口来使用它们。例如,开发者可以通过调用平移工具的API接口,来移动游戏对象的位置。类似地,通过调用旋转工具的API接口,开发者可以旋转游戏对象。这些操作在游戏进行的过程中是实时生效的,从而使开发者能够实时地查看和修改游戏对象的变换属性。 除了提供这些基本工具外,runtime transform gizmos1.3.2unitypackage还提供了一些高级功能。例如,它支持多选和组合变换,使开发者能够同时修改多个游戏对象的变换属性。此外,它还支持自定义变换图形,允许开发者创建自己的变换工具,并将其添加到工具包中。 总之,runtime transform gizmos1.3.2unitypackage是一个功能强大的运行时变换图形工具包,为Unity开发者提供了方便的方式来修改和显示游戏对象的变换属性。它可以帮助开发者实现各种复杂的交互效果,提升游戏的可玩性和用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值