您现在的位置:首页 > >

unity虚拟摇杆 + 多点触控方案

发布时间:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


using UnityEngine.EventSystems;
using UnityEngine.UI;


public class Rocker : MonoBehaviour {


? ? public RectTransform RockerPoint; ? ? ? //触控点
? ? public RectTransform BottomPlane; ? ? ? //触控盘父物体
? ? public RectTransform BottomImage; ? ? ? //边框
? ? public RectTransform RockerEffect; ? ? ?//特效显示(头朝上)
? ? private float DragRadius; //拖动半径
? ? private Vector2 RockerPointPosition; //触点坐标
? ? private Vector2 initPosition; //按下时坐标
? ? public static Vector2 RockerXY =new Vector2(0,0); ? ? ? //摇杆坐标数据等同于Input.GetAxis (0~1)?
? ? private float DragMin = 0.015f; ? ? ? ? //最小移动距离


? ? private void Start()
? ? { ?//根据分辨率自适应摇杆区域大小
? ? ? ? RockerPointPosition = new Vector2(Screen.height * 0.2f, Screen.height * 0.2f);
? ? ? ? BottomPlane.position = RockerPointPosition;
? ? ? ? BottomPlane.sizeDelta = new Vector2(Screen.width * 0.3f, Screen.width * 0.3f);
? ? ? ? BottomImage.sizeDelta = new Vector2(Screen.width * 0.16f, Screen.width * 0.16f);
? ? ? ? RockerEffect.sizeDelta = BottomImage.sizeDelta * 0.9f;
? ? ? ? RockerPoint.sizeDelta = new Vector2(Screen.width * 0.03f, Screen.width * 0.03f);
? ? ? ? RockerPoint.localPosition = new Vector2(0,0);
? ? ? ? DragRadius = Screen.width * 0.05f; //拖动距离
? ? ? ? DragMin = Screen.width * DragMin; ?//最小拖动半径
? ? ? ? BottomImage.GetComponent().color = new Color(1, 1, 1, 0);
? ? ? ? RockerEffect.GetComponent().color = new Color(1, 1, 1, 0);
? ? }
? ??
? ? ///


? ? /// 淡出淡如特效
? ? ///

? ? ///
? ? ///
? ? IEnumerator EffectAnime(bool start)
? ? { //我这里设置10帧
? ? ? ? int x1 = start ? 0 : 10;
? ? ? ? int x2 = start ? 10 : 0;
? ? ? ? do
? ? ? ? {
? ? ? ? ? ? if (x1 >= 6)
? ? ? ? ? ? { RockerPoint.GetComponent().color = new Color(1, 1, 1, x1 * 0.1f); }
? ? ? ? ? ? RockerEffect.GetComponent().color = new Color(1, 1, 1, x1 * 0.1f);
? ? ? ? ? ? BottomImage.GetComponent().color = new Color(1, 1, 1, x1 * 0.1f);
? ? ? ? ? ? x1 += start ? 1 : -1;
? ? ? ? ? ? yield return new WaitForSeconds(0.03f);
? ? ? ? }
? ? ? ? while (start ? x1 <= x2 : x1 >= x2);
? ? }


? ? ///


? ? /// 按下摇杆
? ? ///

? ? /// 触发物体
? ? public void ClickDown()
? ? {
? ? ? ? StartCoroutine("EffectAnime",true);
? ? ? ? initPosition = GetTouches(1);
? ? ? ? if (initPosition.x > RockerPointPosition.x & initPosition.y > RockerPointPosition.y)
? ? ? ? { BottomPlane.position = initPosition; }
? ? }


? ? ///


? ? /// 抬起摇杆
? ? ///

? ? public void ClickUP()
? ? {
? ? ? ? StartCoroutine("EffectAnime", false);
? ? ? ? RockerXY = new Vector2(0, 0);
? ? ? ? RockerPoint.localPosition = new Vector2(0, 0);
? ? ? ? BottomPlane.position = RockerPointPosition;
? ? ? ? TouchUp(1);
? ? }
? ? //拖动摇杆
? ? public void RockerDrag()
? ? {
? ? ? ? Vector2 dir = GameToolScript.tool.GetTouches(1) - initPosition;
? ? ? ? if (Mathf.Abs(dir.x) > DragMin | Mathf.Abs(dir.y) > DragMin)
? ? ? ? {
? ? ? ? ? ? RockerEffect.gameObject.SetActive(true);
? ? ? ? ? ? RockerPoint.localPosition = dir.normalized * DragRadius;
? ? ? ? ? ? RockerXY = RockerPoint.localPosition.normalized;
? ? ? ? ? ? Vector3 v = (RockerPoint.transform.position - BottomPlane.transform.position).normalized;
? ? ? ? ? ? RockerEffect.up= v;
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? ? ? RockerEffect.gameObject.SetActive(false);
? ? ? ? ? ? RockerPoint.localPosition = dir;
? ? ? ? ? ? RockerXY = new Vector2(0, 0);
? ? ? ? }
? ? }


? ? private List touchesList = new List { };
? ? ///


? ? /// 查找是哪个触点
? ? /// 适用于多点触控自动判定触点, 推荐放置于静态变量中
? ? ///

? ? /// 触摸的物体
? ? ///
? ? public Vector2 GetTouches(int touch)
? ? {
? ? ? ? int index = touchesList.IndexOf(touch);
? ? ? ? if (index > -1)
? ? ? ? {
? ? ? ? ? ? return Input.touches[index].position;
? ? ? ? }
? ? ? ? touchesList.Add(touch);
? ? ? ? return Input.touches[Input.touchCount - 1].position;
? ? }
? ? public void TouchUp(int touch)
? ? {
? ? ? ? touchesList.Remove(touch);
? ? }
}
?



?



热文推荐
猜你喜欢
友情链接: