最近在研究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