纯净的 Unity Touch JoyStick

最近在研究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,有些东西是自己理解的,有错误可以指正。

时间: 2024-12-25 02:51:24

纯净的 Unity Touch JoyStick的相关文章

Unity -Touch的那些坑

Touch.position 是 一个 像素坐标(手机左下角为(0,0)) Touch.phase {Began,Moved,Stationary,Canceled,Ended} 代表 手指点击的状态,每次点击Input.touches[] 数组加一个Touch实例,记录手指的状态信息,当有一个手指退出屏幕,那么数组中的位置产生一个空缺,当有新手指加入时候,新手指将替代刚刚退出的手指在数组中的位置.记得在手指退出屏幕时候,将手指所绑定的跟踪信息重新初始化. Physics2D.Raycast(需

touch pointer

在早期的浏览器,输入的事件其实相对单纯,只有考虑到鼠标和键盘两种:而当时的鼠标事件,其实就是 click.mousedown.mouseup 等等的事件.但是当手机.平板开始流行时候,再移动装置上的主要操作界面,已经从鼠标变成是触控了- 由于触控和鼠标的操作逻辑,算是有根本上的差异的,再加上大部分的装置又支持多点触控,所以虽然浏览器大多会把触控的事件对应回传统的鼠标事件,但是如果希望能有更细致的操作,传统的鼠标事件是不够用的. 而目前 W3C 针对触控操作的部分,则有两种事件模型可以使用,其中一

What&#39;s new in Horizon 6 with View

It’s a major release this time, Horizon 6.0 is out.  You can get to the downloads here.  As always, here’s the What’s New from the release notes: This release of View delivers a number of important new features and enhancements. Hosted Apps and Deskt

部署VDI虚拟桌面带来的改变

部署VDI带来的改变 部署虚拟桌面基础设施之后,员工和IT管理员都会遇到很多方面的变化.不只是员工需要适应新的环境,管理员也需要解决新工具的整体转换问题以及熟悉如何管理虚拟桌面的使用. 部署VDI的一个主要原因就是用户体验.将桌面按照需求交付给用户,而不会受到用户所在位置和使用设备的限制.不论通过View Client.Citrix Receiver.微软远程桌面服务还是其他方式,VDI都可以在恰当的时间将恰当的桌面交付给恰当的用户.事实上,对于用户和IT部门来说,一个积极的主要变化是:更少的停

浏览器的统一指针事件:Pointer Event

在早期的浏览器,输入的事件其实相对单纯,只有考虑到鼠标和键盘两种:而当时的鼠标事件,其实就是 click.mousedown.mouseup 等等的事件.但是当手机.平板开始流行时候,再移动装置上的主要操作界面,已经从鼠标变成是触控了- 由于触控和鼠标的操作逻辑,算是有根本上的差异的,再加上大部分的装置又支持多点触控,所以虽然浏览器大多会把触控的事件对应回传统的鼠标事件,但是如果希望能有更细致的操作,传统的鼠标事件是不够用的. 而目前 W3C 针对触控操作的部分,则有两种事件模型可以使用,其中一

Unity手游之路&lt;六&gt;游戏摇杆之Easy Touch 3教程

之前已经介绍过Unity自带的摇杆Joystick,它用起来很简单.但是它也存在很多局限,不能全部满足普通mmo手游的一些需求,例如:要能方便地更好素材:能指定在某个区域显示,或者只有在该区域触摸时才出现等等.而这些功能,Easy Touch插件都已经帮你实现了.全部是可配置.大家可以从Asset Store上购买,或者使用free版. (可随意分享,请注明原文出处http://blog.csdn.net/janeky/article/details/17364903) 实例 还是用上次例子来实

Unity-EasyTouch插件之ReservedArea的运用(主要是避免JoyStick与Touch的矛盾)

昨天有人问我,easytouch插件中有个小bug,其实也不算是bug,插件的设计者早就考虑到这样的情况. 他说同时用easyjoystick和easytouch会发生,移动摇杆的时候,touch(触摸)也会触发,也就是说两者同时产生事件. 那么,该如何处理呢.设计者早就知道会发生如此情况,所以他运用ReservedArea(保留区). 什么意思,也就是joystick是个摇杆,那么他肯定存在触发事情的区域. 那么这个触发事件的区域,他都会加到保留区里面. 我不小心进到了easyjoystick

unity 3d-Easy Touch 3教程 转

Easy Touch 教程 转自:http://www.unitymanual.com/thread-31332-1-1.html 1.import “Easy Touch 3”的资源包 2.创建人物模型 3.创建地形 4.添加一个Joystick的实例 :Hedgehog Team->Easy Touch->Extensions->Add a new Joystick.这时我们可以看到它在左下角出来 5.设置摇杆的相关的参数,详见下图 6.新建一个脚本MoveController.cs

25.Unity3D手机中Input类touch详解-Unity触屏事件解析到底(Twisted Fate)

首先贴一下Unity支持的模型文件类型,以前没有收集过. Unity支持两种类型的3D文件格式: 1.  通用的"出口型"3D文件 如.fbx..dae..3ds..dxf..obj等文件格式. 2.  3D软件专用的3D文件格式 如Max, Maya, Blender,Cinema4D, Modo, Lightwave & Cheetah3D 等软件所支持的格式,如.MAX, .MB, .MA等等. Unity3D手机中Input类touch详解: 1.Input.touch