1、獲取螢屏輸入
新建腳本TouchInput,添加到MainCamera(主攝像機)上
public class TouchInput : MonoBehaviour
{
public LayerMask touchInputMask; //宣告層級,射線只與設定的層級進行檢測
private Camera myCamera; //宣告攝像機
private List<GameObject> touchList = new List<GameObject>(); //保存當前按下的物體,需要用List進行動態添加
private GameObject[] touchesOld; //保存上一次按下的物體,不需要動態添加,與當前按下的物體比較,判斷哪些物體取消了點擊
private RaycastHit hit;
void Start()
{
myCamera = GetComponent<Camera>();
}
void Update()
{
if (Input.touchCount > 0) //如果存在觸屏輸入
{
//初始化touchesOld,并保存上一幀按下的所有按鍵
touchesOld = new GameObject[touchList.Count];
touchList.CopyTo(touchesOld);
touchList.Clear(); //清空串列,用于獲取新的輸入,保存當前按下的物體
foreach (Touch touch in Input.touches) //遍歷所有的屏觸屏輸入
{
Ray ray = myCamera.ScreenPointToRay(touch.position); //從觸屏的地方發射射線
if (Physics.Raycast(ray, out hit, touchInputMask))
{
GameObject recipient = hit.transform.gameObject; //獲取射線碰撞的物體
touchList.Add(recipient); //將該物體加入當前觸碰串列
if (touch.phase == TouchPhase.Began) //判斷觸屏的型別,如果為剛剛接觸螢屏
{
//發送委托,呼叫物體OnTouchDown的方法
recipient.SendMessage("OnTouchDown", hit.point, SendMessageOptions.DontRequireReceiver);
}
if (touch.phase == TouchPhase.Ended) //判斷觸屏的型別,如果手指離開螢屏
{
//發送委托,呼叫物體OnTouchUp的方法
recipient.SendMessage("OnTouchUp", hit.point, SendMessageOptions.DontRequireReceiver);
}
//如果長按螢屏或在螢屏上滑動
if (touch.phase == TouchPhase.Stationary || touch.phase == TouchPhase.Moved)
{
//發送委托,呼叫物體OnTouchStay的方法
recipient.SendMessage("OnTouchStay", hit.point, SendMessageOptions.DontRequireReceiver);
}
if (touch.phase == TouchPhase.Canceled) //如果手指數量超過追蹤上線,或用臉等平面接觸螢屏
{
//發送委托,呼叫物體OnTouchExit的方法
recipient.SendMessage("OnTouchExit", hit.point, SendMessageOptions.DontRequireReceiver);
}
}
}
foreach (GameObject g in touchesOld) //遍歷上一幀點擊的物體
{
if (!touchList.Contains(g)) //如果串列中不包含上一幀的物體
{
//那么委托呼叫物體的OnTouchExit方法,該物已經取消點擊
g.SendMessage("OnTouchExit", hit.point, SendMessageOptions.DontRequireReceiver);
}
}
}
}
}
新建腳本Button
public class Button : MonoBehaviour
{
public Color defaultColor; //默認顏色
public Color selectedColor; //點擊后的顏色
private Material mat;
private void Start()
{
mat = gameObject.GetComponent<Renderer>().material;
}
private void OnTouchDown()
{
mat.color = selectedColor;
}
private void OnTouchUp()
{
mat.color = defaultColor;
}
private void OnTouchStay()
{
mat.color = selectedColor;
}
private void OnTouchExit()
{
mat.color = defaultColor;
}
}
添加幾個Cube,將Button添加到Cube上

設定每個Cube的顏色
Build到手機后的運行結果

2、拖動效果
這里的Slider并不是UnityUI中的Slider
是使用基本物體拼裝成的Slider
這里使用了3D物體中的Quad和Cube


然后可以在 Slider上創建一個BoxCollider 來限制Button的移動

新建腳本Slider
public class Slider : MonoBehaviour
{
public Transform button;
private Vector3 targetPos;
private void Start()
{
targetPos = button.position;
}
private void Update()
{
button.position = Vector3.Lerp(button.position, targetPos, Time.deltaTime * 10f);
}
void OnTouchStay(Vector3 point)
{
targetPos = new Vector3(point.x, targetPos.y, targetPos.z);
}
}
然后將Button添加到Button上
運行后就能拖動Button
接下來是顯示資料,添加一個3DText設為Slider的子物體,并調整到合適的位置和大小
新建腳本Slider,添加到Slider上
public class Slider : MonoBehaviour
{
public Transform knbo;
public TextMesh textMesh;
private Vector3 targetPos;
private float sliderPercent;
private float sliderLength;
private void Start()
{
sliderLength = gameObject.GetComponent<BoxCollider>().size.x - 0.4f;
targetPos = knbo.position;
}
private void Update()
{
knbo.position = Vector3.Lerp(knbo.position, targetPos, Time.deltaTime * 10f);
//計算slider的比例
sliderPercent = Mathf.Clamp01((knbo.localPosition.x + sliderLength / 2) / sliderLength);
//保留一位小數
textMesh.text = string.Format(sliderName + ": " + "{0:F1}", sliderPercent);
}
public float GetSliderPercent()
{
return sliderPercent;
}
void OnTouchStay(Vector3 point)
{
targetPos = new Vector3(point.x, targetPos.y, targetPos.z);
}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/462921.html
標籤:其他
