【转】UGUI实现unity摇杆
http://blog.csdn.net/onafioo/article/details/46403801
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://www.winig.cc/archives/348 好久没有写文章了,最近在做项目是用的unity最新的ui系统UGUI,项目需要做一个摇杆,网上大部分都是用的插件和NGUI做的摇杆,u ...
- 【转】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 ...
随机推荐
- css构造文本
1. 1. 文本缩进text-indent:值:值为数字,最常用的数值单位是px(像素),也可以直接是百分比!text-indent:100px;text-indent:10%;2. 文本对齐text ...
- ZOJ3791 An Easy Game(DP)
给两个长n的01串s1和s2,要对s1进行k次修改,每次修改m个不同位置,问有几种方式修改成s2. 想偏了,只想到原始的01数值是不重要的,因为每个位置修改次数的奇偶性是确定的这一层.. 其实,这题只 ...
- c++ insert iterators 插入型迭代器
insert iterators 插入型迭代器 (1)front inserters 前向插入迭代器 只适用于提供有push_front()成员函数的容器,在标准程序库中这样的容器是deque和lis ...
- Nginx location 匹配规则
1. default_server: 当请求没有匹配到服务器中配置的任何一个server的时候,会默认把请求route到配置了default_server的virtual host中.参考地址:htt ...
- Xcode4 使用技巧
Xcode4 使用技巧 使用 xcode4 也有一段时间了,今天整理了一下 xcode4 的一些使用技巧,在这里分享给大家. 设置作者 这里所指的作者就是每个源文件头部注释中的 "Creat ...
- VTK 6 和 VTK 5 的不同
Overview Replacement of SetInput() with SetInputData() and SetInputConnection() Removal of GetProduc ...
- [百科] - SIP(会话发起协议)
SIP(会话发起协议)SIP是类似于HTTP的基于文本的协议.SIP可以减少应用特别是高级应用的开发时间.由于基于IP协议的SIP利用了IP网络,固定网运营商也会逐渐认识到SIP技术对于他们的深远意义 ...
- 2015寒假ACM训练计划
1月26号至3月4号 每天给自己一个计划.做有意义的事情,不要浪费时间. 8:00——11:30 acm训练 11:30——13:00 午休 13:00——17:30 acm训练 17:30——18 ...
- PHP wget 增强脱裤脚本(PDO MYSQL)
脚本参考了 LCX Gavin2位前辈的帖子.在此表示非常的感谢. https://www.t00ls.net/thread-26740-1-1.html https://www.t00ls.net/ ...
- php 上传图片
学习地址:http://www.imooc.com/video/2473 <?php header("content-type:text/html;charset=utf-8" ...