UGUI实现摇杆
2015-06-29 20:34 糯米粥 阅读(1570) 评论(0) 编辑 收藏 举报效果图
立方体好比角色。可以利用右下角的摇杆控制角色移动
看看结构图
Image1:是外面圆圈
Image2:是蓝色圈
创建JoyStickScript.cs代码挂载在Image2上。这里没有实现控制立方体移动。有待改进
1 using UnityEngine; 2 using System.Collections; 3 using UnityEngine.UI; 4 using UnityEngine.EventSystems; 5 6 /// <summary> 7 /// 摇杆 8 /// </summary> 9 public class JoyStickScript : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler 10 { 11 12 GameObject Player; //移动的对象 13 14 Vector3 originPosition;//起点坐标 15 Vector3 newPosition; 16 public float Radius = 40; //滚动的最大半径 17 float horizontal; 18 float vertical; 19 float speed; 20 void Awake() 21 { 22 Player = GameObject.FindWithTag("Player"); 23 } 24 25 // Use this for initialization 26 void Start() 27 { 28 //originPosition = transform.position;//记录原点位置 29 } 30 31 // Update is called once per frame 32 void Update() 33 { 34 //float horizontal = Input.GetAxis("Horizontal"); 35 //float veritcal = (transform.position.y - originPosition.y) / Radius; 36 //vertical = (transform.position.y - originPosition.y) / Radius; 37 //horizontal = (transform.position.x - originPosition.x) / Radius; 38 //Player.transform.Translate(horizontal, vertical, 0); 39 //Debug.Log(vertical); 40 41 } 42 43 public void OnEndDrag(PointerEventData eventData) 44 { 45 transform.position = originPosition; //归位到原点 46 } 47 48 Vector3 dir; 49 public void OnDrag(PointerEventData eventData) 50 { 51 52 dir = (Input.mousePosition - originPosition).normalized; 53 54 transform.position = Input.mousePosition; //设置当前摇杆位置 55 56 //当超过了外面的圆圈 57 if (Vector3.Distance(Input.mousePosition, originPosition) > Radius) 58 transform.position = originPosition + dir * Radius; 59 60 //vertical = (transform.position.y - originPosition.y) / Radius; 61 //horizontal = (transform.position.x - originPosition.x) / Radius; 62 print(originPosition + dir * Radius); 63 Player.transform.position = dir * Time.deltaTime; 64 } 65 66 public void OnBeginDrag(PointerEventData eventData) 67 { 68 originPosition = transform.position;//记录原点位置 69 } 70 }
-------------------分割线 实现摇杆控制角色移动---------------------------------------
joystack是空对象
backgound是背景
JoystackControl是中间滚动虚拟轴
JoystackCc.cs代码挂载在JoystackControl上
1 using UnityEngine; 2 using System.Collections; 3 using UnityEngine.EventSystems; 4 /// <summary> 5 /// 这是主要来控制摇杆的。 6 /// </summary> 7 public class JoystackCc : MonoBehaviour 8 , IBeginDragHandler, IDragHandler, IEndDragHandler 9 { 10 11 public Vector3 originPosition;//起点坐标 12 public float speed = 2f;//角色移动速度 13 public float Radius = 40; //滚动的最大半径 14 Vector3 dir; //滚动的方向 15 16 17 public Vector3 MovePosiNorm; //标准化移动的距离 18 // Use this for initialization 19 void Start() 20 { 21 22 } 23 24 // Update is called once per frame 25 void Update() 26 { 27 28 } 29 30 public void OnBeginDrag(PointerEventData eventData) 31 { 32 originPosition = transform.position; 33 } 34 35 public void OnDrag(PointerEventData eventData) 36 { 37 //获取当前鼠标或者触摸算出拖动距离 38 dir = (Input.mousePosition - originPosition).normalized; 39 40 //拖到滚轮跟着鼠标走 41 transform.position = Input.mousePosition; 42 43 44 //originPosition = transform.position; 45 46 //如果滚轮范围超过了外面的大圆 即大于可拖动距离 47 if (Vector3.Distance(originPosition, Input.mousePosition) > Radius) 48 { 49 transform.position = originPosition + dir * Radius; 50 } 51 52 if (Vector3.Distance(transform.position, originPosition) > 1) //距离大于激活移动的距离 53 { 54 MovePosiNorm = (transform.position - originPosition).normalized; 55 MovePosiNorm = new Vector3(MovePosiNorm.x, 0, MovePosiNorm.y); 56 } 57 else 58 MovePosiNorm = Vector3.zero; 59 60 61 PlayerMoveControl.moveStart(); 62 } 63 64 public void OnEndDrag(PointerEventData eventData) 65 { 66 transform.position = originPosition; 67 PlayerMoveControl.moveEnd(); 68 } 69 }
PlayerMoveControl.cs代码挂载在角色上
1 using UnityEngine; 2 using System.Collections; 3 4 /// <summary> 5 /// 控制玩家移动 6 /// </summary> 7 public class PlayerMoveControl : MonoBehaviour 8 { 9 10 private Transform _mTransform; 11 public JoystackCc _mJoystackCc; 12 13 public delegate void MoveDelegate(); 14 public static PlayerMoveControl Instance; 15 public static MoveDelegate moveStart; 16 public static MoveDelegate moveEnd; 17 18 private float angle; 19 private bool _turnBase = false; 20 void Awake() 21 { 22 Instance = this; 23 24 _mTransform = transform; 25 moveStart = OnMoveStart; 26 moveEnd = OnMoveEnd; 27 } 28 29 void OnMoveStart() 30 { 31 _turnBase = true; 32 } 33 void OnMoveEnd() 34 { 35 _turnBase = false; 36 } 37 38 39 // Use this for initialization 40 void Start() 41 { 42 43 } 44 45 // Update is called once per frame 46 void Update() 47 { 48 if (_turnBase) 49 { 50 Vector3 vecMove = _mJoystackCc.MovePosiNorm * Time.deltaTime; 51 52 _mTransform.position += vecMove; 53 54 //把弧度转为角度 55 angle = Mathf.Atan2(_mJoystackCc.MovePosiNorm.x, _mJoystackCc.MovePosiNorm.z) * Mathf.Rad2Deg; 56 57 transform.rotation = Quaternion.Euler(Vector3.up * angle); 58 59 } 60 } 61 }
为了让相机跟随角色,
写个脚本挂载在相机上
1 using UnityEngine; 2 using System.Collections; 3 4 public class yid : MonoBehaviour 5 { 6 7 Vector3 offset; //角色与相机之间的偏移量 8 public Transform target; //需要跟踪的角色 9 10 // Use this for initialization 11 void Start() 12 { 13 //offset = transform.position - target.position; 14 15 offset = target.position - transform.position; 16 } 17 18 // Update is called once per frame 19 void Update() 20 { 21 transform.position = target.position - offset; 22 } 23 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?