using UnityEngine;
using System.Collections;
public class GUIButton : MonoBehaviour {
public enum BUTTON_STATUS
{
NONE = -1,
UP = 0,
DOWN,
END,
CANCEL,
};
public BUTTON_STATUS buttonStatus = BUTTON_STATUS.UP;
private BUTTON_STATUS buttonStatusNext = BUTTON_STATUS.NONE;
public Texture textureUp;
public Texture textureDown;
public Scene scene;
public string OnTap;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update()
{
switch(buttonStatus)
{
case BUTTON_STATUS.UP:
if(Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
if(touch.phase == TouchPhase.Began)
{
if(guiTexture.HitTest(touch.position))
{
buttonStatusNext = BUTTON_STATUS.DOWN;
}
}
}
break;
case BUTTON_STATUS.DOWN:
if(Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
if(touch.phase == TouchPhase.Moved)
{
if(!guiTexture.HitTest(touch.position))
{
buttonStatusNext = BUTTON_STATUS.CANCEL;
}
}
else if(touch.phase == TouchPhase.Ended)
{
if(guiTexture.HitTest(touch.position))
{
buttonStatusNext = BUTTON_STATUS.END;
}
}
}
break;
case BUTTON_STATUS.CANCEL:
buttonStatusNext = BUTTON_STATUS.UP;
break;
case BUTTON_STATUS.END:
buttonStatusNext = BUTTON_STATUS.UP;
break;
}
while(buttonStatusNext != BUTTON_STATUS.NONE)
{
buttonStatus = buttonStatusNext;
buttonStatusNext = BUTTON_STATUS.NONE;
switch(buttonStatus)
{
case BUTTON_STATUS.DOWN:
print("-> BUTTON_STATUS.DOWN");
guiTexture.texture = textureDown;
break;
case BUTTON_STATUS.CANCEL:
print("-> BUTTON_STATUS.CANCEL");
break;
case BUTTON_STATUS.END:
print("-> BUTTON_STATUS.END");
scene.SendMessage(OnTap);
break;
case BUTTON_STATUS.UP:
print("-> BUTTON_STATUS.UP");
guiTexture.texture = textureUp;
break;
}
}
}
}
Unity Remote で実機デバッグしていると、touchPhaseが上手く拾えないことがまれに発生する。実機転送後は問題なく動作しているので気にしなければ良いんだけど。
あえて、デバッグをスムーズに進めるために、現在はtouchPhaseを使わない方法を模索中。
タッチ周りのデバッグが効率よく出来れば、こんな苦労しなくていいんだけど。