This is what I used for multi-touch raycasting in a 2D game. It supports many types of messages.
Since I’m very new to programing, I’m interested in any comments and advice on my code.
What I notice in both codes proposed above is that OnMouseDown, OnMouseOver, etc. messages are used. According to this post:
its not good too use OnMouse events in mobile development (Unity has to dance through fiery hoops in every frame to make it work). Therefore IMO its better to use custom messages.
public class TouchInput2D : MonoBehaviour {
public LayerMask touchInputMask;
private Camera cam;
private List<GameObject> touchList = new List<GameObject>();
private List<GameObject> touchListOld = new List<GameObject>();
private RaycastHit2D hit;
void Start ()
{
cam = this.GetComponent<Camera>();
}
void Update ()
{
#if UNITY_EDITOR || UNITY_STANDALONE
if (Input.GetMouseButton(0) || Input.GetMouseButtonDown(0) || Input.GetMouseButtonUp(0))
{
touchListOld.Clear();
touchListOld.AddRange(touchList);
touchList.Clear();
hit = Physics2D.Raycast(cam.ScreenToWorldPoint(Input.mousePosition), Vector2.zero, 1f, touchInputMask);
if (hit.collider != null)
{
GameObject recipent = hit.transform.gameObject;
touchList.Add(recipent);
if (Input.GetMouseButtonDown(0))
{
recipent.SendMessage("OnTouchDown", hit.point, SendMessageOptions.DontRequireReceiver);
}
if (Input.GetMouseButtonUp(0))
{
recipent.SendMessage("OnTouchUp", hit.point, SendMessageOptions.DontRequireReceiver);
}
if (Input.GetMouseButton(0) && Input.GetMouseButtonDown(0) == false &&touchListOld.Contains(recipent) == false)
{
recipent.SendMessage("OnTouchEntered", hit.point, SendMessageOptions.DontRequireReceiver);
}
if (Input.GetMouseButton(0))
{
recipent.SendMessage("OnTouchStay", hit.point, SendMessageOptions.DontRequireReceiver);
}
}
foreach (GameObject g in touchListOld)
{
if (!touchList.Contains(g) && g != null)
{
g.SendMessage("OnTouchExit", hit.point, SendMessageOptions.DontRequireReceiver);
}
}
}
#endif
#if UNITY_IOS
if (Input.touchCount > 0)
{
touchListOld.Clear();
touchListOld.AddRange(touchList);
touchList.Clear();
Touch[] currentTouches = Input.touches;
for (int i = 0; i < Input.touchCount; i++)
{
hit = Physics2D.Raycast(cam.ScreenToWorldPoint(currentTouches*.position), Vector2.zero, 1f, touchInputMask);*
if (hit.collider != null)
{
GameObject recipent = hit.transform.gameObject;
touchList.Add(recipent);
if (currentTouches*.phase == TouchPhase.Began)*
{
recipent.SendMessage(“OnTouchDown”, hit.point, SendMessageOptions.DontRequireReceiver);
}
if (currentTouches*.phase == TouchPhase.Ended)*
{
recipent.SendMessage(“OnTouchUp”, hit.point, SendMessageOptions.DontRequireReceiver);
}
if (currentTouches_.phase == TouchPhase.Stationary || currentTouches*.phase == TouchPhase.Moved)
{
recipent.SendMessage(“OnTouchStay”, hit.point, SendMessageOptions.DontRequireReceiver);
}
if (currentTouches.phase == TouchPhase.Moved && currentTouches.phase != TouchPhase.Began && touchListOld.Contains(recipent) == false)
{
recipent.SendMessage(“OnTouchEntered”, hit.point, SendMessageOptions.DontRequireReceiver);
}_
_if (currentTouches.phase == TouchPhase.Moved)
{
recipent.SendMessage(“OnTouchMoved”, hit.point, SendMessageOptions.DontRequireReceiver);
}_
_if (currentTouches.phase == TouchPhase.Canceled)
{
recipent.SendMessage(“OnTouchExit”, hit.point, SendMessageOptions.DontRequireReceiver);
}
}
}
foreach (GameObject g in touchListOld)
{
if (!touchList.Contains(g) && g != null)
{
g.SendMessage(“OnTouchExit”, hit.point, SendMessageOptions.DontRequireReceiver);
}
}
}
#endif*
}
}_