版本: Unity 6 (6000.0)
语言英语
  • C#

Handles.FreeMoveHandle

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。尽管我们无法采纳所有提交内容,但我们确实会阅读用户提出的每个建议更改,并在适用情况下进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public static Vector3 FreeMoveHandle(Vector3 position, float size, Vector3 snap, Handles.CapFunction capFunction);

声明

public static Vector3 FreeMoveHandle(int controlID, Vector3 position, float size, Vector3 snap, Handles.CapFunction capFunction);

参数

position 句柄在 Handles.matrix 空间中的位置。
size 句柄在 Handles.matrix 空间中的大小。如果您想要恒定的屏幕空间大小,请使用 HandleUtility.GetHandleSize
snap 所有轴上的捕捉增量。请参阅 Handles.SnapValue
capFunction 用于执行实际绘制的函数。
controlID 句柄的控制 ID。

返回值

Vector3 用户与句柄交互修改后的新值。如果用户未移动句柄,则将返回与传递给函数的值相同的值。

描述

创建一个不受约束的移动句柄。

此句柄可以在所有方向上自由移动。按住 Ctrl(macOS 上为 Cmd)键以捕捉到网格(请参阅 PositioningGameObjects)。按住 Ctrl-Shift(macOS 上为 Cmd-Shift)键以将对象捕捉到鼠标指针下方的任何碰撞体表面。


场景视图中的自由移动句柄。

将以下脚本添加到您的 Assets 文件夹中,命名为 FreeMoveHandleExample.cs,并将 FreeMoveHandleExample 组件添加到场景中的某个对象。

using UnityEngine;

[ExecuteInEditMode] public class FreeMoveHandleExample : MonoBehaviour { public Vector3 targetPosition { get { return m_TargetPosition; } set { m_TargetPosition = value; } } [SerializeField] private Vector3 m_TargetPosition = new Vector3(1f, 0f, 2f);

public virtual void Update() { transform.LookAt(m_TargetPosition); } }

将以下脚本添加到 Assets/Editor 中,命名为 FreeMoveHandleExampleEditor.cs,并选择具有 FreeMoveHandleExample 组件的对象。

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(FreeMoveHandleExample)), CanEditMultipleObjects] public class FreeMoveHandleExampleEditor : Editor { protected virtual void OnSceneGUI() { FreeMoveHandleExample example = (FreeMoveHandleExample)target;

float size = HandleUtility.GetHandleSize(example.targetPosition) * 0.5f; Vector3 snap = Vector3.one * 0.5f;

EditorGUI.BeginChangeCheck(); Vector3 newTargetPosition = Handles.FreeMoveHandle(example.targetPosition, size, snap, Handles.RectangleHandleCap); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(example, "Change Look At Target Position"); example.targetPosition = newTargetPosition; example.Update(); } } }