UGUI实现unity摇杆
http://www.winig.cc/archives/348
好久没有写文章了,最近在做项目是用的unity最新的ui系统UGUI,项目需要做一个摇杆,网上大部分都是用的插件和NGUI做的摇杆,unity自带的摇杆也不怎么好用,而最新的unity4.6.x来了,加入了最新的UI系统“UGUI”,那我们怎么用UGUI来制作摇杆呢~大神勿喷,本人是技术渣渣。
比较出色的摇杆插件《Easy Touch》(很强大)
还是主要讲讲我们自己怎么做。
首先在unity场景里面新建一个空物体和两个Image,把空物体放在创建Image自动生成的Canvas里面,再把两个Image放在空物体里
Image建立方式:GameObject->UI->Image 或者直接在“Hierarchy”右键然后UI->Image,看喜好。
空物体和两个Image的命名看个人喜好。
威恩的节点是这样的:
节点中的joystack是刚刚建立的空节点。
Backgound是摇杆的背景。
JoystackControl是真实的可以拖动的摇杆。
把Backgound和JoystackControl的SourceImage替换成自己喜欢的图片,并且把JoystackControl的图片缩小点,这里我就用系统自带的图片了,威恩这两个节点的inspector如下(我修改过得地方用红框标注了,其他都没改):
最终样子如下:
那么样子有了就需要让他动起来,需要三个类“EventTriggerListener”、“JoystackCc”、“PlayerMoveControl”。
EventTriggerListener:在NGUI开发的时候处理事件都会用到UIEventListener,我们已经用的习惯的不得了,而UGUI则不是这种机制,
并且我觉得这种是最合理的方式,所以自己写一套类似的。
只是一个帮助类,不需要挂在任何的游戏对象上。
JoystackCc:这是主要来控制摇杆的。
挂在JoystackControl节点上
PlayerMoveControl:这是主要来通过摇杆来控制角色的。
挂在你想控制的物体上
直接上代码,写了注释,就不哔哔了。
EventTriggerListener.cs
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; using System.Collections.Generic; /// <summary> /// UGUI事件监听类 /// </summary> public class EventTriggerListener : UnityEngine.EventSystems.EventTrigger{ publicdelegate void VoidDelegate (GameObject go); publicdelegate void VectorDelegate(GameObject go, Vector2 delta); publicVoidDelegate onClick; publicVoidDelegate onDown; publicVoidDelegate onEnter; publicVoidDelegate onExit; publicVoidDelegate onUp; publicVoidDelegate onSelect; publicVoidDelegate onUpdateSelect; publicVectorDelegate onDrag; publicVoidDelegate onDragOut; staticpublic EventTriggerListener Get (GameObject go) { if(go==null){ Debug.LogError("EventTriggerListener_go_is_NULL"); return null; } else{ EventTriggerListener listener = go.GetComponent<EventTriggerListener>(); if (listener == null) listener = go.AddComponent<EventTriggerListener>(); return listener; } } publicoverride void OnDrag(PointerEventData eventData) { if(onDrag != null) onDrag(gameObject, eventData.delta); } publicoverride void OnEndDrag(PointerEventData eventData) { if(onDragOut != null) onDragOut(gameObject); } publicoverride void OnPointerClick(PointerEventData eventData) { if(onClick !=null) onClick(gameObject); } publicoverride void OnPointerDown (PointerEventData eventData){ if(onDown !=null) onDown(gameObject); } publicoverride void OnPointerEnter (PointerEventData eventData){ if(onEnter !=null) onEnter(gameObject); } publicoverride void OnPointerExit (PointerEventData eventData){ if(onExit !=null) onExit(gameObject); } publicoverride void OnPointerUp (PointerEventData eventData){ if(onUp !=null) onUp(gameObject); } publicoverride void OnSelect (BaseEventData eventData){ if(onSelect !=null) onSelect(gameObject); } publicoverride void OnUpdateSelected (BaseEventData eventData){ if(onUpdateSelect !=null) onUpdateSelect(gameObject); } }JoystackCc.cs
using UnityEngine; using System.Collections; public class JoystackCc : MonoBehaviour { privateVector3 Origin; Transform mTrans; privateVector3 _deltaPos; privatebool _drag = false; privateVector3 deltaPosition; floatdis; [SerializeField] privatefloat MoveMaxDistance = 80; //最大拖动距离 [HideInInspector] publicVector3 FiexdMovePosiNorm; //固定8个角度移动的距离 [HideInInspector] publicVector3 MovePosiNorm; //标准化移动的距离 [SerializeField] privatefloat ActiveMoveDistance = 1; //激活移动的最低距离 voidAwake() { EventTriggerListener.Get(gameObject).onDrag = OnDrag; EventTriggerListener.Get(gameObject).onDragOut = OnDragOut; EventTriggerListener.Get(gameObject).onDown = OnMoveStart; } // Use this for initialization voidStart () { Origin = transform.localPosition;//设置原点 mTrans = transform; } // Update is called once per frame voidUpdate() { dis = Vector3.Distance(transform.localPosition, Origin);//拖动距离,这不是最大的拖动距离,是根据触摸位置算出来的 if(dis >= MoveMaxDistance) //如果大于可拖动的最大距离 { Vector3 vec = Origin + (transform.localPosition - Origin) * MoveMaxDistance / dis; //求圆上的一点:(目标点-原点) * 半径/原点到目标点的距离 transform.localPosition = vec; } if(Vector3.Distance(transform.localPosition, Origin) > ActiveMoveDistance) //距离大于激活移动的距离 { MovePosiNorm = (transform.localPosition - Origin).normalized; MovePosiNorm = new Vector3(MovePosiNorm.x, 0, MovePosiNorm.y); } else MovePosiNorm = Vector3.zero; } voidMiouseDown() { if((Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved)) { } else mTrans.localPosition = Origin; } Vector3 result; privateVector3 _checkPosition(Vector3 movePos, Vector3 _offsetPos) { result = movePos + _offsetPos; returnresult; } voidOnDrag(GameObject go, Vector2 delta) { if(!_drag) { _drag = true; } _deltaPos = delta; mTrans.localPosition +=new Vector3(_deltaPos.x, _deltaPos.y, 0); } voidOnDragOut(GameObject go) { _drag =false; mTrans.localPosition = Origin; if(PlayerMoveControl.moveEnd != null) PlayerMoveControl.moveEnd(); } voidOnMoveStart(GameObject go) { if(PlayerMoveControl.moveStart != null) PlayerMoveControl.moveStart(); } }PlayerMoveControl.cs
using UnityEngine; using System.Collections; public class PlayerMoveControl : MonoBehaviour { privateTransform _mTransform; publicJoystackCc _mJoystackCc; publicfloat moveSpeed = 50; publicdelegate void MoveDelegate(); publicstatic MoveDelegate moveEnd; publicstatic MoveDelegate moveStart; publicstatic PlayerMoveControl Instance; // Use this for initialization voidAwake() { Instance =this; _mTransform = transform; moveEnd = OnMoveEnd; moveStart = OnMoveStart; } voidStart () { } voidOnMoveEnd() { _turnBase =false; } voidOnMoveStart() { _turnBase =true; } // Update is called once per frame privatefloat angle; privatebool _turnBase = false; voidUpdate() { if(_turnBase) { Vector3 vecMove = _mJoystackCc.MovePosiNorm*Time.deltaTime*moveSpeed/10; _mTransform.localPosition+=vecMove; angle = Mathf.Atan2 (_mJoystackCc.MovePosiNorm.x, _mJoystackCc.MovePosiNorm.z) * Mathf.Rad2Deg - 10; _mTransform.localRotation = Quaternion.Euler(Vector3.up*angle); } } }建好这三个类之后,把他们绑定到相应的节点上。都挂在哪,代码上面有写
测试一下,威恩新建了一个cube来作为测试对象,加了个plane作为“伪”地面,太黑了再打个灯….
下面是测试效果:
如果有任何问题直接留言~尽自己所能帮忙解决~
UGUI实现unity摇杆的更多相关文章
- 【转】UGUI实现unity摇杆
http://blog.csdn.net/onafioo/article/details/46403801 http://www.winig.cc/archives/348 好久没有写文章了,最近在做 ...
- 【转】Unity3D学习日记(一)使用UGUI制作虚拟摇杆
http://blog.csdn.net/begonia__z/article/details/51170059 如今手机游戏玩法多种多样,尤其使用虚拟摇杆进行格斗类游戏开发或者是MMORPG成为了主 ...
- 用Unity的UGUI实现简单摇杆
1.在Canvas下新建一个空对象作为我们的摇杆,命名为Joystick. 摇杆由背景和杆两部分组成,所以在Joystick下新建一个Image作为摇杆的背景,命名为BG. 在BG下新建一个Image ...
- 【转】Unity3D学习日记(二)使用UGUI制作虚拟摇杆控制摄像机
http://blog.csdn.net/begonia__z/article/details/51178907 前天撸了一个简单的UGUI虚拟摇杆,今天我就利用前天做的虚拟摇杆做了一个简单的摄像机控 ...
- 时光煮雨 Unity3D让物体动起来③—UGUI DoTween&Unity Native2D实现
本文首发蛮牛,次发博客园.接系列 第一篇,第二篇,本文为第三篇,再次感谢“武装三藏”在前两篇无私且精彩的问题解答 写在最前,时光煮雨,为了怀念 以下引用曾今读过的一些教程文章 其实这3种动画都有它特定 ...
- unity使用UGUI创建摇杆
1.现在unity做一个项目,各种插件各种包,于是项目资源就无限变大了,其实一些简单的功能可以自己写,这里就是试着使用UGUI编写一个摇杆功能 2.脚本如下: using UnityEngine; u ...
- Unity UGUI RectTransform图解
UGUI RectTransform.Unity RectTransform详解 The first:look look API. http://docs.unity3d.com/ScriptRefe ...
- 【Unity3D基础教程】给初学者看的Unity教程(六):理解Unity的新GUI系统(UGUI)
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点推荐.谢谢! 理解UGUI的基础架构 UGUI是Unity在4 ...
- Unity3D_05_理解Unity的新GUI系统(UGUI)
理解Unity的新GUI系统(UGUI) Unity GUI 链接:UnityEngine.UI系统基础类架构图 Unity GUI 链接:UnityEngine Event & Event ...
随机推荐
- 继承的文本框控件怎么响应EN_CHANGE等消息
继承的文本框控件如何响应EN_CHANGE等消息?我从CEdit继承了一个CMyEdit类,想在这个类里填写它的一些消息.我在消息映射表里写的是MESSAGE_HANDLER(EN_CHANGE, O ...
- 怎么理解RSA算法
原文地址:http://www.ittenyear.com/414/rsa/ 怎么理解RSA算法 能够把非对称加密算法里的公钥想象成一个带锁的箱子,把私钥想象成一把钥匙 能够把对称加密算法里的密钥想象 ...
- 51NOD 1810 连续区间 分治 区间计数
1810 连续区间 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 80 区间内所有元素排序后,任意相邻两个元素值差为1的区间称为“连续区间” 如:3,1,2是连续区间,但3, ...
- 九度OJ 1098:字母统计 (计数)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3720 解决:1809 题目描述: 输入一行字符串,计算其中A-Z大写字母出现的次数 输入: 案例可能有多组,每个案例输入为一行字符串. 输 ...
- 20170228 交货单过账增强 MV50AFZ1
MV50AFZ1 这个程序里面找个FORM 用户出口, FORM USEREXIT_SAVE_DOCUMENT_PREPARE. 用户出口如下: 例:需求: 开发要求:制作交货单的人员,需要同 ...
- [2017-09-05]Abp系列——Abp后台作业系统介绍与经验分享
本系列目录:Abp介绍和经验分享-目录 什么是后台作业系统 后台作业系统即BackgroundJob,从需求上讲,是一套基础设施,允许我们定义一个作业,在未来指定的某个时间去执行. 后台作业的一般场景 ...
- 后台管理微服务(二)——docker的使用
1. docker概述 1.1 Docker是什么 Docker 是软件工业的集装箱技术 Docker 是一个容器引擎,docker提供了一套完整的容器解决方案. Docker 是一个能将开发的程序自 ...
- linux下环境搭建
1.jdk https://ivan-site.com/2012/05/download-oracle-java-jre-jdk-using-a-script/ 在linux用wget直接下载JDK ...
- 关于redis的思考
集群版本的redis主从复制 也可以实现集群 但是不是很好 集群版redis主从复制版本集群 Spring Boot整合Redi事务 Spring Boot+Redis+Ehcache实现二级缓存 S ...
- BZOJ 1621 [Usaco2008 Open]Roads Around The Farm分岔路口:分治 递归
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1621 题意: 约翰的N(1≤N≤1,000,000,000)只奶牛要出发去探索牧场四周的土 ...