public SGTouchController(Camera camera, LayerMask[] sortinglayerMasks, string chainClickName = "") { _touchOverUGUI = new SGTouchOverUGUI(); _touchOverUGUI.Initial(); _touchRaycast2D = new SGTouchRayCast2D(camera, sortinglayerMasks); _touchCovers = new SGTouchCover[MAX_TOUCH_COUNT]; for (var i = 0; i < MAX_TOUCH_COUNT; ++i) { _touchCovers[i] = new SGTouchCover(); } _isPause = false; _chainClickName = chainClickName; }
private void ProcessTouchCover(SGTouchCover touchCover) { if (_touchOverUGUI.IsTouchedOverUGUI(touchCover.Position)) { touchCover.Reset(); return; } if (_touchRaycast2D.TryGetRaycast2DObject(touchCover, out var hit2dObj)) { switch (touchCover.Phase) { case SGTouchPhase.Began: { touchCover.SetInstanceId(hit2dObj.GetInstanceID()); _onTouchBegan?.Invoke(touchCover); } break; case SGTouchPhase.Stationary: { if (touchCover.IsTouched(hit2dObj.GetInstanceID()) || IsPolygonCollider(hit2dObj, _chainClickName)) // 按住连续点击 { _onTouchStationary?.Invoke(touchCover); } else { TouchEnd(touchCover); } } break; case SGTouchPhase.End: { TouchEnd(touchCover); } break; } } else { TouchEnd(touchCover); } }
public bool TryGetRaycast2DObject(SGTouchCover touchCover, out GameObject hit2dObj) { hit2dObj = null; _screenPointToRay = _camera.ScreenPointToRay(touchCover.Position); var n = _sortinglayerMasks.Length; for (var i = 0; i < n; ++i) { if (Physics2D.GetRayIntersectionNonAlloc(_screenPointToRay, _raycastHit2Ds, raycastDistance, _sortinglayerMasks[i]) > 0) { hit2dObj = _raycastHit2Ds[0].collider.gameObject; return(true); } } return(false); }
private void TouchEnd(SGTouchCover touchCover) { _onTouchEnd?.Invoke(touchCover); touchCover.Reset(); }