多语言展示
当前在线:1527今日阅读:195今日分享:14

Unity UGUI 之 快速学会UGUI虚拟摇杆的实现

Unity UGUI 之 快速学会UGUI虚拟摇杆的实现。通过Unity中的UGUI的方法,通过代码吧UI的运动转化为实际游戏对象的移动方式,本节将具体讲述UGUI虚拟摇杆的实现,具体如下
工具/原料
1

Unity

2

UGUI

3

Mathf

一、基本概念
2

Mathf.Rad2Deg:1)参数形式public static float Rad2Deg;2)DescriptionRadians-to-degrees conversion constant (Read Only).This is equal to 360 / (PI * 2).

3

Mathf.Cos:1)函数形式public static float Cos(float f);2)DescriptionReturns the cosine of angle f in radians.

4

Mathf.Sin:1)函数形式public static float Sin(float f);2)Parametersf        The argument as a radian.3)Returnsfloat The return value between -1 and +1.4)DescriptionReturns the sine of angle f in radians.

二、UGUI 之 快速学会UGUI虚拟摇杆的实现
1

打开Unity,新建一个空工程,然后Unity界面如下图

2

在工程中新建一个文件夹“Resources”,然后导入两个虚拟摇杆图片,并把两张图片转为“Sprite(2D and UI)”,具体如下图

3

在场景中新建一个“Canvas”,然后添加一个“Image”,并且命名为“JoystickPanelImage”,接着在“JoystickPanelImage”,再添加“Image”,命名为“JoystickImage”,随后把“Resources”的图片按名字分别对应“Image ”,具体如下图

4

调整好“JoystickPanelImage”和“JoystickImage”的比例及布局,然后把“JoystickPanelImage”置于“Canvas”左下角,锚点也至于“Canvas”左下角,具体如下图

5

在工程中新添加3个脚本,分别命名为“Joystick”、“JoystickData”、“JoystickManager”,然后双击“JoystickData”脚本或者右键“Open C# Project”打开脚本,具体如下图

6

在打开的“JoystickData”脚本上进行代码编辑,在“JoystickData”类里面声明几个公有变量,用来记录摇杆移动的数据,具体代码及代码说明如下图

7

在打开的“Joystick”脚本上进行代码编辑1)在“Joystick”类里面,首先声明定义几个委托,用来记录虚拟摇杆的触发事件,然后在声明定义虚拟摇杆的位置,运动范围等信息,接着是运动过程相对应的bool值,随后在Start函数里面赋值之前的一些变量,再者在Update中设置鼠标按下、抬起和移动调用函数,具体代码及代码说明如下图

8

在打开的“Joystick”脚本上进行代码编辑2)继续编辑代码,接着分别实现鼠标按下、抬起和移动时调用的函数,然后实现Reset的一些bool值设置等,具体的代码及代码说明如下图

9

在打开的“Joystick”脚本上进行代码编辑3)继续编辑代码,完善“enabled”、“visible”的属性定义,具体的代码及代码说明如下图

10

在打开的“JoystickManager”脚本上进行代码编辑,首先定义几个变量,分别用来用来获取脚本数据,移动对象以及移动速度,然后在设置委托事件函数,最后实现事件函数的代码,通过使用三角函数来最终实现对游戏物体的控制,具体的代码及代码说明如下图

11

JoystickData.cs具体脚本代码如下:///

/// Joystick 信息/// public class JoystickData {    public float radians;   //弧度    public float angle;     //角度    public float angle360;  //0~360 0为右 90为上 180为左 270为下    public float power;     //0~1 拖拽的力度}

12

Joystick.cs具体脚本代码如下:using UnityEngine.UI;using System;using UnityEngine;///

/// 虚拟摇杆具体的相关事件,相关操作/// public class Joystick : MonoBehaviour {    //事件    public Action OnTouchDown;    public Action OnTouchMove;    public Action OnTouchUp;    //Untiy 指定参数    public GameObject joystick;//移动对象    public float joystickRadius = 200.0f;//移动半径(UGUI像素)    public Rect touchArea = new Rect(0, 0, 1f, 1f);//0~1    //data    public JoystickData data = new JoystickData();    private Vector3 touchOrigin;//按下原点(Input.mousePosition)    private float scaleFactor;//Screen 2 Canvas 的转换因子    private Transform self;    private Vector3 selfDefaultPosition;    private Vector3 joystickDefaultLocalPos;//control的默认位置    private bool isStarted = false;    private bool isOnArea = false;//是否点击在区域上    private bool isDragged = false;//是否正在拖拽    public bool m_enabled = true;//false = 看得见,无法操作    public bool m_visible = true;//false = 看不见,可以操作    public bool locked = false;//锁定self位置    // Use this for initialization    void Start()    {        self = transform;        selfDefaultPosition = self.position;        //获取转换系数        Canvas canvas = joystick.GetComponentInParent();        scaleFactor = canvas.scaleFactor;        //转换touchArea        if (touchArea.width > 1 || touchArea.height > 1)        {            touchArea.x = touchArea.x * scaleFactor / Screen.width;            touchArea.y = touchArea.y * scaleFactor / Screen.height;            touchArea.width = touchArea.width * scaleFactor / Screen.width;            touchArea.height = touchArea.height * scaleFactor / Screen.height;        }        joystickDefaultLocalPos = joystick.transform.localPosition;        isStarted = true;        enabled = m_enabled;        visible = m_visible;    }    public void OnDisable()    {        if (isStarted)            Reset();    }    // Update is called once per frame    void Update()    {        if (!m_enabled)            return;        //按下        if (Input.GetMouseButtonDown(0))        {            TouchDown();        }        //拖动        if (Input.GetMouseButton(0))        {            TouchMove();        }        //放开        if (Input.GetMouseButtonUp(0))        {            TouchUp();        }    }    private void TouchDown()    {        Vector3 touchPosition = Input.mousePosition;        Vector2 touchScreen = new Vector2(            touchPosition.x / Screen.width, touchPosition.y / Screen.height);        isOnArea = touchArea.Contains(touchScreen);        if (!isOnArea)            return;        if (!locked)        {            touchOrigin = touchPosition;            self.position = touchOrigin;        }        else        {            touchOrigin = joystick.transform.position;        }        if (OnTouchDown != null)            OnTouchDown();    }    private void TouchMove()    {        if (!isOnArea)            return;        Vector3 origin = touchOrigin / scaleFactor;        Vector3 now = Input.mousePosition / scaleFactor;        float distance = Vector3.Distance(now, origin);        if (distance < 0.01f)            return;        isDragged = true;        Vector3 direction = now - origin;        float radians = Mathf.Atan2(direction.y, direction.x);        //移动摇杆        if (joystick != null)        {            if (distance > joystickRadius)                distance = joystickRadius;            float mx = Mathf.Cos(radians) * distance;            float my = Mathf.Sin(radians) * distance;            Vector3 uiPos = joystickDefaultLocalPos;            uiPos.x += mx;            uiPos.y += my;            joystick.transform.localPosition = uiPos;        }        //派发事件        if (OnTouchMove != null)        {            data.power = distance / joystickRadius;            data.radians = radians;            data.angle = radians * Mathf.Rad2Deg;            data.angle360 = data.angle < 0 ? 360 + data.angle : data.angle;            OnTouchMove(data);        }    }    private void TouchUp()    {        isOnArea = false;        isDragged = false;        ReplaceImmediate();        if (OnTouchUp != null)            OnTouchUp();    }    ///     /// 重置状态    ///     public void Reset()    {        isOnArea = false;        isDragged = false;        ReplaceImmediate();    }    ///     /// 立即复位    ///     public void ReplaceImmediate()    {        if (!locked)            self.position = selfDefaultPosition;        joystick.transform.localPosition = joystickDefaultLocalPos;    }    ///     /// 启用开关(SetActive是彻底看不见,这个是看得见但是无法操作)    ///     public bool enabled    {        get { return m_enabled; }        set        {            m_enabled = value;            if (isStarted)            {                Reset();            }        }    }    public bool visible    {        get { return m_visible; }        set        {            m_visible = value;            if (isStarted)            {                self.GetComponent().enabled = m_visible;                joystick.GetComponent().enabled = m_visible;            }        }    }}

13

JoystickManager.cs具体脚本代码如下:using UnityEngine;public class JoystickManager : MonoBehaviour {    public Joystick joystick;    public Transform moveTarget;    public float moveSpeed = 10.0f; // Use this for initialization void Start () {        joystick.OnTouchMove += OnJoystickMove; }    private void OnJoystickMove(JoystickData joystickData) {        float moveX = Mathf.Cos(joystickData.radians) * moveSpeed *             Time.deltaTime * joystickData.power;        float moveZ = Mathf.Sin(joystickData.radians) * moveSpeed *            Time.deltaTime * joystickData.power;        moveTarget.Translate(new Vector3(moveX, 0, moveZ));    }}

14

脚本编译正确后,回到Unity界面,把脚本“Joystick”赋给“JoystickPanelImage”,并且把“JoystickImage”赋给脚本“Joystick”的“Joystick”变量,具体如下图

15

在场景中新建一个“GameObject”、“Cube”,并且把“GameObject”命名为“JoystickManager”,然后把脚本“JoystickManager”赋给“JoystickManager”,并把“JoystickImage”、“Cube”分别赋给脚本“JoystickManager”的“Joystick”和“MoveTarget”,具体如下图

16

运行场景,鼠标点击、滑动,即可通过虚拟摇杆控制移动对象,具体如下图

17

到此,《Unity UGUI 之 快速学会UGUI虚拟摇杆的实现》讲解结束,谢谢

注意事项
1

下面参考资料虚拟摇杆工程的Demo,密码为t8ik

2

若帮到您,还请帮忙投票以帮助到更多的人;若有疑问,请留言

推荐信息