// Update is called once per frame void Update() { wasHeld = isHeld; isHeld = false; //clear out any touches we have claimed that no longer exist if (onlyPressingTouches) { for (int k = 0; k < claimedTouches.Count; k++) { if (!SinputTouchManager.TouchExists(claimedTouches[k])) { claimedTouches.RemoveAt(k); k--; } } } //detect touches bool canUseThisTouch = false; bool claimThisTouch = false; for (int i = 0; i < Input.touchCount; i++) { canUseThisTouch = false; claimThisTouch = false; if (!onlyPressingTouches) { canUseThisTouch = true; } if (onlyPressingTouches) { //if this touch is one we have already claimed, we can use it for (int k = 0; k < claimedTouches.Count; k++) { if (Input.touches[i].fingerId == claimedTouches[k]) { canUseThisTouch = true; } } //if this touch is a press and has not yet been claimed we can use it if (Input.touches[i].phase == TouchPhase.Began && !SinputTouchManager.IsClaimed(Input.touches[i].fingerId)) { canUseThisTouch = true; claimThisTouch = true; } } if (canUseThisTouch) { //see if this touch, touches this button Ray ray = Camera.main.ScreenPointToRay(Input.touches[i].position); if (touchCollider) { //test against a collider RaycastHit hit = new RaycastHit(); if (touchCollider.Raycast(ray, out hit, 9999f)) { isHeld = true; if (claimThisTouch) { SinputTouchManager.ClaimTouch(Input.touches[i].fingerId); claimedTouches.Add(Input.touches[i].fingerId); } } } else { //test against button plane within a radius float hitDistance = 0f; buttonPlane.SetNormalAndPosition(transform.forward, transform.position); if (buttonPlane.Raycast(ray, out hitDistance)) { if (Vector3.Distance(transform.position, ray.origin + ray.direction.normalized * hitDistance) < collisionRadius) { isHeld = true; if (claimThisTouch) { SinputTouchManager.ClaimTouch(Input.touches[i].fingerId); claimedTouches.Add(Input.touches[i].fingerId); } } } } } } //make it work with mouse for debug if (debugMouse) { if (Input.GetKey(KeyCode.Mouse0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (touchCollider) { RaycastHit hit = new RaycastHit(); if (touchCollider.Raycast(ray, out hit, 9999f)) { isHeld = true; } } else { float hitDistance = 0f; buttonPlane.SetNormalAndPosition(transform.forward, transform.position); if (buttonPlane.Raycast(ray, out hitDistance)) { if (Vector3.Distance(transform.position, ray.origin + ray.direction.normalized * hitDistance) < collisionRadius) { isHeld = true; } } } } } //update virtual input SinputSystems.VirtualInputs.SetVirtualButton(virtualInputID, isHeld); //make the button pretty spriteRenderer.color = Color.Lerp(spriteRenderer.color, color, Time.deltaTime * 10f); if (wasHeld != isHeld) { //change if (isHeld) { spriteRenderer.sprite = heldSprite; spriteRenderer.color = pressColor; labelContainer.localPosition = Vector3.zero; } else { spriteRenderer.sprite = releasedSprite; spriteRenderer.color = pressColor; //spriteRenderer.color = color; labelContainer.localPosition = labelOffset; } } }
// Update is called once per frame void Update() { //if we have a touch, make sure it's still there if (claimedTouch != -1) { bool stillExists = false; if (SinputTouchManager.TouchExists(claimedTouch)) { stillExists = true; } /*for (int i = 0; i < Input.touchCount; i++) { * if (Input.touches[i].fingerId == claimedTouch) stillExists = true; * }*/ if (debugMouse && claimedTouch == -2 && Input.GetKey("mouse 0")) { stillExists = true; } if (!stillExists) { claimedTouch = -1; } } //lets find a touch press if we don't have a touch yet if (claimedTouch == -1) { for (int i = 0; i < Input.touchCount; i++) { if (claimedTouch == -1 && Input.touches[i].phase == TouchPhase.Began && !SinputTouchManager.IsClaimed(Input.touches[i].fingerId)) { //this touch press is free, but does it touch the stick? Vector3 hitPoint = Vector3.zero; if (TouchCollision(Input.touches[i].position, out hitPoint, !followTouch)) { if (followTouch) { transform.position = hitPoint; } claimedTouch = Input.touches[i].fingerId; SinputTouchManager.ClaimTouch(claimedTouch); touchOrigin = transform.InverseTransformPoint(hitPoint); } } } if (debugMouse && claimedTouch == -1 && Input.GetKeyDown("mouse 0")) { Vector3 hitPoint = Vector3.zero; if (TouchCollision(Input.mousePosition, out hitPoint, !followTouch)) { if (followTouch) { transform.position = hitPoint; } claimedTouch = -2; SinputTouchManager.ClaimTouch(claimedTouch); touchOrigin = transform.InverseTransformPoint(hitPoint); } } } if (claimedTouch != -1) { //still touching, work out distance from the origin (in local space) and that's our stick value Vector3 touchPosition = touchOrigin; for (int i = 0; i < Input.touchCount; i++) { if (claimedTouch == Input.touches[i].fingerId) { //this is our touch Vector3 hitPoint = Vector3.zero; if (TouchCollision(Input.touches[i].position, out hitPoint, false)) { touchPosition = hitPoint; } } } if (debugMouse && claimedTouch == -2) { Vector3 hitPoint = Vector3.zero; if (TouchCollision(Input.mousePosition, out hitPoint, false)) { touchPosition = hitPoint; } } stickInputVector = transform.InverseTransformPoint(touchPosition) - touchOrigin; stickInputVector *= rangeFactor; if (stickInputVector.magnitude > 1f) { stickInputVector.Normalize(); if (followTouch) { transform.position = touchPosition - transform.right * (stickInputVector.x * stickRange) - transform.up * (stickInputVector.y * stickRange); touchOrigin = Vector3.zero; } } } else { stickInputVector = Vector3.zero; } //set virtual input values now if (virtualInputID_UP != "") { VirtualInputs.SetVirtualAxis(virtualInputID_UP, Mathf.Clamp(stickInputVector.y, 0f, 1f)); } if (virtualInputID_DOWN != "") { VirtualInputs.SetVirtualAxis(virtualInputID_DOWN, Mathf.Clamp(stickInputVector.y * -1f, 0f, 1f)); } if (virtualInputID_RIGHT != "") { VirtualInputs.SetVirtualAxis(virtualInputID_RIGHT, Mathf.Clamp(stickInputVector.x, 0f, 1f)); } if (virtualInputID_LEFT != "") { VirtualInputs.SetVirtualAxis(virtualInputID_LEFT, Mathf.Clamp(stickInputVector.x * -1f, 0f, 1f)); } //animate stick stickTopTransform.localPosition = stickInputVector * stickRange; if (claimedTouch == -1) { fade -= Time.deltaTime; if (followTouch) { fade = Mathf.Clamp(fade, 0.05f, 1f); } else { fade = Mathf.Clamp(fade, 0.5f, 1f); } } else { fade += Time.deltaTime; fade = Mathf.Clamp(fade, 0f, 1f); } Color col = stickBase.color; col.a = fade; stickBase.color = col; col = stickTop.color; col.a = fade; stickTop.color = col; }