1.0 最详细EasyTouch触摸摇杆 控制物体移动

 

 

一般游戏用的EasyTouch插件的功能 就两三种比较少,把插件全导入占用内存太大,所以本文对摇杆部分进行了提验 其他部分都可以照样提出来用。

 

1.主相机设置 屏幕分辩 16:9   

2 创建一块Plane 和控制的移动对象 Cube;

3 创建ui摇杆 joyTick.

创建好后运行 如图:

5 摇杆控制代码:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System;
using System.Collections.Generic;

/// <summary>
/// 虚拟摇杆(暂作用于控制层)
/// </summary>
public class JoyStick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler
{
    public List<Vector2> caluatePostionQueue;
    /// <summary>
    /// 摇杆最大半径
    /// 以像素为单位
    /// </summary>
    public float JoyStickRadius = 50;

    /// <summary>
    /// 摇杆重置所诉
    /// </summary>
    public float JoyStickResetSpeed = 5.0f;

    /// <summary>
    /// 当前物体的Transform组件
    /// </summary>
    private RectTransform selfTransform;

    /// <summary>
    /// 是否触摸了虚拟摇杆
    /// </summary>
    private bool isTouched = false;

    /// <summary>
    /// 虚拟摇杆的默认位置
    /// </summary>
    private Vector2 originPosition;

    /// <summary>
    /// 虚拟摇杆的移动方向
    /// </summary>
    private Vector2 touchedAxis;
    public Vector2 TouchedAxis
    {
        get
        {
            return touchedAxis.normalized;
        }
    }

    /// <summary>
    /// 定义触摸开始事件委托 
    /// </summary>
    public delegate void JoyStickTouchBegin(Vector2 vec);

    /// <summary>
    /// 定义触摸过程事件委托 
    /// </summary>
    /// <param name="vec">虚拟摇杆的移动方向</param>
    public delegate void JoyStickTouchMove(Vector2 vec);

    /// <summary>
    /// 定义触摸结束事件委托
    /// </summary>
    public delegate void JoyStickTouchEnd();

    /// <summary>
    /// 注册触摸开始事件
    /// </summary>
    public event JoyStickTouchBegin OnJoyStickTouchBegin;

    /// <summary>
    /// 注册触摸过程事件
    /// </summary>
    public event JoyStickTouchMove OnJoyStickTouchMove;

    /// <summary>
    /// 注册触摸结束事件
    /// </summary>
    public event JoyStickTouchEnd OnJoyStickTouchEnd;

    private Image selfImg;

    [SerializeField]
    private Image backImg;

    void Start()
    {
        //初始化虚拟摇杆的默认方向
        selfTransform = this.GetComponent<RectTransform>();
        originPosition = selfTransform.anchoredPosition;
        selfImg = GetComponent<Image>();
        //caluatePostionQueue = new List<Vector2>();
        //backImg = transform.parent.GetComponent<Image> ();
    }
    public bool IsTouched()
    {
        return isTouched;
    }
    //开始控制摇杆
    public void OnPointerDown(PointerEventData eventData)
    {
        //MainPanelContrller.Instance.SetAutoMove(false);
        isTouched = true;
        touchedAxis = GetJoyStickAxis(eventData);
        if (this.OnJoyStickTouchBegin != null)
            this.OnJoyStickTouchBegin(TouchedAxis);
        SetImageAlpha(selfImg, 1f);
        SetImageAlpha(backImg, 1f);
    }
    //控制摇杆UI显示
    private void SetImageAlpha(Image img, float v)
    {
        Color current = img.color;
        current.a = v;
        img.color = current;
    }
    //松开摇杆
    public void OnPointerUp(PointerEventData eventData)
    {
        isTouched = false;
        selfTransform.anchoredPosition = originPosition;
        touchedAxis = Vector2.zero;
        if (this.OnJoyStickTouchEnd != null)
            this.OnJoyStickTouchEnd();
        SetImageAlpha(selfImg, 0.3f);
        SetImageAlpha(backImg, 0.3f);
    }
    //拖动摇杆
    public void OnDrag(PointerEventData eventData)
    {
        touchedAxis = GetJoyStickAxis(eventData);
        if (this.OnJoyStickTouchMove != null)
            this.OnJoyStickTouchMove(TouchedAxis);
    }


    void Update()
    {

        松开虚拟摇杆后让虚拟摇杆回到默认位置
        //if (selfTransform.anchoredPosition.magnitude > originPosition.magnitude)
        //    selfTransform.anchoredPosition -= TouchedAxis * Time.deltaTime * JoyStickResetSpeed;

    }

    /// <summary>
    /// 返回虚拟摇杆的偏移量
    /// </summary>
    /// <returns>The joy stick axis.</returns>
    /// <param name="eventData">Event data.</param>
    private Vector2 GetJoyStickAxis(PointerEventData eventData)
    {
        //获取手指位置的世界坐标
        Vector3 worldPosition;
        if (RectTransformUtility.ScreenPointToWorldPointInRectangle(selfTransform,
                 eventData.position, eventData.pressEventCamera, out worldPosition))
            selfTransform.position = worldPosition;
        //获取摇杆的偏移量
        Vector2 touchAxis = selfTransform.anchoredPosition - originPosition;
        //摇杆偏移量限制
        if (touchAxis.magnitude >= JoyStickRadius)
        {
            touchAxis = touchAxis.normalized * JoyStickRadius;
            selfTransform.anchoredPosition = touchAxis;
        }
        return touchAxis;
    }

}

6.控制移动的物体脚本代码:

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

public class PlayerCtrl : MonoBehaviour {

    private float time;

    public JoyStick stick;

    public float speed = 5f;


    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        Vector2 stickValue;
        //if (autoMove)
        //    stickValue = autoMoveDir;
        //else
            stickValue = stick.TouchedAxis;
      
        if (stickValue.x == 0 && stickValue.y == 0)
        {
            time = 0;
           // anim.SetBool("run", false);
            return;
        }
        Vector3 cameraForward = Camera.main.transform.forward;
        cameraForward.y = 0;
        cameraForward = cameraForward.normalized;

        Vector3 cameraRight = Camera.main.transform.right;
        cameraRight.y = 0;
        cameraRight = cameraRight.normalized;
        Vector3 off = cameraForward * stickValue.y * speed * Time.deltaTime;
        Vector3 nextPos = transform.position + off;
        nextPos = nextPos + cameraRight * stickValue.x * speed * Time.deltaTime;
        Quaternion targetRot = Quaternion.LookRotation(nextPos - transform.position);

        Quaternion curr = Quaternion.RotateTowards(transform.rotation, targetRot, 180);//180 * Time.deltaTime
        transform.rotation = curr;
      
        time += Time.deltaTime;
       
        transform.position = Vector3.Lerp(transform.position, nextPos, time * 0.5f);

    }
}

 

7.场景对象挂载:

(1):

(2):

8 运行结果展示:

9 .备注:移动控制也可通过摇杆中的事件进行控制,这样就解耦摇杆和控制对象,摇杆对象在全局控制器中生成并且注册相关事件,谁注册摇杆中的事件 就可以控制谁。

 


版权声明:本文为s_xiajunjun1986原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。