码迷,mamicode.com
首页 > 编程语言 > 详细

纯净的 Unity Touch JoyStick

时间:2015-12-23 01:49:36      阅读:742      评论:0      收藏:0      [点我收藏+]

标签:

最近在研究Unity3D,把研究过程中遇到的问题记录下来作为备份,以后再用到相关知识的时候能够借鉴。
最近有一个构思,想做一款小型的练手游戏,边做边学Unity3D。因为是3D游戏,由Joystick控制,因此先研究这里。旨在找出一种纯净的写法,方便以后的扩展。

现在的Unity版本是5.3.0,研究了下较火的EasyTouch 4.2.2。总结下来发现现在应用最多的似乎还是EasyTouch v2 或 v3,到了4反倒是代码相互关联,不好提取。

下面这些是用UGUI开发制作的简单JoyStick,提供JoyStick的 moveVector(滑动方向),接口比较清晰,下面开始。

 


先通过UGUI制作下列结构,分别是底图(BackgroundImage)和摇杆(JoystickImage)。

技术分享

调整界面上的位置至你喜欢的地方,调整颜色如下。

技术分享

接下来写JoyStick的方法。

 

 1 using UnityEngine;
 2 using System.Collections;
 3 using UnityEngine.UI;
 4 using UnityEngine.EventSystems;
 5 
 6 public class Joystick : MonoBehaviour, IDragHandler, IPointerUpHandler, IPointerDownHandler          //继承这些接口,检测拖拽、点击等操作
 7 {
 8     private Image bgImg;
 9     private Image joystickImg;
10     private Vector3 inputVector;
11 
12     private void Start()  
13     {
14         bgImg = GetComponent<Image>();
15         joystickImg = transform.GetChild(0).GetComponent<Image>();
16     }
17 
18     public virtual void OnDrag(PointerEventData eventData)
19     {
20         Vector2 pos;
21         if (RectTransformUtility.ScreenPointToLocalPointInRectangle(bgImg.rectTransform, eventData.position, //将当前点击位置换算成相对于摇杆(joystickImg)的位置 
22             eventData.pressEventCamera, out pos))
23         {
24 
25             pos.x = (pos.x / bgImg.rectTransform.sizeDelta.x);
26             pos.y = (pos.y / bgImg.rectTransform.sizeDelta.y);
27 
28             inputVector = new Vector3(pos.x * 2, 0, pos.y * 2);
29             inputVector = (inputVector.magnitude > 1.0f) ? inputVector.normalized : inputVector;        //进行一些标准化处理,此时的inputVector为(-1,1)的标准化向量
30 
31             //Move Joystick IMG
32             joystickImg.rectTransform.anchoredPosition = new Vector3(                        //实现点击位置,摇杆(joystick)的移动。其中参数可自调
33                 inputVector.x * (bgImg.rectTransform.sizeDelta.x / 2),
34                 inputVector.z * (bgImg.rectTransform.sizeDelta.y / 2));
35 
36             Debug.Log(inputVector);
37         }
38     }
39 
40     public virtual void OnPointerUp(PointerEventData eventData)                            //手指抬起后,摇杆(joystick)归零
41     {
42         inputVector = Vector3.zero;
43         joystickImg.rectTransform.anchoredPosition = Vector3.zero;
44     }
45 
46     public void OnPointerDown(PointerEventData eventData)
47     {
48         OnDrag(eventData);
49     }
50 
51     public float Horizontal()                                                //返回x,提供接口,其中GetAxis为跨平台提供接口
52     {
53         if (inputVector.x != 0)
54             return inputVector.x;
55         else
56             return Input.GetAxis("Horizontal");
57     }
58 
59     public float Vertical()                                                 //返回z,提供接口
60     {
61         if (inputVector.z != 0)
62             return inputVector.z;
63         else
64             return Input.GetAxis("Vertical");
65     }
66 }

 

将脚本拖至BackgroundImage上,可存为prefab。

接下来说说如何使用,实现物体在平面上运动的效果。

首先创建一个100*100的Cube场地,创建一个Sphere作为精灵。

创建BallMove脚本如下:

 

 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class BallMove : MonoBehaviour
 5 {
 6     public float moveSpeed = 10.0f;
 7     public Vector3 MoveVector { set; get; }
 8     public Joystick joystick;
 9 
10     void Update()
11     {
12         MoveVector = PoolInput();
13         Move();
14     }
15 
16     private void Move()
17     {
19         transform.position = transform.position + MoveVector*moveSpeed*Time.deltaTime;
20     }
21 
22     private Vector3 PoolInput()
23     {
24         Vector3 dir = Vector3.zero;
25 
26         dir.x = joystick.Horizontal();
27         dir.z = joystick.Vertical();
28 
29         return dir;
31     }
32 }

 

脚本很简单,就不多说了。总之从Joystick中拿出标准化向量,moveVector,如何处理就可以自己扩展了。
将脚本拖到目标物体上就可以了。

今天就到这儿了,刚接触Unity,有些东西是自己理解的,有错误可以指正。

 

纯净的 Unity Touch JoyStick

标签:

原文地址:http://www.cnblogs.com/TonyChan3/p/5068613.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!