// -- Sprオブジェクトの構築を行う public override ObjectIf Build() { PH1DJointIf jo = null; PHJointBehaviour b = (jointObject ? jointObject : gameObject).GetComponent <PHHingeJointBehaviour>(); if (!b) { b = (jointObject ? jointObject : gameObject).GetComponent <PHSliderJointBehavior>(); if (!b) { return(null); } } jo = b.sprObject as PH1DJointIf; if (jo == null) { return(null); } PH1DJointLimitIf lim = jo.CreateLimit((PH1DJointLimitDesc)desc); return(lim); }
// ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- // SprBehaviourの派生クラスで実装するメソッド // -- 全てのBuildが完了した後に行う処理を書く。オブジェクト同士をリンクするなど public override void Link() { // まず、このIKActuatorに付随する関節を探す。同じGameObjectに付いているはず PHJointBehaviour jo = gameObject.GetComponent <PHJointBehaviour>(); if (jo != null && jo.sprObject != null && sprObject != null) { // 次に、関節の親関節を探す。関節のソケット剛体を探し、それを基準に探す // (親関節 = この関節のソケット剛体をプラグ剛体として持つ関節) PHJointBehaviour joParent = null; var jos = jo.socket.GetComponentsInChildren <PHJointBehaviour>(); foreach (var j in jos) { if (j.plug == jo.socket) { joParent = j; break; } } if (joParent != null && jo != joParent) { // 親関節に付随するIKActuatorを親Actuatorとして登録する PHIKActuatorBehaviour act = joParent.GetComponent <PHIKActuatorBehaviour>(); if (act != null && act.sprObject != null && sprObject != act.sprObject) { act.sprObject.AddChildObject(sprObject); } } } }
// ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- // SprBehaviourの派生クラスで実装するメソッド // -- 全てのBuildが完了した後に行う処理を書く。オブジェクト同士をリンクするなど public override void Link() { // まず、このIKActuatorに付随する関節を探す。同じGameObjectに付いているはず PHJointBehaviour jo = gameObject.GetComponent <PHJointBehaviour>(); if (jo != null && jo.sprObject != null && sprObject != null) { // 次に、関節の親関節を探す。関節のソケット剛体を探し、それを基準に探す // (親関節 = この関節のソケット剛体をプラグ剛体として持つ関節) // 親関節にIKActuatorが付属していない場合は、親IKActuatorが見つかるまで関節ツリーをさかのぼって探す while (true) { PHJointBehaviour joParent = null; var jos = jo.socket.GetComponentsInChildren <PHJointBehaviour>(); foreach (var j in jos) { if (j.plug == jo.socket) { joParent = j; break; } } if (joParent != null && jo != joParent) { // 親関節に付随するIKActuatorを親Actuatorとして登録する PHIKActuatorBehaviour act = joParent.GetComponent <PHIKActuatorBehaviour>(); if (act != null && act.sprObject != null && sprObject != act.sprObject && act.isActiveAndEnabled) { act.sprObject.AddChildObject(sprObject); break; } if (act == null) { jo = joParent; continue; } if (act.sprObject == null) { Debug.LogWarning("sprObject of " + act.name + " is null."); break; } if (sprObject == act.sprObject) { Debug.LogWarning("this IKObject is same with parent actuator"); break; } } else { break; } } } }
public void OnSceneGUI() { PHJointBehaviour phJointBehaviour = (PHJointBehaviour)target; // ----- ----- ----- ----- ----- // Target Position Handle if (phJointBehaviour.showJointPoseHandle) { Tools.current = Tool.None; // <!!> この方式だと微小変化が常に発生してあまりUndoなどが機能しない Posed objectPose = phJointBehaviour.gameObject.transform.ToPosed(); Vector3 currJointPos = (objectPose * phJointBehaviour.jointPosition.ToVec3d()).ToVector3(); Quaternion currJointRot = phJointBehaviour.gameObject.transform.rotation * phJointBehaviour.jointOrientation; EditorGUI.BeginChangeCheck(); Vector3 handlePos = Handles.PositionHandle(currJointPos, phJointBehaviour.gameObject.transform.rotation); Quaternion handleRot = Handles.RotationHandle(currJointRot, currJointPos); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(phJointBehaviour, "Joint Pos/Rot Change"); phJointBehaviour.jointPosition = Quaternion.Inverse(phJointBehaviour.gameObject.transform.rotation) * (handlePos - phJointBehaviour.gameObject.transform.position); phJointBehaviour.jointOrientation = Quaternion.Inverse(phJointBehaviour.gameObject.transform.rotation) * handleRot; } } }
// -- 全てのBuildが完了した後に行う処理を書く。オブジェクト同士をリンクするなど public override void Link() { // まず、このTreeNodeに付随する関節を探す。同じGameObjectに付いているはず PHJointBehaviour jo = gameObject.GetComponent <PHJointBehaviour>(); if (jo != null && jo.sprObject != null) { // 次に、関節の親関節を探す。関節のソケット剛体を探し、それを基準に探す // (親関節 = この関節のソケット剛体をプラグ剛体として持つ関節) PHJointBehaviour joParent = null; var jos = jo.socket.GetComponentsInChildren <PHJointBehaviour>(); foreach (var j in jos) { if (j.plug == jo.socket) { joParent = j; break; } } PHTreeNodeBehaviour parentTreeNode = null; PHRootNodeBehaviour parentRootNode = null; if (joParent != null && jo != joParent) { // -- 親関節があった場合 parentTreeNode = joParent.GetComponent <PHTreeNodeBehaviour>(); parentRootNode = joParent.GetComponent <PHRootNodeBehaviour>(); if (parentTreeNode != null && parentTreeNode.isActiveAndEnabled) { // 親ノードを先に構築する if (parentTreeNode.sprObject == null) { parentTreeNode.Link(); } // その後、親TreeNodeに接続する形で自分のTreeNodeを作成する if (sprObject == null) { sprObject = phScene.CreateTreeNode(parentTreeNode.phTreeNode, jo.plug.GetComponent <PHSolidBehaviour>().phSolid); Debug.Log("CreateTreeNode[" + this.name + "] = Tree(" + parentTreeNode.name + ") <= Solid(" + jo.plug.name + ")"); phTreeNode.Enable(); } } else if (parentRootNode != null && parentRootNode.isActiveAndEnabled) { // 親ノードを先に構築する if (parentRootNode.sprObject == null) { parentRootNode.Link(); } // その後、親RootNodeに接続する形で自分のTreeNodeを作成する if (sprObject == null) { sprObject = phScene.CreateTreeNode(parentRootNode.phRootNode, jo.plug.GetComponent <PHSolidBehaviour>().phSolid); Debug.Log("CreateTreeNode[" + this.name + "] = Root(" + parentRootNode.name + ") <= Solid(" + jo.plug.name + ")"); phTreeNode.Enable(); } } else { Debug.LogError("No Parent Node for " + this.name); } } else { // -- 親関節がない場合:この関節のsocketにRootNodeがくっついているはず parentRootNode = jo.socket.GetComponent <PHRootNodeBehaviour>(); // 親ノードを先に構築する if (parentRootNode.sprObject == null) { parentRootNode.Link(); } // その後、親RootNodeに接続する形で自分のTreeNodeを作成する if (sprObject == null) { sprObject = phScene.CreateTreeNode(parentRootNode.phRootNode, jo.plug.GetComponent <PHSolidBehaviour>().phSolid); Debug.Log("CreateTreeNode[" + this.name + "] = Root(" + parentRootNode.name + ") <= Solid(" + jo.plug.name + ")"); phTreeNode.Enable(); } } } }