Advertisement
KpoKec

Mouse\Touchpad control (Tori)

Aug 23rd, 2017
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.43 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6.  
  7. public enum state {
  8.     move = 0,
  9.     rotation = 1,
  10.     setpoint = 2,
  11.     inside = 3,
  12.     scale = 4
  13. }
  14.  
  15. public class TouchScript : MonoBehaviour
  16. {
  17.     public LayerMask touchInputMask;
  18.     private Transform target = null;
  19.     private objectScript targetScript;
  20.     private Vector3 trim;
  21.     private float dist;
  22.     private state Stat;
  23.     private Vector3 startPos;
  24.  
  25.     public float SensevityScale = 0.001f;
  26.     private float rotationSpeed = 540f; // скорость вращения
  27.  
  28.     // ------------------------------------------
  29.     private bool _inside;
  30.  
  31.     public Text text;
  32.     public bool setPos;
  33.  
  34.     private void Start()
  35.     {
  36.         Stat = state.move;
  37.         text.text = Stat.ToString();
  38.     }
  39.     public void statesSwich(string str)
  40.     {
  41.         setPos = false;
  42.         if (str == "move")
  43.         {
  44.             Stat = state.move;
  45.         }
  46.         if (str == "rotate")
  47.         {
  48.             Stat = state.rotation;
  49.         }
  50.         if (str == "setpoint")
  51.         {
  52.             Stat = state.setpoint;
  53.             setPos = true;
  54.         }
  55.         if (str == "inside")
  56.         {
  57.             Stat = state.inside;
  58.             _inside = true;
  59.         }
  60.         if (str == "scale")
  61.         {
  62.             Stat = state.scale;
  63.         }
  64.         text.text = Stat.ToString();
  65.     }
  66.  
  67.     public void changeSens(float sens){
  68.         rotationSpeed = sens;
  69.         SensevityScale = sens;
  70.         text.text = "" + rotationSpeed;
  71.     }
  72.  
  73.     void OnMoveStart(Vector3 _pos)
  74.     {
  75.         Ray ray = Camera.main.ScreenPointToRay(_pos);
  76.         RaycastHit hit;
  77.         Debug.DrawRay(ray.origin, ray.direction * 100, Color.yellow);
  78.  
  79.         if (Physics.Raycast(ray, out hit, touchInputMask))
  80.         {
  81.             target = hit.transform;
  82.             dist = hit.distance;
  83.             trim = hit.collider.transform.position - hit.point;
  84.         }
  85.     }
  86.  
  87.     void OnMoveStay(Vector3 _pos)
  88.     {
  89.         if (!target) return;
  90.         Ray ray = Camera.main.ScreenPointToRay(_pos);
  91.         Vector3 pos = ray.origin + ray.direction * dist;
  92.         pos += trim;
  93.         target.position = pos;
  94.     }
  95.  
  96.     void OnMoveEnd(Vector3 _pos)
  97.     {
  98.         target = null;
  99.     }
  100.  
  101.     void OnRotateStart(Vector3 _pos)
  102.     {
  103.         Ray ray = Camera.main.ScreenPointToRay(_pos);
  104.         RaycastHit hit;
  105.         Debug.DrawRay(ray.origin, ray.direction * 100, Color.yellow);
  106.  
  107.         if (Physics.Raycast(ray, out hit, touchInputMask))
  108.         {
  109.             target = hit.transform;
  110.             startPos = _pos;
  111.         }
  112.     }
  113.  
  114.     void OnRotateStay(Vector3 _pos)
  115.     {
  116.         if (!target) return;
  117.         float dX = (_pos.x - startPos.x) / Screen.width;
  118.         float dY = (_pos.y - startPos.y) / Screen.height;
  119.         target.Rotate(Vector3.up, -dX * rotationSpeed, Space.World);
  120.         target.Rotate(Vector3.up, -dY * rotationSpeed, Space.World);
  121.         startPos = _pos;
  122.     }
  123.  
  124.     void OnRotateEnd(Vector3 _pos)
  125.     {
  126.         target = null;
  127.     }
  128.  
  129.     void OnZoomStart(Vector3 _pos1, Vector3 _pos2)
  130.     {
  131.         targetScript = (objectScript) FindObjectOfType(typeof(objectScript));
  132.         dist = (_pos1 - _pos2).magnitude;
  133.     }
  134.  
  135.     void OnZoomStay(Vector3 _pos1, Vector3 _pos2)
  136.     {
  137.         if (!targetScript) return;
  138.         float delta = dist - (_pos1 - _pos2).magnitude;
  139.         targetScript.Scale(delta * SensevityScale);
  140.     }
  141.  
  142.     void OnZoomEnd(Vector3 _pos1, Vector3 _pos2)
  143.     {
  144.         target = null;
  145.     }
  146.  
  147.     void Update()
  148.     {
  149. #if UNITY_EDITOR
  150.  
  151.         switch (Stat)
  152.         {
  153.             case state.move:
  154.  
  155.                 if (Input.GetMouseButtonDown(0))
  156.                     OnMoveStart(Input.mousePosition);
  157.                 if (Input.GetMouseButton(0) && !Input.GetMouseButtonDown(0))
  158.                     OnMoveStay(Input.mousePosition);
  159.                 if (!Input.GetMouseButton(0))
  160.                     OnMoveEnd(Vector3.zero);
  161.             break;
  162.  
  163.             //поворот
  164.             case state.rotation:
  165.  
  166.                 if (Input.GetMouseButtonDown(0))
  167.                     OnRotateStart(Input.mousePosition);
  168.                 if (Input.GetMouseButton(0) && !Input.GetMouseButtonDown(0))
  169.                     OnRotateStay(Input.mousePosition);
  170.                 if (!Input.GetMouseButton(0))
  171.                     OnRotateEnd(Vector3.zero);
  172.             break;
  173.  
  174.             case state.scale:
  175.  
  176.                 if (Input.GetAxis("Mouse ScrollWheel")!=0)
  177.                 {
  178.                     OnZoomStart(Vector3.left, Vector3.right);
  179.                     OnZoomStay(Vector3.left, Vector3.right * (1 + Input.GetAxis("Mouse ScrollWheel")) ); // типа двигаем правый тач
  180.                 }
  181.                 else
  182.                 {
  183.                     OnZoomEnd(Vector3.zero, Vector3.zero);
  184.                 }
  185.                 break;
  186.         }
  187. #endif
  188.  
  189.         switch (Stat)
  190.         {
  191.  
  192.             case state.move:
  193.  
  194.                 if (Input.touchCount == 1)
  195.                 {
  196.                     Touch touch = Input.GetTouch(0);
  197.                     if (touch.phase == TouchPhase.Began)
  198.                         OnMoveStart(touch.position);
  199.                     if (touch.phase == TouchPhase.Moved)
  200.                         OnMoveStay(touch.position);
  201.                     if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled)
  202.                         OnMoveEnd(touch.position);
  203.                 }
  204.                 break;
  205.             case state.rotation:
  206.  
  207.                 if (Input.touchCount == 1)
  208.                 {
  209.                     Touch touch = Input.GetTouch(0);
  210.                     if (touch.phase == TouchPhase.Began)
  211.                         OnRotateStart(touch.position);
  212.                     if (touch.phase == TouchPhase.Moved)
  213.                         OnRotateStay(touch.position);
  214.                     if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled)
  215.                         OnRotateEnd(touch.position);
  216.                 }
  217.                 break;
  218.             case state.scale:
  219.                 if (Input.touchCount == 2)
  220.                 {
  221.                     Touch touch1 = Input.GetTouch(0);
  222.                     Touch touch2 = Input.GetTouch(1);
  223.                     if (touch1.phase == TouchPhase.Began || touch2.phase == TouchPhase.Began)
  224.                         OnZoomStart(touch1.position, touch2.position);
  225.                     if ((touch1.phase == TouchPhase.Moved || touch1.phase == TouchPhase.Stationary) && // тач1 стоит или двигается
  226.                        (touch2.phase == TouchPhase.Moved || touch2.phase == TouchPhase.Stationary) && // тач2  стоит или двигается
  227.                        (touch1.phase != TouchPhase.Stationary && touch2.phase != TouchPhase.Stationary)) // тач1 не стоит && тач2 не стоит
  228.                         OnZoomStay(touch1.position, touch2.position);
  229.                     if (touch1.phase == TouchPhase.Ended || touch2.phase == TouchPhase.Ended ||
  230.                        touch1.phase == TouchPhase.Canceled || touch2.phase == TouchPhase.Canceled)
  231.                         OnZoomEnd(touch1.position, touch2.position);
  232.                 }
  233.                 break;
  234.         }
  235.     }
  236.     public void Inside()
  237.     {
  238.         objectScript objTemp = (objectScript)FindObjectOfType(typeof(objectScript));
  239.         if (objTemp != null)
  240.         {
  241.             objTemp.Inside();          
  242.         }
  243.     }
  244. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement