最近見た非常に小説ロッカーを押すと、それは、この揺れのビットを行うために自分自身をテストし、プレス位置に表示され、時間がかかるドラッグ、ロッカー全体に一定の距離にそれらに続くだろうポール
まずは、私のロッカーのプリセット構造について話しましょう
どこでコードがハングアップする問題ではない、キーは、私は、コードの検索に対応するゲームオブジェクトをドラッグしたりすることができpubliceを書いたかを知ることです
時間によってコードは、これらに表示されます
公共のゲームオブジェクトrockerOnOff。
公共のゲームオブジェクトrockerStick。
公共のゲームオブジェクトrockerFather。
公共のゲームオブジェクトrockerControlGo。
RockerPositionは私の中に、この絵では、時間帯制御ロッカーを活性化するために午前、この写真は、私は透明度が0になった設定で、実際に絵なので、見ることができません
rockerOnOffシーンのロッカーがあるので、ロッカーは、実際には通常、不活性化状態でロッカーが、ちょうどRockerPosition範囲内の画像をクリックして、それが、アクティブになります
ロッカーレバーが移動されrockerStick、rockerStickのうち、公衆に追加
rockerFatherは公共の外に、必要となるため、移動体の位置の後ろに、シーンRockerPositionを追加します
さて、次のステップは、コードです
UnityEngine使用して、 使用UnityEngine.EventSystems; パブリッククラスBarGroundMove:MonoBehaviour、IPointerDownHandler、IPointerUpHandler、 IDragHandler { 公共rockerOnOffゲームオブジェクト; // 制御ロッカースイッチ パブリックrockerStickゲームオブジェクトを、 // 揺動レバー パブリックrockerFatherゲームオブジェクトを、 // ロッカー親 ゲームオブジェクトrockerControlGo公開; //はジョイスティック制御が所望されるオブジェクト フロートRADIUS = 50 ; // 距離ロッカーバーとロッカーベースマップ ベクトル2 dirV2; のVector3 dirV3。 (PointerEventData EVENTDATA)のボイドOnPointerDown公共 //は、イベント機能IPointerDownHandlerインターフェース生成]をクリックし 、{ (rockerOnOff.SetActive trueにする); // ロッカーがアクティブになります時にクリックし ベクトル2 localPosを; // このAPI:パブリック静的ブールScreenPointToLocalPointInRectangle(RectTransform RECT、ベクトル2 screenPointは、カメラCAM、OUTベクトル2 localPoint); // RectTransform AS rockerFather.transform、ローカル座標rockerFatherの親クラス // このイベントがトリガポイントeventData.position座標 // eventData.pressEventCameraこのイベントがトリガされたときにカメラ // OUT localPosこのパラメータは、ベクトル2の相対座標RectTransform四角形であります RectTransformUtility.ScreenPointToLocalPointInRectangle( RectTransform、AS rockerFather.transform eventData.position、 eventData.pressEventCamera、 OUT localPos ); rockerOnOff.transform.localPosition = localPos; // 起動ロッカー位置である位置の相対rockerFather } 公共ボイドondrag(PointerEventData eventDataA ) // ドラッグイベントIDragHandlerインタフェース生成機能 { ベクトル2 localPos; // ロッカーのドラッグ位置に対して RectTransformUtility.ScreenPointToLocalPointInRectangle( rockerOnOff.transform AS RectTransform、 eventData.position、 eventData.pressEventCamera、 OUT localPos ); ベクトル2 groundPos; // ロッカー親クラスのドラッグ位置に対して RectTransformUtility.ScreenPointToLocalPointInRectangle( RectTransform、AS rockerFather.transform eventData.position、 eventData.pressEventCamera、 OUT groundPos ); //ロッド反対を取得しますベクタージョイスティックは、単語全体がrockerOnOff.transform.localPositioされたライト- Vecter2.zero(ロッド、親クラスに対応するロッカーはローカル座標である(0、0 )) ベクトル2 GRV2 = rockerOnOff.transform.localPosition; dirV2 = localPos.normalized; // これは、ドラッグ、次の計算の移動利便性を記録することによって得られた単位ベクトルであり、 IF(localPos.magnitude> RADIUS)// 長さは、ロッカーの全体の動き続くロッドの半径よりも大きい場合 、{ rockerOnOffを.transform.localPosition =(GRV2 - groundPos)* RADIUS + .normalized groundPos; rockerStick.transform.localPosition = localPos.normalized * RADIUS; } そうでなければ { rockerStick.transform.localPosition = localPos; } } 公共ボイドOnPointerUp(PointerEventData eventDataA) / / リリースイベントインタフェース生成機能IPointerUpHandler { rockerStick.transform.localPosition = Vector3.zero; dirV2 = Vector2.Zero; // これは上昇時間である次のオブジェクトは、ベクトルに従って移動させることができないように、単位ベクトルは、0に設定されている (rockerOnOff.SetActive はfalse ;) } ボイド開始() { } (Updateを無効) { dirV3.x = dirV2.x; dirV3.z = dirV2.y; dirV3.y = 0 ; rockerControlGo.transform.Translate(新しい新規のVector3(0、0、* dirV3.magnitude * Time.deltaTime 2 .5f)); IF(dirV3 =!Vector3.zero) { rockerControlGo.transform.rotation = Quaternion.Lerp(rockerControlGo.transform.rotation、Quaternion.LookRotation(dirV3)、0 .05f)。 } } }