Unity3d虚拟摇杆控制物体移动及旋转

   王者荣耀在现在看来可能已经成为不少人每天都会打开一款软件,角色的控制及其操作方式简单,使其短时间内获得了大量的玩家喜爱和追捧。

    可以很明显的看到王者荣耀的操作方式就是虚拟摇杆,可以控制人物的的移动,及其旋转,或者是控制技能的释放方向。此篇博客就unity中如何实现利用UI(虚拟摇杆)控制物体的移动和旋转。罗马的路很多,这里只是其中一条,还望多提出问题,共同学习。

首先,创建一个场景

物体如下: (创建一个炮嘴,方便观察)

Unity3d虚拟摇杆控制物体移动及旋转_第1张图片

接着是创建UI,网上素材有很多,随便就可以搜出来好看的图片

图片:

Unity3d虚拟摇杆控制物体移动及旋转_第2张图片

层级面板:

Unity3d虚拟摇杆控制物体移动及旋转_第3张图片


简单操作后,进入到代码:

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


public class JoyStick : MonoBehaviour {
    //摇杆
    private GameObject center;
    //摇杆位置限制
    public float PositionRange;
    //得到物体
    private GameObject cube;
    //移动速度
    public float  MoveSpeed;
    //平滑度
    public float smoothing;
	// Use this for initialization
	void Start () {
        //拿到摇杆
        center = transform.Find("Center").gameObject;
        cube = GameObject.Find("Cube");
        //绑定事件
        UIEventTrigger.Get(center).onPointerDown = MoveByPC;//※
    }
    private void MoveByPC(PointerEventData data)
    {
        StartCoroutine("MovePC");
    }
    IEnumerator MovePC()    
    {
        while (Input.GetMouseButton(0))
        {
            // center.transform.position = Input.mousePosition;初级版摇杆移动
            //拿到鼠标的坐标
            Vector3 MousePos = new Vector3(Input.mousePosition.x,Input.mousePosition.y,0);//平面坐标,只需要得到X,Y
            //偏移量的计算  = 鼠标-  大圆盘
            Vector3 offset = MousePos - this.transform.position;
            //限制移动范围
            if (offset.magnitude>PositionRange)//※
            {
                //新的偏移量 = 规定范围  *  偏移量的方向  
                offset = PositionRange * offset.normalized;//偏移量的单位化(得到方向)
            }
            //摇杆的移动= 初始位置   +   偏移量
            center.transform.position = this.transform.position + offset;
            //移动赋给玩家
                //求得移动方向
                Vector3 dir = new Vector3(offset.x,0,offset.y);
                cube.transform.Translate(dir.normalized*Time.deltaTime*MoveSpeed,Space.World);
            //旋转赋给物体
            Quaternion qua = Quaternion.LookRotation(dir.normalized);//※  将Vector3类型转换四元数类型
            cube.transform.rotation = Quaternion.Lerp(cube.transform.rotation, qua, Time.deltaTime * smoothing);//四元数的插值,实现平滑过渡
            yield return null;
        }
        //鼠标松开,摇杆位置复位(初始化)
        center.transform.localPosition = Vector3.zero;
    }
	// Update is called once per frame
	void Update () {
		
	}
}

 
  

引用脚本UIEventTrigger,关于该脚本的使用和说明详见点击打开链接。简单解释几句,在UI物体上的不同的操作方式,比如点击,双击,拖拽扥操作,可以执行其对应的监听事件。在虚拟摇杆中用到的是onPointDown(注意大小写,方法不同),当鼠标点击时执行的监听事件。UIEventTrigger熟悉后,会改善我们的开发的效率。

还使用到了协程,协程的定义和使用详见点击打开链接。

现在开始理一下逻辑:我们操作模拟摇杆 当手指按下拖拽移动时,小圆盘式跟随着我们的手指的,当手指离开屏幕,小圆盘回到初始位置,即大圆盘的位置。先实现这一步:

使用到了UIEventTrigger中的onPointerDown监听事件,当鼠标即手指按下时 触发监听事件,开始协程

协程内:鼠标为按下状态时进入循环,讲鼠标位置转换为世界坐标(或者将摇杆转换为屏幕坐标计算也可以),和大圆盘的位置相减得到变化矢量。控制变化量的大小,控制在合适范围内。

offset.magnitude是Vector3 的一个方法,将矢量转换为长度,这里使用方便判断。

如果超出范围,变化量应等于最大的范围。

将变化量赋值给摇杆,注释解释的很清楚了。

控制摇杆的位置之后,需要把变化量的方向赋给我们的物体,为什么是方向呢,因为我们只需要他的方向,在此之前,应该看一下物体是在哪个平面移动,比如说由x,z轴组合的平面内移动,则需要把变化量转换成这个平面内的矢量,因为,我们的矢量是x,y轴组成的平面内的矢量,需要转换一下。

然后就是简单的移动代码,需要注意的是方向的矢量需要单位化,原因是1*任何数=任何数,方法是 “矢量.normalized”。

然后赋值旋转 此处用到了四元数的一个方法Quternion.LookRotation,具体了解点击打开链接,可以理解为把三维坐标(方向)转换成四元数,在赋值给这个物体的旋转,四元数不必过多纠结。因为不好理解。。。

Quternion.Lerp为线性差值,在很多地方都有这个方法,详见点击打开链接。

当鼠标抬起,即退出while循环时,让摇杆复位。

旋转可以写一个新脚本里面用另一个摇杆控制。

好了,到此这篇博客就结束了,其实对小白和新手并不友好。但是路会越走越宽,终有一天会学到,理解到。

你可能感兴趣的:(Unity)