用于在场景视图中编辑多轴角运动限制的复合句柄的类。
场景视图中的 JointAngularLimitHandle。
DrawHandle 方法渲染的形状假设角限制首先沿 x 轴应用,然后沿 y 轴应用,最后沿 z 轴应用。
以下组件定义了要在运行时添加的 CharacterJoint 的角限制。
using UnityEngine;
public class JointExample : MonoBehaviour { public float xMin { get { return m_XMin; } set { m_XMin = value; } } [SerializeField] float m_XMin = -45f;
public float xMax { get { return m_XMax; } set { m_XMax = value; } } [SerializeField] float m_XMax = 45f;
public float yMax { get { return m_YMax; } set { m_YMax = value; } } [SerializeField] float m_YMax = 45f;
public float zMax { get { return m_ZMax; } set { m_ZMax = value; } } [SerializeField] float m_ZMax = 45f;
protected virtual void Start() { var joint = gameObject.AddComponent<CharacterJoint>();
var limit = joint.lowTwistLimit; limit.limit = m_XMin; joint.lowTwistLimit = limit;
limit = joint.highTwistLimit; limit.limit = m_XMax; joint.highTwistLimit = limit;
limit = joint.swing1Limit; limit.limit = m_YMax; joint.swing1Limit = limit;
limit = joint.swing2Limit; limit.limit = m_ZMax; joint.swing2Limit = limit; } }
以下自定义编辑器示例允许您在场景视图中编辑序列化角限制。
using UnityEditor; using UnityEditor.IMGUI.Controls; using UnityEngine;
[CustomEditor(typeof(JointExample)), CanEditMultipleObjects] public class JointExampleEditor : Editor { JointAngularLimitHandle m_Handle = new JointAngularLimitHandle();
// the OnSceneGUI callback uses the Scene view camera for drawing handles by default protected virtual void OnSceneGUI() { var jointExample = (JointExample)target;
// copy the target object's data to the handle m_Handle.xMin = jointExample.xMin; m_Handle.xMax = jointExample.xMax;
// CharacterJoint and ConfigurableJoint implement y- and z-axes symmetrically m_Handle.yMin = -jointExample.yMax; m_Handle.yMax = jointExample.yMax;
m_Handle.zMin = -jointExample.zMax; m_Handle.zMax = jointExample.zMax;
// set the handle matrix to match the object's position/rotation with a uniform scale Matrix4x4 handleMatrix = Matrix4x4.TRS( jointExample.transform.position, jointExample.transform.rotation, Vector3.one );
EditorGUI.BeginChangeCheck();
using (new Handles.DrawingScope(handleMatrix)) { // maintain a constant screen-space size for the handle's radius based on the origin of the handle matrix m_Handle.radius = HandleUtility.GetHandleSize(Vector3.zero);
// draw the handle EditorGUI.BeginChangeCheck(); m_Handle.DrawHandle(); if (EditorGUI.EndChangeCheck()) { // record the target object before setting new values so changes can be undone/redone Undo.RecordObject(jointExample, "Change Joint Example Properties");
// copy the handle's updated data back to the target object jointExample.xMin = m_Handle.xMin; jointExample.xMax = m_Handle.xMax;
jointExample.yMax = m_Handle.yMax == jointExample.yMax ? -m_Handle.yMin : m_Handle.yMax;
jointExample.zMax = m_Handle.zMax == jointExample.zMax ? -m_Handle.zMin : m_Handle.zMax; } } } }
angleHandleDrawFunction | 显示角度控制句柄时要使用的 CapFunction。 |
angleHandleSizeFunction | 用于指定角度控制句柄大小的 SizeFunction。 |
fillAlpha | 返回或指定在渲染每个轴的运动范围的填充形状时要使用的透明度。默认为 0.1。 |
radius | 返回或指定句柄弧的半径。默认为 1.0。 |
wireframeAlpha | 返回或指定用于运动弧外侧的弯曲线条的透明度。默认为 1.0。 |
xHandleColor | 返回或指定用于限制围绕 x 轴运动的句柄的颜色。默认为 Handles.xAxisColor。 |
xMax | 返回或指定围绕 x 轴的最大角运动。 |
xMin | 返回或指定围绕 x 轴的最小角运动。 |
xMotion | 返回或指定如何限制围绕 x 轴的角运动。默认为 ConfigurableJointMotion.Limited。 |
xRange | 返回或指定围绕 x 轴的角运动的有效值范围。默认为 [-180.0, 180.0]。 |
yHandleColor | 返回或指定用于限制围绕 y 轴运动的句柄的颜色。默认为 Handles.yAxisColor。 |
yMax | 返回或指定围绕 y 轴的最大角运动。 |
yMin | 返回或指定围绕 y 轴的最小角运动。 |
yMotion | 返回或指定如何限制围绕 y 轴的角运动。默认为 ConfigurableJointMotion.Limited。 |
yRange | 返回或指定围绕 y 轴的角运动的有效值范围。默认为 [-180.0, 180.0]。 |
zHandleColor | 返回或指定用于限制围绕 z 轴运动的句柄的颜色。默认为 Handles.zAxisColor。 |
zMax | 返回或指定围绕 z 轴的最大角运动。 |
zMin | 返回或指定围绕 z 轴的最小角运动。 |
zMotion | 返回或指定如何限制围绕 z 轴的角运动。默认为 ConfigurableJointMotion.Limited。 |
zRange | 返回或指定围绕 z 轴的角运动的有效值范围。默认为 [-180.0, 180.0]。 |
JointAngularLimitHandle | 创建 JointAngularLimitHandle 类的新的实例。 |
DrawHandle | 一个函数,使用其当前配置在当前句柄相机中显示此实例。 |