王者荣耀在现在看来可能已经成为不少人每天都会打开一款软件,角色的控制及其操作方式简单,使其短时间内获得了大量的玩家喜爱和追捧。
可以很明显的看到王者荣耀的操作方式就是虚拟摇杆,可以控制人物的的移动,及其旋转,或者是控制技能的释放方向。此篇博客就unity中如何实现利用UI(虚拟摇杆)控制物体的移动和旋转。罗马的路很多,这里只是其中一条,还望多提出问题,共同学习。
首先,创建一个场景
物体如下: (创建一个炮嘴,方便观察)
接着是创建UI,网上素材有很多,随便就可以搜出来好看的图片
图片:
层级面板:
简单操作后,进入到代码:
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循环时,让摇杆复位。
旋转可以写一个新脚本里面用另一个摇杆控制。
好了,到此这篇博客就结束了,其实对小白和新手并不友好。但是路会越走越宽,终有一天会学到,理解到。