摇杆控制移动

using UnityEngine;
using UnityEngine.EventSystems;

/// 
/// 摇杆
/// 
public class RockerController : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler
{
    public enum JoystickType
    {
        Fixed,      //固定式摇杆
        Floating,   //浮动式摇杆(根据点击屏幕的位置生成摇杆控制器)
        Dynamic     //动态摇杆(摇杆可以被动态拖拽)
    }

    //hor,ver的属性访问器
    private float horizontal = 0;
    private float vertical = 0;

    public float Horizontal
    {
        get { return horizontal; }
    }

    public float Vertical
    {
        get { return vertical; }
    }

    //类型
    public JoystickType joystickType = JoystickType.Fixed;
    //大圆
    public RectTransform background = null;
    //小圆
    public RectTransform handle = null;
    private RectTransform baseRect = null;
    private Canvas canvas;
    //相机
    public Camera _camera;

    public float MoveThreshold;

    private float deadZone = 0;

    public Vector2 input = Vector2.zero;
    private Vector2 center = new Vector2(0.5f, 0.5f);
    private Vector2 fixedPosition = Vector2.zero;
    public float DeadZone
    {
        get { return deadZone; }
        set { deadZone = Mathf.Abs(value); }
    }

    protected virtual void Start()
    {
        baseRect = GetComponent();
        canvas = GetComponentInParent();

        background.pivot = center;
        handle.anchorMin = center;
        handle.anchorMax = center;
        handle.pivot = center;
        handle.anchoredPosition = Vector2.zero;
        fixedPosition = background.anchoredPosition;
        SetMode();
    }
    public void SetMode()
    {
        if (joystickType == JoystickType.Fixed)
        {
            background.anchoredPosition = fixedPosition;
            background.gameObject.SetActive(true);
        }
        else
            background.gameObject.SetActive(false);
    }


    public void OnPointerDown(PointerEventData eventData)
    {
        if (joystickType != JoystickType.Fixed)
        {
            background.anchoredPosition = ScreenPointToAnchoredPosition(eventData.position);
            background.gameObject.SetActive(true);
        }
        OnDrag(eventData);
    }


    public void OnDrag(PointerEventData eventData)
    {
        Vector2 position = Camera.main.WorldToScreenPoint(background.position);//将ui坐标中的background映射到屏幕中的实际坐标
        Vector2 radius = background.sizeDelta / 2;
        input = (eventData.position - position) / (radius * canvas.scaleFactor);//将屏幕中的触点和background的距离映射到ui空间下实际的距离
        HandleInput(input.magnitude, input.normalized, radius, _camera);        //对输入进行限制
        handle.anchoredPosition = input * radius;                              //实时计算handle的位置
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        if (joystickType != JoystickType.Fixed)
            background.gameObject.SetActive(false);
        input = Vector2.zero;
        handle.anchoredPosition = Vector2.zero;
    }



    public void HandleInput(float magnitude, Vector2 normalised, Vector2 radius, Camera cam)
    {
        if (joystickType == JoystickType.Dynamic && magnitude > MoveThreshold)
        {
            Vector2 difference = normalised * (magnitude - MoveThreshold) * radius;
            background.anchoredPosition += difference;
        }
        if (magnitude > deadZone)
        {
            if (magnitude > 1)
                input = normalised;
        }
        else
            input = Vector2.zero;
    }

    private Vector2 ScreenPointToAnchoredPosition(Vector2 screenPosition)
    {
        Vector2 localPoint = Vector2.zero;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(baseRect, screenPosition, _camera, out localPoint);
        return localPoint;
    }


    void Update()
    {
        horizontal = handle.localPosition.x;
        vertical = handle.localPosition.y;
    }
}
using UnityEngine;

/// 
/// 玩家控制
/// 
public class PlayerController : MonoBehaviour
{
    /// 
    /// 获取摇杆脚本
    /// 
    public RockerController touch;
    /// 
    /// 移动速度
    /// 
    public float moveSpeed;
    /// 
    /// 旋转速度
    /// 
    public float RotSpeed;


    void Start()
    {
        
    }

    void Update()
    {
        MoveControlPlayer();
    }

    void MoveControlPlayer()
    {

        float hor = touch.Horizontal;
        float ver = touch.Vertical;

        Vector3 direction = new Vector3(hor, 0, ver);
        if (direction != Vector3.zero)
        {
            // 开始移动
            transform.Translate(transform.forward * Time.deltaTime * moveSpeed, Space.World);
            //控制旋转
            transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(direction), Time.deltaTime * RotSpeed);

        }
        else
        {
            // 没有移动

        }
    }
}

你可能感兴趣的:(摇杆控制移动)