相信在看本篇文章的朋友一定在做手游,做手游控制角色移动就会用到摇杆,大部分朋友应该已经了解过EasyTouch这款插件了,EasyTouch已经几乎将所有需要的操作方式都封装了,已经算是比较好用的摇杆插件了,但EasyTouch封装的方法内容较多,只是会用,但可能不能了解其原理。这里 我们一起用NGUI来实现以下摇杆的制作。
原理:在背景图片上添加Collider组件,并新建脚本组件,执行方法void OnPress 来检测是否在背景图片上有按下和抬起操作。将按钮图片作为背景图片子物体, 当OnPress为True,则按钮图片跟随鼠标移动,当OnPress为False,则按钮图片还原到中心点,通过计算按钮图片的偏移量来实现物体的移动。
代码实现如下:
背景图片上的脚本Joystick
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
using UnityEngine; using System.Collections; public class Joystick : MonoBehaviour { private bool isPress = false; Transform btnTran; GameObject player; public static float h, v; void Start (){ // btnTran为子物体按钮图片的Transform btnTran = transform.GetChild (0); player = GameObject.FindGameObjectWithTag (Tags.player); } void Update (){ PressIsTrue (); } // NGUI方法 当鼠标按下当前物体时会触发一次,松开时也会触发一次 一共触发两次 // 参数为按下或抬起的状态 void OnPress (bool press) { this.isPress = press; // 抬起时,将中心按钮坐标归0; if (isPress == false){ btnTran.localPosition = Vector2.Lerp (btnTran.localPosition, Vector2.zero, 1f); // 鼠标抬起时 将 h,v归零 h = 0; v = 0; } } // 按下时 触发此方法 void PressIsTrue (){ if (isPress) { // UICamera.lastTouchPosition 为当前鼠标按下时的坐标(Vector2类型) // 因为button中心点的坐标是Vector2(91,91), Vector2 touchPos = UICamera.lastTouchPosition - new Vector2(91, 91); // 当鼠标拖动的位置与中心位置大于75时,则固定按钮位置不会超过75。 75为背景图片半径长度 if (Vector2.Distance (touchPos, Vector2.zero) > 75) { // 按钮位置为 鼠标方向单位向量 * 75 btnTran.localPosition = touchPos.normalized * 75; } else { // 按钮位置为鼠标位置 btnTran.localPosition = touchPos; } // 按钮位置x轴 / 半径 的值为0-1的横向偏移量 h = btnTran.localPosition.x / 75; // 按钮位置y轴 / 半径 的值为0-1的纵向偏移量 v = btnTran.localPosition.y / 75; } } } |
主角身上的移动控制脚本PlayMove 获取Joystick的h,v的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using UnityEngine; using System.Collections; public class PlayerMove : MonoBehaviour { private CharacterController cc; public float speed = 5f; // Use this for initialization void Start () { cc = GetComponent <CharacterController> (); } // Update is called once per frame void Update () { // float h = Input.GetAxis ("Horizontal"); // float v = Input.GetAxis ("Vertical"); // 获取摇杆脚本的h,v的值 float h = Joystick.h; float v = Joystick.v; if (Mathf.Abs(h) > 0.1f || Mathf.Abs(v) > 0.1f) { Vector3 targetDir = new Vector3 (h, 0, v); transform.LookAt (targetDir + new Vector3 (transform.position.x, transform.position.y, transform.position.z)); cc.SimpleMove (targetDir * speed); } } } |
- 本文固定链接: http://www.u3d8.com/?p=306
- 转载请注明: 网虫虫 在 u3d8.com 发表过