虚拟摇杆主要是开发移动端的游戏用的,市面上这样的游戏有很多,大家也都见过或者玩过了,在这给大家介绍两种不同的简易方法制作虚拟摇杆。
一、NGUI做虚拟摇杆
1.首先
将NGUII插件导入Unity中,如图:
链接:https://pan.baidu.com/s/1YhnN5ixxn58HUThoukdTZA 密码:eelw
2.导入NGUI插件后
点击NGUI添加一个Sprite命名为JoyStick并为其添加一个Box Collider(注意:添加Box Collider时要选中该物体并在Scene窗口中点击右键添加,添加的Box Collider是作为触发器使用,所以不要忘记勾选Is Trigger)如图:
之后再在JoyStick下方创建一个子物体(Sprite)命名为CenterPos,如上图3所示
3.以上工作完成以后
给JoyStick物体上添加一个脚本(名字自起),脚本内容如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move : MonoBehaviour { //确定是否按压到屏幕 public bool IsPress; //定义大圆盘 public GameObject JoyStick; //虚拟摇杆 public GameObject CenterPos; //触碰的ID值 public int TouchId; public Camera uicamera; //虚拟摇杆的边缘限制框Sprite的半径 public float SpriteWidth; private void Awake() { SpriteWidth = this.gameObject.GetComponent<UISprite>().width/2; } //NGUI中UIEventTrigger脚本中自带的方法 void OnPress(bool ispress) { IsPress = ispress; //初始触碰的ID TouchId = UICamera.currentTouchID; } // Update is called once per frame void Update () { if (IsPress) { //1.得到触碰的位置 Vector2 mousePos = UICamera.GetTouch(TouchId, false).pos; //2.虚拟按键的初始位置 Vector2 JoyStick = new Vector2(uicamera.WorldToScreenPoint(this.transform.position).x, uicamera.WorldToScreenPoint(this.transform.position).y); //3.触碰点到虚拟按键中心点的距离 float dis = Vector3.Distance(mousePos, JoyStick); //4.如果触碰点到虚拟按键位置的距离>SpriteWidth if (dis>SpriteWidth) { //则虚拟摇杆的相对坐标最大为SpriteWidth CenterPos.transform.localPosition = (mousePos - JoyStick).normalized*SpriteWidth; } else { //相对的 虚拟摇杆的相对坐标为 触碰点到虚拟按键中心点的相对向量 CenterPos.transform.localPosition = mousePos - JoyStick; } //如果想控制玩家的移动加上下面这句代码,这里的Cube代表玩家,玩家的移动速度根据自己的情况调节 GameObject.Find("Cube").transform.position += new Vector3((mousePos - JoyStick).normalized.x, 0, (mousePos - JoyStick).normalized.y)*Time.deltaTime*10f; } else { //触碰事件一旦结束,虚拟摇杆的位置回归原位置 CenterPos.transform.localPosition = Vector2.zero; } } }
这里对于刚入门的朋友有必要说一下脚本中的normalized(归一化)即:当归一化后,返回向量的长度为1,当归一化后,向量保持同样的方向。
这里的所有对象用Public定义是为了在unity中更清楚的观察对象的变化,大家可以根据自己的喜好定义。NGUI的摇杆制作到这里就结束了。
二、UGUI简易摇杆制作
UGUI的场景搭建和NGUI 的大致相同,区别在于UGUI只需要直接搭建场景,如图:
场景搭建完后需要在Project中导入一个脚本
之后在给JoyStick物体上添加一个脚本(名字自起),脚本内容如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class JoyStickTest : MonoBehaviour { public GameObject centerObj;//定义出小圆盘 public float range;//范围 // Use this for initialization void Start () { centerObj = transform.Find("CenterObj").gameObject;//赋值 UIEventTrigger.Get(this.gameObject).onPointerDown = BtnEvent;//.调用uiEventTrigger.get方法 } public void BtnEvent(PointerEventData data) { StartCoroutine("Move");//调用协程Move } IEnumerator Move() { while (Input.GetMouseButton(0))//按下鼠标左键 { Vector3 mousePos = new Vector3(Input.mousePosition.x,Input.mousePosition.y,0);//鼠标的位置 Vector3 offset = mousePos - this.transform.position;//偏移量 //给小圆盘坐标赋值 if (offset.magnitude>range) { offset = offset.normalized * range; } GameObject.Find("Player").transform.position += new Vector3(offset.normalized.x, 0, offset.normalized.y) * Time.deltaTime * 5; centerObj.transform.position = this.transform.position+offset; yield return null; } //小圆盘相对坐标归零 centerObj.transform.localPosition = Vector2.zero; } // Update is called once per frame void Update () { } }
此脚本运用了协程控制,不理解的可以查询协程的使用,在此就不多解释了。
到此UGUI的虚拟摇杆制作就完成了。