In this Unity tutorial we will separate and improve the 3D portion of our TouchLogic script (original here) making it more optimized for better performance. I will rewrite and better explain a few things to solve any issues you may have had with the original.
Time Breakdown:
0:10 - Overview of how and what we will be doing
1:00 - How to make this script work for 2D colliders
1:28 - Why are we separating TouchLogic3D and TouchLogicV2?
2:25 - Creating the ITouchable3D interface
4:45 - Implementing our interface in our script for touchable objects
8:00 - Creating our TouchLogic3D script
10:00 - Checking what the raycast hit
12:28 - Checking if what we hit is actually touchable
15:12 - Demonstrating that our script recognizes what is touchable and what is not
16:23 - Removing SendMessage and calling functions directly
19:24 - Finished with the touch functions, moving on to the Anywhere functions
23:15 - Demonstrating why we need a touch2Watch variable
25:30 - Outro, thanks for watching :D
Check out the videos above to hear the explanation and see the code in action.
/*/
* Script by Devin Curry
* www.Devination.com
* www.youtube.com/user/curryboy001
* Please like and subscribe if you found my tutorials helpful :D
* Twitter: https://twitter.com/Devination3D
/*/
using UnityEngine;
using System.Collections;
public class TouchLogic3D : MonoBehaviour
{
public static int currTouch = 0;//so other scripts can know what touch is currently on screen
private int touch2Watch = 64;
private Ray ray;//this will be the ray that we cast from our touch into the scene
private RaycastHit rayHitInfo = new RaycastHit();//return the info of the object that was hit by the ray
private ITouchable3D touchedObject = null;
void Update ()
{
foreach(Touch touch in Input.touches)
{
currTouch = touch.fingerID;
ray = Camera.main.ScreenPointToRay(touch.position);//creates ray from screen point position
//if the ray hit something, only if it hit something
if(Physics.Raycast(ray, out rayHitInfo))
{
//if the thing that was hit implements ITouchable3D
touchedObject = rayHitInfo.transform.GetComponent(typeof(ITouchable3D)) as ITouchable3D;
//Debug.Log (touchedObject);
//If the ray hit something and it implements ITouchable3D
if (touchedObject != null)
{
switch(touch.phase)
{
case TouchPhase.Began:
touchedObject.OnTouchBegan();
touch2Watch = currTouch;
break;
case TouchPhase.Ended:
touchedObject.OnTouchEnded();
break;
case TouchPhase.Moved:
touchedObject.OnTouchMoved();
break;
case TouchPhase.Stationary:
touchedObject.OnTouchStayed();
break;
}
}
}
//On Anywhere
else if (touchedObject != null && touch2Watch == currTouch)
{
switch(touch.phase)
{
case TouchPhase.Ended:
touchedObject.OnTouchEndedAnywhere();
touchedObject = null;
break;
case TouchPhase.Moved:
touchedObject.OnTouchMovedAnywhere();
break;
case TouchPhase.Stationary:
touchedObject.OnTouchStayedAnywhere();
break;
}
}
}
}
}
And the interface:
/*/
* Script by Devin Curry
* www.Devination.com
* www.youtube.com/user/curryboy001
* Please like and subscribe if you found my tutorials helpful :D
* Twitter: https://twitter.com/Devination3D
/*/
public interface ITouchable3D
{
//Remove functions you know you arent going to use
// void OnNoTouches();
void OnTouchBegan();
void OnTouchEnded();
void OnTouchMoved();
void OnTouchStayed();
// void OnTouchBeganAnywhere();
void OnTouchEndedAnywhere();
void OnTouchMovedAnywhere();
void OnTouchStayedAnywhere();
}