摇杆控制人物移动

摇杆控制人物移动

  • 一、UI搭建
  • 二、3d模型搭建
  • 三、脚本
    • JoyStickBar.cs
    • PlayerController.cs
  • 工程在我资源里名字叫Joystickbar.unitypackage [连接](https://download.csdn.net/download/qq_42194657/12043019?spm=1001.2014.3001.5503)

一、UI搭建

摇杆控制人物移动_第1张图片

JoyStickBar是图片背景
摇杆控制人物移动_第2张图片
摇杆控制人物移动_第3张图片
JoyStickPoint是图中心的拖拽物体
摇杆控制人物移动_第4张图片
摇杆控制人物移动_第5张图片
JoystickPointer是空物体为Image方向位移
摇杆控制人物移动_第6张图片
摇杆控制人物移动_第7张图片
Image是箭头
摇杆控制人物移动_第8张图片
摇杆控制人物移动_第9张图片
JoyStickRadiu是提供拖拽物体与背景图的距离,也就是背景图(大圆)的半径,将其位置移动到背景图的最左边缘
摇杆控制人物移动_第10张图片
摇杆控制人物移动_第11张图片

二、3d模型搭建

摇杆控制人物移动_第12张图片
摇杆控制人物移动_第13张图片

三、脚本

JoyStickBar.cs

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

public class JoyStickBar : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler {

    /// 
    /// 最大半径
    /// 
    public float maxRadius;

    /// 
    /// 计算中的半径
    /// 
    public float radius;

    /// 
    /// 原始位置
    /// 
    private Vector2 originalPos;

    /// 
    /// 遥杆中心位置
    /// 
    public Transform joystickradius;

    /// 
    /// 箭头指针方向
    /// 
    public Transform joystickpointer;

    #region 方向控制访问器

    /// 
    /// 水平方向
    /// 
    private float horizontal = 0;

    /// 
    /// 垂直方向
    /// 
    private float vertical = 0;

    /// 
    /// 水平方向属性访问器
    /// 
    public float Horizontal
    {
        get { return horizontal; }
    }

    /// 
    /// 垂直方向属性访问器
    /// 
    public float Vertical
    {
        get { return vertical; }
    }
    
    #endregion

    private void Start()
    {
        if (!joystickradius) return;
        originalPos = transform.position;
        maxRadius = - joystickradius.localPosition.x;
        ShowPointer(false);
    }

    #region 方向受力

    /// 
    /// 各个方向上的受力
    /// 
    private void DirPotency()
    {
        horizontal = transform.localPosition.x;
        vertical = transform.localPosition.y;
    }

    #endregion

    #region 继承接口事件逻辑处理

    /// 
    /// 开始拖拽
    /// 
    /// 
    public void OnBeginDrag(PointerEventData eventData)
    {
        ShowPointer(true);
    }

    /// 
    /// 拖拽中
    /// 
    /// 
    public void OnDrag(PointerEventData eventData)
    {
        //偏移量
        Vector2 dir = eventData.position - originalPos;
        //Vector2 dir = new Vector2 (Input.mousePosition.x, Input.mousePosition.y) - originalPos;

        //获取向量长度
        float distance = Vector3.Magnitude(dir);

        //获取当前
        radius = Mathf.Clamp(distance,0,maxRadius);

        //位置赋值
        transform.position = dir.normalized * radius + originalPos;

        //方向受力度量
        DirPotency();

        //角度转换
        CalculateAngle(dir.normalized);

    }

    /// 
    /// 结束拖拽
    /// 
    /// 
    public void OnEndDrag(PointerEventData eventData)
    {
        transform.position = originalPos;

        //当前半径
        radius = 0;

        //方向受力度量
        DirPotency();

        ShowPointer(false);
    }

    #endregion

    #region 指针逻辑
    
    /// 
    /// 角度转换
    /// 
    public void CalculateAngle(Vector2 dir)
    {
        if (!joystickpointer) return;
        float dot = Vector2.Dot(Vector2.up, dir);
        float angle = Vector2.Angle(Vector2.up,dir);
        joystickpointer.rotation = Quaternion.Euler(new Vector3(0, 0, -(dir.x>0?angle:-angle)));
    }

    /// 
    /// 显示隐藏指针
    /// 
    /// 
    public void ShowPointer(bool isshow)
    {
        joystickpointer.gameObject.SetActive(isshow);
    }

    #endregion

}

PlayerController.cs

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

public class PlayerController : MonoBehaviour {

    /// 
    /// 摇杆
    /// 
    public JoyStickBar joy;

    /// 
    /// 旋转速度
    /// 
    public float rotatespeed = 10f;

    /// 
    /// 移动速度
    /// 
    public float moveSpeed = 5f;

	// Update is called once per frame
	void Update () {
        float hor = joy.Horizontal;
        float ver = joy.Vertical;

        Vector3 dir = new Vector3(hor,0,ver);

        if (dir != Vector3.zero)
        {
            transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(dir), Time.deltaTime * rotatespeed);
            transform.Translate(Vector3.right * Time.deltaTime * moveSpeed * (joy.radius / joy.maxRadius));
        }

    }
}

工程在我资源里名字叫Joystickbar.unitypackage 连接

你可能感兴趣的:(Unity,数学相关,unity,UGUI,摇杆,unity人物控制)