Search Unity

How do I maximise mouse drag speed?

Discussion in 'Scripting' started by Slyrfecso1, Nov 15, 2015.

  1. Slyrfecso1

    Slyrfecso1

    Joined:
    Jul 16, 2012
    Posts:
    100
    Hi!

    If I drag something very fast on the screen then the game objects could go through on each other.
    The onTrigger is slower the mouse drag. In my script if GOs are triggered then the drag is stopping,
    but under fast dragging the stop script can't activate.

    Any idea will be helpful me.

    Code (CSharp):
    1. using System.Collections;
    2. using UnityEngine;
    3.  
    4. class drag_mouse : MonoBehaviour
    5. {
    6.     private bool Triggered = false;
    7.     private bool dragging = false;
    8.     private Vector3 distance;
    9.     public Vector3 scanPosTrigger;
    10.     public Vector3 scanPosDrag;
    11.  
    12.  
    13.  
    14.  
    15.     Ray ray;
    16.     RaycastHit hit;
    17.     public GameObject objects;
    18.  
    19.  
    20.  
    21.    
    22.     void OnMouseDown()
    23.     {
    24.         distance = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, Camera.main.WorldToScreenPoint(transform.position).z)) - transform.position;
    25.         dragging = true;
    26.         ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    27.  
    28.  
    29.     }
    30.    
    31.     void OnMouseUp()
    32.     {
    33.         dragging = false;
    34.         if (Triggered)
    35.         {
    36.             //transform.position = scanPosTrigger; //ALAP ÖTLET
    37.  
    38.  
    39.             //X tengely elmozdulás esetén
    40.             if (scanPosDrag.z-scanPosTrigger.z > scanPosDrag.x-scanPosTrigger.x)
    41.             {
    42.                 transform.position = new Vector3(scanPosTrigger.x+(scanPosDrag.x-scanPosTrigger.x), scanPosDrag.y, scanPosTrigger.z);
    43.                 //Debug.Log(name + " Z tengely aktív");
    44.             }
    45.  
    46.             //else
    47.  
    48.             //Z tengely elmozdulás esetén
    49.             if (scanPosDrag.z-scanPosTrigger.z < scanPosDrag.x-scanPosTrigger.x)
    50.             {
    51.                 transform.position = new Vector3(scanPosTrigger.x, scanPosDrag.y, scanPosTrigger.z+(scanPosDrag.z-scanPosTrigger.z));
    52.                 //Debug.Log(name + " X tengely aktív");
    53.             }
    54.  
    55.             //------------------------------------
    56.  
    57.  
    58.         }
    59.  
    60.  
    61.  
    62.     }
    63.    
    64.     void Update()
    65.     {
    66.            
    67.         if(Physics.Raycast(ray, out hit))
    68.         {
    69.             if(hit.collider.tag == "Player")
    70.             {  
    71.                 objects = hit.collider.gameObject;
    72.             }
    73.         }
    74.  
    75.  
    76.  
    77.  
    78.  
    79.  
    80.  
    81.             gameObject.name = gameObject.name.Replace("(Clone)","").Trim();
    82.         if (dragging)
    83.         {
    84.             scanPosDrag = gameObject.transform.position;
    85.             if(Input.GetKeyDown(KeyCode.A))
    86.                 transform.Rotate(0, 90, 0);
    87.            
    88.             if(Input.GetKeyDown(KeyCode.C))
    89.                 Destroy (gameObject);
    90.            
    91.             if(Input.GetKeyDown(KeyCode.D))
    92.                 Instantiate (gameObject);
    93.                
    94.  
    95.                 Vector3 distance_to_screen = Camera.main.WorldToScreenPoint (transform.position);
    96.                 Vector3 pos_move = Camera.main.ScreenToWorldPoint (new Vector3 (Input.mousePosition.x, Input.mousePosition.y, distance_to_screen.z));
    97.                 transform.position = new Vector3 (pos_move.x - distance.x, transform.position.y, pos_move.z - distance.z);
    98.                 scanPosDrag = gameObject.transform.position;
    99.  
    100.         }
    101.     }
    102.  
    103.  
    104.  
    105.  
    106.     void OnTriggerEnter (Collider myTrigger)
    107.     {
    108.  
    109.         if(myTrigger.gameObject.tag == "Player" || myTrigger.gameObject.tag == "Falak")
    110.         {
    111.             BoxCollider boxCollider = myTrigger.GetComponent<BoxCollider>();
    112.  
    113.             dragging = false;
    114.  
    115.  
    116.        
    117.             if(objects != null)
    118.             {
    119.                 if (objects.name == "AS-K.1-3" || objects.name == "AS-K.1-4" || objects.name == "AS-K.3" || objects.name == "AS-KI.2" || objects.name == "AS-KM.1-4" || objects.name == "AS-PC") {
    120.                 if(objects != null)
    121.                     {
    122.                         if (myTrigger.name == "CIA-806F" || myTrigger.name == "CIA-807F" || myTrigger.name == "CIA-808F" || myTrigger.name == "SIA-806F" || myTrigger.name == "SIA-807F" || myTrigger.name == "SIA-808F" || myTrigger.name == "AS-A-8.6-L" || myTrigger.name == "AS-A-8.8-L" || myTrigger.name == "AS-A-8.6-F.E" || myTrigger.name == "AS-A-8.8-F.E" || myTrigger.name == "AS-A-8.6-F.T" || myTrigger.name == "AS-A-8.8-F.T")
    123.                         {
    124.                             objects.transform.position = new Vector3 (boxCollider.transform.position.x, objects.transform.position.y, boxCollider.transform.position.z);
    125.                         }
    126.                     }
    127.  
    128.             } else {
    129.                 scanPosTrigger = gameObject.transform.position;
    130.                
    131.  
    132.                 Triggered = true;
    133.  
    134.  
    135.             }
    136.             //Debug.Log(name + " Triggered");
    137.             }
    138.         }
    139.  
    140.     }
    141.    
    142.    
    143.     void OnTriggerExit (Collider myTrigger)
    144.     {
    145.         if(myTrigger.gameObject.tag == "Player" || myTrigger.gameObject.tag == "Falak")
    146.         {
    147.             //Debug.Log(name + " Snap feloldása Drag alatt");
    148.             Triggered = false;
    149.         }
    150.     }
    151.  
    152.  
    153.    
    154. }
    155.  
    156.  
    157.  
    158.  
     
  2. Kurt-Dekker

    Kurt-Dekker

    Joined:
    Mar 16, 2013
    Posts:
    38,745
    You can refactor your script so that if you move a whole bunch in a given frame, then you instead break down the distance and iterate the object across the length of the total movement in a series of smaller steps, all within the same single update frame. If you keep those steps small enough to preclude skipping over your trigger, you should always get the collision/trigger hit.

    Now I'm not sure if the OnTriggerEnter/Exit will happen precisely in-line as you iterate the object, or if it will trip once the entire loop of small steps is over. I suspect it might be the latter, which means you may need to manually move the object back to where it first hit... I also don't know if it might trip multiple times as you move through the triggers.