private void Start() { cameraControllerEventTrigger = this.GetComponent <ObservableEventTrigger>(); #if UNITY_EDITOR || UNITY_STANDALONE_OSX || UNITY_STANDALONE_WIN this.UpdateAsObservable() .Where(x => Input.GetMouseButtonUp(0)) .Subscribe(x => { isDraging = false; }); cameraControllerEventTrigger.OnDragAsObservable() .Subscribe(pointerEventData => onDrag(pointerEventData)); #elif UNITY_IOS || UNITY_ANDROID cameraControllerEventTrigger.OnPointerDownAsObservable() .Subscribe(pointerEventData => OnPointerDownValidation(pointerEventData)); cameraControllerEventTrigger.OnDragAsObservable() .Subscribe(pointerEventData => onDrag(pointerEventData)); cameraControllerEventTrigger.OnPointerUpAsObservable() .Where(_ => isPointerUp()) .Subscribe(_ => { InitCameraMoveController(); }); this.UpdateAsObservable() .Where(x => isNoPointer()) .Subscribe(x => { isDraging = false; }); #endif }
void OnEnable() { // XXX: Consider switching to Observable{Begin,,End}DragTrigger. eventTrigger .OnBeginDragAsObservable() .TakeUntilDisable(this) .Where(eventData => eventData.pointerDrag.gameObject == this.gameObject) .Select(eventData => eventData.position) .Subscribe(position => { this.beginPosition = position; this.beginTime = DateTime.Now; }); OnDragRelative = eventTrigger .OnDragAsObservable() .TakeUntilDisable(this) .Where(eventData => eventData.pointerDrag.gameObject == this.gameObject) .Select(eventData => eventData.delta); onEndDragObservable = eventTrigger .OnEndDragAsObservable() .TakeUntilDisable(this); OnSwipeLeft = OnSwipe(MoveDirection.Left); OnSwipeRight = OnSwipe(MoveDirection.Right); OnSwipeUp = OnSwipe(MoveDirection.Up); OnSwipeDown = OnSwipe(MoveDirection.Down); }
void Start() { var gunUnitUI = GetComponent <GunUnitUI>(); // 親CanvasのRectTransformを基準に利用する var rectTransform = transform.root.gameObject.GetComponent <RectTransform>(); // RectTransformUtility.ScreenPointToLocalPointInRectangle用使い捨て変数 var tmpPosition = Vector2.zero; // get the position of parent's top-left corner in world space // i guess it only work when canvas use Screen space - Overlay mode var selfRect = GetComponent <RectTransform>(); var parentRect = transform.parent.GetComponent <RectTransform>(); // FIXME: i don't know why all the rect's property will be 0... // var anchorPosition = parentRect.TransformPoint(0, parentRect.rect.height, 0); var anchorPosition = parentRect.TransformPoint(0, 400, 0); Debug.Log(anchorPosition); // ObservableEventTriggerをオブジェクトに追加 ObservableEventTrigger trigger = GetComponent <ObservableEventTrigger>(); // Dragイベントの登録 trigger.OnDragAsObservable() // 発生するたびにマウスポジションを取得する。 .Select(_ => Input.mousePosition - anchorPosition) // ただしInput.mousePositionはWorld座標なのでそのままでは使えない。親CanvasのUI座標に変換する。 // .Select(mousePosition => // { // // ※注: 親CanvasのRender ModeをScreen Space Cameraにしている場合はこれでよいが、Screen Space Overlayの場合はまた別の記述になる。 // // http://tsubakit1.hateblo.jp/entry/2016/03/01/020510 を参照。 // // RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, mousePosition, Camera.main, out tmpPosition); // // return tmpPosition // return mousePosition - new Vector3(188, 508); // anchor position // }) // ついでにログを取ってみる .Do(position => Debug.Log(string.Format("[Drag]Input.mousePosition.x: {0}, Input.mousePosition.y: {1}, Canvas.LocalPosition.x: {2}, Canvas.LocalPosition.y: {3}", Input.mousePosition.x, Input.mousePosition.y, position.x, position.y))) // 自分の位置をマウスのUI座標に。 // .Subscribe(position => transform.localPosition = position) .Subscribe(position => selfRect.anchoredPosition = position) // 自分が破壊されたらイベントも終了。 .AddTo(this); // Drag終了イベント(つまりDrop)の登録 trigger.OnEndDragAsObservable() // 発生したらマウスポジションを取得する。 .Select(_ => Input.mousePosition) .Select(mousePosition => { RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, mousePosition, Camera.main, out tmpPosition); return(tmpPosition); }) // ドロップされたらログを追加 .Subscribe(position => Debug.Log(string.Format("[Drop]Input.mousePosition.x: {0}, Input.mousePosition.y: {1}, Canvas.LocalPosition.x: {2}, Canvas.LocalPosition.y: {3}", Input.mousePosition.x, Input.mousePosition.y, position.x, position.y))) // 自分が破壊されたらイベントも終了。 .AddTo(this); }
public override void OnEnter() { eventTrigger.OnDragAsObservable() .TakeUntil(eventTrigger.OnEndDragAsObservable()) .TakeUntilDestroy(target) .Subscribe(eventData => { dragPosition = mainCamera.ScreenToWorldPoint(eventData.position); target.transform.position = Vector2.Lerp(target.transform.position, dragPosition + startPosition, DragMultiplier); }, () => { Finish(); }); }
//----- property ----- //----- method ----- void OnEnable() { eventTrigger = UnityUtility.GetOrAddComponent <ObservableEventTrigger>(gameObject); eventTrigger .OnBeginDragAsObservable() .TakeUntilDisable(this) .Where(eventData => eventData.pointerDrag.gameObject == gameObject) .Select(eventData => eventData.position) .Subscribe(position => { if (onDragStart != null) { onDragStart.OnNext(position); } }) .AddTo(this); eventTrigger .OnDragAsObservable() .TakeUntilDisable(this) .Where(eventData => eventData.pointerDrag.gameObject == gameObject) .Select(eventData => eventData.position) .Subscribe(position => { if (onDrag != null) { onDrag.OnNext(position); } }) .AddTo(this); eventTrigger .OnEndDragAsObservable() .TakeUntilDisable(this) .Where(eventData => eventData.pointerDrag.gameObject == gameObject) .Select(eventData => eventData.position) .Subscribe(position => { if (onDragEnd != null) { onDragEnd.OnNext(position); } }) .AddTo(this); }